인생을 코딩하다.

[Spring] Spring Boot 시작 및 기초 본문

Spring

[Spring] Spring Boot 시작 및 기초

Hyung1 2020. 9. 20. 00:17
728x90
반응형

필자는 과거에 한 것이라 STS로 했지만,

STS말고 인텔리제이로 하시는 것을 추천드립니다.

학생분들은 인텔리제이가 무료이기도 하고, 또 인텔리제이가 훨씬 편합니다.(자동완성, 설정 등 여러면에서)

인텔리제이를 기반으로 이 포스팅을 보셔도 따라하거나 이해하는데 전혀 지장없습니다.

이 글은 Maven이고 요즘은 gradle로 넘어가는 추세입니다.

1. hello1 프로젝트

1) 프로젝트 생성

STS의 메뉴: File - New - Spring Starter Project

 

Name: hello1

Packaing: War

Package: net.skhu

 

Spring Boot Version: 가급적 위 버전과 가장 가까운 2.x.x 버전을 선택하자.
spring boot가 계속 버전 업이 되면서, 호환성 문제가 발생하기도 한다.


Spring Boot DevTools, Spring Web 체크


이 예제에서는 데이터베이스 연결을 하지 않을 것이기 때문에,
데이터베이스 항목들을 체크하지 않았다.


Spring Web 항목:
Spring Web MVC


Spring Boot DevTools 항목:
프로젝트를 실행할 때, 프로젝트를 재시작하지 않아도 수정된 소스 코드가 실행에 즉시 반영될 수 있도록 해주는 개발 도구

 

2) pom.xml 파일 수정

<dependency>
	<groupId>jstl</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>

pom.xml 파일의 dependencies 태그에 위 내용을 추가하자.

pom.xml 파일은 maven의 설정 파일

추가된 maven dependency 항목은 다음과 같은 라이브러리를 프로젝트에 포함하기 위함이다.

 

JSTL
JSTL 확장 태그를 사용하기 위해 필요한 라이브러리
<c:forEach> <c:if>


tomcat-embed-jasper

스프링 부트 앱에는 톰캣 서버가 내장되어 있다.
톰캣 서버는 servlet container 이다.
톰캣 서버는 servlet을 실행하는 서버이다.
톰캣에서 JSP 파일이 실행되는 것은, 먼저 JSP 파일이 servlet이로 변환(컴파일)된 후 실행된다.


tomcat-embed-jasper는 JSP 파일을 servlet으로 변환하는 컴파일러이다.
스프링 부트 앱에 내장된 톰캣 서버에는 tomcat-embed-jasper가 내장되어 있지 않다.
이 것을 프로젝트에 추가하지 않고 실행하면,
JSP 파일이 실행되지 않고, 웹브라우저에서 다운로드 될 것이다.
톰캣은 servlet만 실행할뿐, 다른 파일들은 웹브라우저로 그대로 전송하기 때문이다.

 

3) application.properties

src/main/resources/application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.port=8088

스프링 부트의 설정 파일

뷰 파일의 위치에 대한 설정만 포함한다.

spring.mvc.view.prefix=/WEB-INF/views/ -> 뷰 파일 위치

spring.mvc.view.suffix=.jsp  -> 뷰 파일의 확장자

내장된 톰캣 서버가 실행될 포트 디폴트 포트는 8080인데,

8080 포트를 사용하는 다른 서버와 충돌이 발생할 확률이 높다.
8088 포트로 변경하자.

server.portserver.port  -> 톰캣 서버가 사용할 포트 번호

 

포트 충돌 에러
포트 번호 변경하지 않고 hello1 프로젝트를 실행하는 경우에,
8080 포트를 이미 다른 서버가 사용하고 있다면, 다음과 같은 포트 충돌 에러가 발생한다.

8080 포트가 이미 사용중이라는 에러 발생.

 

4) HomeController.java

src/main/java/net/skhu/HomeController.java

package net.skhu;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

	 @RequestMapping("/")
	 public String index(Model model) {
 		model.addAttribute("message", "좋은 아침");
 		return "index";
	 }
}

5) index.jsp

src/main/webapp/WEB-INF/views/index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>안녕하세요</h1>
<h3>${ message }</h3>
</body>
</html>

6) 실행

서버 종료하기

hello1 프로젝트에는 tomcat 서버가 내장되어 있기 때문에, 외부 서버가 필요 없다.

(pom.xml 파일에서 tomcat-embed-jasper 항목을 참고하라.)

 

서버를 종료하자.

 

1번이나 2번 버튼을 활성화되어 있다면, 서버가 실행 상태라는 것을 의미한다.

버튼을 클릭하여 서버를 종료하자.

 

Spring Boot App 실행

STS 화면 왼쪽의 Project Explorer에서 hello1 프로젝트 명을 선택하고

Run - Run As - Spring Boot App 메뉴 클릭

