Spring boot 개발하기
부트스트래핑
신발끈을 묶는다 개념이 생소하지만 괜찮은 이름인것 같기도 함 ㅋㅋ
Spring Initializer를 이용해서 생성된 기본 소스코드는 아래처럼 구성됨.
# 자바 클래스
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication 어노테이션만 붙이면 끝
스프링 부트 어플리케이션으로 만들어 주며 스프링 부트의 기능이 작동된다. 어노테이션 소스를 따라가면 여러 어노테이션의 묶음인것을 알수 있다.
@Configuration, @ComponentScan(현재 패키지를 기본 베이스로 지정), @EnableAutoConfiguration(자동구성)
# 테스트 클래스
package com.example.demo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Test
public void contextLoads() {
}
}
테스트를 위한 코드로 테스트 케이스 수행시 자도으로 빈이 생성되어 등록까지 처리됨
Spring는 내부적으로 빈이 컨테이너에 등록되고 자동 조립된 상태에서 빈을 주입받아서 작동하게 되는데 테스트 케이스를 만들기 위해서는 @SpringBootTest 어노테이션만 붙이면 알아서 해준다.
# resources/application.properties
server.port=8000
간단히 설명하면 클래스 패스에 내장 톰켓이 지정되어 있으면 내장 톰캣서버는 자신이 가져야 할 기본 프로퍼티정보를 사용자가 지정한 application.properties에서 오버라이드해서 서버를 기동시켜 준다.
스프링 부트 자동구성에서 사용자가 설정을 커스터마이징 한다고 생각하면 이해하기 쉬울것 같다.
실행 방법:
$ mvnw spring-boot:run
스프링 부트가 알아서 빌드하고 배포도 하고 내장 톰캣으로 서버도 기동되는 것을 볼 수 있다.
POM.XML 이해하기
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 부모 스타터에서 상속 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<!-- 프로퍼티 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 스타터 의존성 -->
<dependencies>
<!-- 웹 애플리케이션을 위한 의존성 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
</plugin>
</plugins>
</build>
</project>
복잡해 보이지만 Spring을 개발한 본사람은 너무나 간단하다는 것을 알 수 있다.
디펜던시 부분도 얼마 없고, Jar로 패키징할 때 사용하는 Manifast에 기술할 Main클래스도 없다. 개발자가 지정해야 하는 모든 구성을 스프링부트가 알아서 해 준다는 것이다.
- 부모 스타터 상속
부모스타터 2.0.5.RELEASE버전을 상속 받았기 때문에 부모에서 지정한 의존성 버전을 그대로 따른다고 생각하면 된다 아래 디팬던시에서 버전을 명시하지 않은 이유가 여기에 있다고 보면 된다.
- 스타터 의존성
웹 어플리케이션 개발을 위한 스타터를 주입함으로써 웹개발을 위한 디펜던시가 쭈욱 의존성이 추가 된다. 앞서 설명한 내용과 일치한다.
- 부트 플러그인
메이븐으로 어플리케이션을 실행 할 수 있는 spring-boot:run 골을 제공할 뿐 아니라 java -jar 명령어를 통해 실행가능할 수 있도록 실행가능한 Jar를 만들어준다(내부적으로 Manifest를 추가등)