Spring - 환경설정

<스프링 인 액션>을 읽으면서 정리

Posted by Yan on July 10, 2021

스프링 프로젝트 시작하기

  • 기본적으로 프로젝트 위저드는 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/javaartifact명 + Application : 스프링 부트 메인 클래스
  • application.properties : 구성 속성을 지정할 수 있는 파일
  • static : 브라우저에 제공할 정적인 콘텐츠(이미지, css, javascript)를 넣는 폴더
  • templates : 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더. Thymeleaf템플릿의 위치다
  • src/test/javaartifact명 + 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의존성을 나타낸다
  • 해당 의존성 항목들은 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용한다
    장점
  1. 우리가 필요로 하는 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 훨씬 작아지고 관리하기 쉬워진다.
  2. 라이브러리 이름이 아닌 기능의 관점으로 의존성을 생각할 수 있다. 만일 웹 애플리케이션을 개발한다면 라이브러리들을 일일이 지정하는 대신에 여기에서 웹 스타터 의존성만 추가하면 된다.
  3. 라이브러리 버전들을 신경쓰지 않아도 된다. 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되므로 사용하려는 스프링 부트의 버전만 신경쓰면 된다.

스프링 부트 플러그인이 필요한 이유

  • 메이븐을 사용하는 애플리케이션을 실행할 수 있게 해준다.
  • 의존성에 지정된 모든 라이브러리가 실행 가능한 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는 교체를 수행하는 Thymeleaf namespace속성이다.
  • ${} 연산자는 요청 속성의 값을 사용하라는 것을 알려준다.

애플리케이션의 부트스트랩(구동)

  • 실행 가능한 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을 결합한 것이다

  1. @SpringBootConfiguration : 현재 클래스를 구성 클래스로 지정한다. -> @Configuration애노테이션의 특화된 형태
  2. @EnableAutoConfiguration : 스프링 부트 자동 구성을 활성화한다. 우리가 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려주는 역할이다.
  3. @ComponentScan : 컴포넌트 검색을 활성화한다. @Component, @Controller, @Service 등의 annotation과 함께 클래스를 선언할 수 있게 해준다. 스프링은 자동으로 그런 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록한다.