콘솔 창의 출력이 위와 같다면, Spring boot app이 잘 실행된 것이다.

 

웹브라우저를 열어서 http://localhost:8088 URL을 실행하자.

2. hello1 프로젝트 수정
수정된 소스코드가 얼마나 빨리 실행되는지 확인해 보자.

 

HelloController.java 수정

src/main/java/net/skhu/HelloController.java

 

package net.skhu;

import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

 	@RequestMapping("/")
	 public String index(Model model) {
 			model.addAttribute("message", "좋은 아침");
		    model.addAttribute("now", new Date());
 			return "index";
 	}
}

2) index.jsp 수정

src/main/webapp/WEB-INF/views/index.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>안녕하세요</h1>
<h3>${ message }</h3>
<h3><fmt:formatDate pattern = "yyyy-MM-dd HH:mm:ss" value = "${ now }" /></h3>
</body>
</html>

3) 실행

웹브라우저를 새로고침하자.

수정된 내용이 꽤 빨리 반영된다.

 

3. hello1.war 파일 생성

개발할 때는 STS에서 실행하면 되지만, 개발이 끝난 후 서버에 설치하여 실행하려면

hello1.war 파일을 생성(빌드)해야 한다.

 

hello1 프로젝트에는 tomcat이 내장되어 있기 때문에,

tomcat 없이 실행 가능하다.

실행 가능한 war 파일을 생성하여 실행해 보자.

 

메뉴: Run - Run As - Maven build

 

이 메뉴를 처음 실행할 경우에는, 필요한 SW들을 다운로드해야 하기 때문에, 오랜 시간이 소요된다.

Build Success를 확인하자.

 

생성된 war 파일은 hello1 프로젝트 폴더 아래에 target/hello1-0.0.1-SNAPSHBOT.war 파일이다.

 

생성되는 war 파일 이름 설정.

hello1-0.0.1-SNAPSHBOT.war 이름이 너무 길기 때문에 불편하다.

빌드 결과 생성되는 파일 이름이 hello1.war 되도록 수정하자.

 

pom.xml 파일 수정

<build>
 <finalName>hello1</finalName>
 ....
</build>

다시 빌드하자

메뉴: Run - Run As - Maven build

Goals: package

 

생성된 war 파일은 hello1 프로젝트 폴더 아래에 target/hello1.war 파일이다.

 

4. 명령 프롬프트에서 실행

명령 프롬프트에서 다음 명령을 실행하자.

java -jar hello1.war

java -jar hello1.war

위 명령에 의해서, hello1.war에 내장된 tomcat 서버가 실행되고,

tomcat 서버 위에 hello1 프로젝트가 실행된다.

 

웹브라우저에서 확인하자.

 

5. tomcat 서버에서 hello1.war 실행

앞에서 생성한 hello1.wartomcat 서버에서 실행할 수도 있다.

 

1) tomcat 다운로드

tomcat 서버가 없다며 먼저 tomcat을 설치하자.

 

http://tomcat.apache.org/

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. The Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket specifications ar

tomcat.apache.org

 

Windows Service Installer 설치파일을 다운로드하여 실행하면

Windows 서비스 형태로 tomcat이 설치된다.

컴퓨터를 재부팅해도 Windows 서비스는 자동으로 시작되니 편리하다.

 

2) tomcat 설치

다운로드 받은 설치 파일(apache-tomcat-9.0.37.exe)을 실행하여 설치하자.

기본 옵션으로 설치해도 충분하다.

 

 

시작 유형을 "자동"으로 선택하면, 재부팅될 때 자동으로 시작된다.

 

"시작", "중지" 버튼을 클릭하여 tomcat을 시작/정지 시킬 수 있다.

 

3) tomcat 실행 확인

http://localhost:8080

주의사항:

tomcat이 실행 중일 때, STS에서 프로젝트를 또 실행하면, 8080 포트 충돌 에러가 발생한다. STS에서 서버나 프로젝트가 실행중일 때, tomcat을 또 실행하면, 8080 포트 충돌 에러가 발생한다.

 

 

tomcat 폴더 아래의 webapps 폴더에 hello1.war 파일을 복사하기만 하면 설치 끝이다.

 

http://localhost:8080/hello1 URL을 실행하자.

tomcat 서버에서 실행할 경우에는, 변경된 포트 번호가 8088 이 아니고,

tomcat 이 사용하는 8080 포트이어야 한다.

http://localhost:8080/hello1

 

5) hello1.war 설치 제거

tomcat 폴더 아래의 webapps 폴더에 hello1.war 파일을 삭제하면 된다

 

6. 정적 파일

Spring Boot App 프로젝트에서 정적 파일들은 (*.css, *.js)

src/main/resources/static 폴더에 위치해야 한다.

 

 

1) common.css

src/main/resources/static/common.css

h1 { color: red }

2) common.js

$(function() {
	$("h1").click(function() {
		alert("clicked");
	})
})

