스프링 프로젝트 시작하기
- 기본적으로 프로젝트 위저드는
https://start.spring.io
의 스프링 Initializr를 호출하여 프로젝트를 생성한다
스프링 프로젝트 구조
src/main/java
: 애플리케이션 소스 코드src/test/java
: 테스트 코드src/main/resources
: 자바 리소스가 아닌 것mvnw
,mvnw.cmd
: maven wrapper script - 메이븐이 각자 컴퓨터에 설치되어 있지 않아도 이 스크립트를 사용하여 프로젝트를 빌드할 수 있다.pom.xml
: maven field 명세(우리 프로젝트를 빌드할 때 필요한 정보)룰 지정한 파일src/main/java
의artifact명 + Application
: 스프링 부트 메인 클래스application.properties
: 구성 속성을 지정할 수 있는 파일static
: 브라우저에 제공할 정적인 콘텐츠(이미지, css, javascript)를 넣는 폴더templates
: 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더.Thymeleaf
템플릿의 위치다src/test/java
의artifact명 + Application + Test
: 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스
pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version> <!-- 부모 POM으로 spring-boot-starter-parent를 갖는다는 것을 의마한다. 부모 POM은 여러 라이브러리들의 의존성관리를 제공한다 -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>kr.ac.kopo03</groupId>
<artifactId>board</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>board</name>
<description>SpringBoard</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <!-- starter라는 단어를 포함하고 있음-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 스프링 부트 플러그인이 지정된다-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
starter의 의미
- 스프링 부트 starter의존성을 나타낸다
- 해당 의존성 항목들은 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용한다
장점
- 우리가 필요로 하는 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 훨씬 작아지고 관리하기 쉬워진다.
- 라이브러리 이름이 아닌 기능의 관점으로 의존성을 생각할 수 있다. 만일 웹 애플리케이션을 개발한다면 라이브러리들을 일일이 지정하는 대신에 여기에서 웹 스타터 의존성만 추가하면 된다.
- 라이브러리 버전들을 신경쓰지 않아도 된다. 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되므로 사용하려는 스프링 부트의 버전만 신경쓰면 된다.
스프링 부트 플러그인이 필요한 이유
- 메이븐을 사용하는 애플리케이션을 실행할 수 있게 해준다.
- 의존성에 지정된 모든 라이브러리가 실행 가능한 JAR포함되어 있는지, 그리고 런타임 시에 classpath에서 찾을 수 있는지 확인한다.
- 실행가능 JAR파일의 메인 클래스로 부트스트랩 클래스를 나타내는 매니페스트 파일을 JAR 파일에서 생성한다.
Thymeleaf
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 이렇게 하면 스프링 부트의 자동-구성에서 런타임 시에 classpath의 Thymeleaf를 찾아 빈을 자동 생성한다.
- Thymeleaf와 같은 뷰 라이브러리들은 어떤 웹 프레임워크와도 사용 가능하도록 설계되었다.
- 스프링의 추상화 모델을 알지 못하며, 컨트롤러가 데이터를 넣는
Model
대신 서블릿 요청 속성들을 사용한다. - 그런 뷰에게 요청을 전달하기 앞서 스프링은
Thymeleaf
와 이외의 다른 뷰 템플릿이 사용하는 요청 속성에 모델 데이터를 복사한다.
1
<p th:text="${message}">placehoder message</p>
- 몸체는 key가 “message”인 서블릿 요청 속성 값으로 교체된다.
th:text
는 교체를 수행하는 Thymeleafnamespace
속성이다.${}
연산자는 요청 속성의 값을 사용하라는 것을 알려준다.
애플리케이션의 부트스트랩(구동)
- 실행 가능한 JAR파일에서 애플리케이션을 실행하므로, 제일 먼저 시작되는 부트스트랩 클래스가 있어야한다.
- 애플리케이션을 부트스트랩하기 위한 최소한의 스프링 구성도 있어야 한다.
1
2
3
4
5
6
7
8
@SpringBootApplication
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
@SpringBootApplication은 세개의 annotation을 결합한 것이다
@SpringBootConfiguration
: 현재 클래스를 구성 클래스로 지정한다. ->@Configuration
애노테이션의 특화된 형태@EnableAutoConfiguration
: 스프링 부트 자동 구성을 활성화한다. 우리가 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려주는 역할이다.@ComponentScan
: 컴포넌트 검색을 활성화한다.@Component
,@Controller
,@Service
등의 annotation과 함께 클래스를 선언할 수 있게 해준다. 스프링은 자동으로 그런 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록한다.