3) index.jsp 수정

src/main/webapp/WEB-INF/views/index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<link href="common.css" rel="stylesheet">
<script src="common.js"></script>
</head>
<body>
<h1>안녕하세요</h1>
<h3>${ message }</h3>
<h3><fmt:formatDate pattern = "yyyy-MM-dd HH:mm:ss" value = "${ now }" /></h3>
</body>
</html>

4) 실행

h1 태그를 클릭하면, alert 대화상자가 나타난다

 

7. context path

hello1 프로젝트에 내장된 tomcat 서버에서 실행할 때 URL은 다음과 같다.

http://localhost:8088

 

hello1 프로젝트를 tomcat 서버에 설치(배포)하고 실행할 때 URL은 다음과 같다.

http://localhost:8080/hello1

 

tomcat 서버에 프로젝트를(서버 애플리케이션을) 여러 개 설치하는 경우에,

각각의 이름을 구분할 수 있어야 한다.

tomcat 서버에 설치된 프로젝트(서버 애플리케이션)의 이름을 context path 혹은 context name 이라고 부른다.

보통 프로젝트 이름이 context path가 된다.

http://localhost:8080/hello1 URL에서 /hello1 부분이 context path 이다.

 

프로젝트에 내장된 tomcat 서버에서 실행할 때는,

이름을 구별할 다른 서버 애플리케이션이 있지 않으므로

context path 값이 / 로 지정되고,

그래서 URLhttp://localhost:8080/ 이거나 http://localhost:8080 이다.

 

URL에서 context path 값은

프로젝트 이름이거나 (http://localhost:8080/hello1)

/ 이다. (http://localhost:8088)

 

context path를 변경하려면,

Project - Properties 메뉴 - Web Project Settings - Context root 값 변경

 

 

8. Spring Web MVC

 

1) 컨트롤러 클래스

 

HomeController.java

package net.skhu;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

 	@RequestMapping("/")
 	public String index(Model model) {
 		model.addAttribute("message", "좋은 아침");
 		return "index";
 	}
}

컨트롤러 클래스는 웹브라우저의 URL 요청을 받아서, 웹서버에서 실행되는 자바 클래스이다.

웹브라우저가 웹서버에 어떤 URL을 요청을 하면, URL에 해당하는 컨트롤러의 메소드가 자동으로 호출되어 실

행된다.

 

@Controller

컨트롤러 클래스에 이 어노테이션(annotation)을 붙여주어야 한다.

이것을 붙여주지 않으면 컨트롤러 클래스가 실행되지 않는다.

 

액션 메소드

웹브라우저가 어떤 URL을 웹서버에 요청하면, 그 요청된 URL에 해당하는 컨트롤러의 어떤 메소드가 자동으로 호

출된다. 이렇게 웹브라우저의 요청에 의해서 자동으로 호출되는 컨트롤러의 메소드를 액션 메소드라고 부른다.

 

@RequestMapping 어노테이션과 액션 메소드 URL

액션 메소드에 붙은 @RequestMapping("/") 어노테이션의 "/" 부분은

그 액션 메소드를 호출하기 위한 URL 이다.

"/" URLcontext path를 의미한다.

 

http://localhost:8080/hello1 URL을 웹브라우저가 웹서버에 요청하면,

웹서버에서 HomeController 컨트롤러 클래스의 index 액션 메소드가 자동으로 호출되어 실행된다.

 

자동으로 호출할 액션 메소드를 찾을 때 컨트롤러 클래스 이름이나 액션 메소드의 이름은 상관 없고,

@RequestMapping 어노테이션에 등록된 URL만 일치하면 된다.

 

컨트롤러 액션 메소드의 리턴 값

컨트롤러의 액션 메소드는 문자열을 리턴한다.

컨트롤러의 액션 메소드가 리턴하는 문자열은, (View) 파일의 이름이다.

컨트롤러의 액션 메소드가 리턴된 후, 뷰 파일이 실행된다.

액션 메소드가 리턴한 이름의 뷰 파일이 실행된다.

 

Model 객체

public String index(Model model) {

public String index(Model model) {

컨트롤러의 액션 메소드는 Spring Web MVC 엔진에 의해서 호출된다.

대부분의 액션 메소드의 파라미터에 Model model 객체가 포함된다.

컨트롤러의 액션 메소드가 뷰 파일에 전달할 데이터를, Model 객체에 넣어서 전달한다.

Model 객체는, 데이터 전달 상자라고 보면 된다.

model.addAttribute("message", "좋은 아침");

model.addAttribute("message", "좋은 아침");

뷰 파일에 전달할 데이터를 Model 객체에 넣는 코드이다.

전달되는 데이터의 이름은 "message" 이고, 값은 "좋은 아침" 문자열이다.

 

이렇게 전달된 문자열을 뷰 파일에서 출력하는 코드는 아래와 같다.

${ message }

 

 

728x90
반응형
Comments