[배워서 바로 쓰는 스프링 부트2] 1.1 스프링 부트의 기초
1.1 스프링 부트의 기초
- 스타터: 의존관계(dependency)를 간단하게 정의하는 모듈
- 빌드 도구: 버전 해결 등 개발을 효율화하는 플러그인
- 구성 클래스: XML이 아닌 애너테이션과 자바로 설정을 작성
- 자동 구성: 디폴트 구성이 적용되며 필요한 부분만 설정하면 됨
- 메인 애플리케이션 클래스: 자바 명령으로 내장된 톰캣을 실행
- 설정 파일: 속성을 외부 파일에 정의할 수 있으며 동작 사용을 쉽게 변경할 수 있음
빌드도구
- 그레이들은 스크립트를 작성하는 빌드 도구이므로 아파치 앤트처럼 작업을 자유롭게 작성할 수 있다
- 멀티 프로젝트를 구성할 때 하위 프로젝트에 대해 일괄로 설정하고 필요에 따라 개별적으로 설정할 수 있어 스크립트의 작성량이 메이븐보다 적다
- 메이븐은 특수한 처리가 필요할 때 독자적인 플러그인으로 구현해야 하지만 그레이들은 스크립트를 작성하는 것만으로도 대응 가능하다
메이븐
부모 프로젝트 지정
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<type>pom</type>
</dependency>
자바 컴파일러 준수 레벨의 디폴트값은 1.8 버전 11로 변경하려면 아래와 같이 지정
<properties>
<java.version>11</java.version>
</properties>
그레이들
스프링 부트 2.0.x는 그레이들 4.0이상을 지원
표준 그레이들 빌드 스크립트
spirng-boot-gradle-plugin
을 빌드 스크립트의 의존관계에 추가spring-boot-gradle-plugin
과 dependency-management 플러그인 이용을 선언- 자바 컴파일러 준수 레벨을 디폴트값
1.8
에서11
로 변경 - 문자 코드로 UTF-8을 지정
- 스타터를 애플리케이션의 의존관계에 추가
- 테스트용 스타터를 애플리케이션의 의존관게에 추가
buildscript {
ext {
springBootVersion = "2.0.6.RELEASE"
groovyVersion = "2.5.3"
}
repositories {
mavenCentral()
jcenter()
}
dependencies {
// 1. `spirng-boot-gradle-plugin`을 빌드 스크립트의 의존관계에 추가
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}
apply plugin: "java"
// 2. `spring-boot-gradle-plugin` 플러그인 이용을 선언
apply plugin: "org.springframework.boot"
// 2. dependency-management 플러그인 이용을 선언
apply plugin: "io.spring.dependency-management" // 2
// 3. 자바 컴파일러 준수 레벨을 디폴트값 1.8에서 11로 변경
sourceCompatibility = 11
// 3. 자바 컴파일러 준수 레벨을 디폴트값 1.8에서 11로 변경
targetCompatibility = 11
// 4. 문자 코드로 UTF-8을 지정
[compileJava, compileTestJava, compileGroovy, compileTestGroovy]*.options*.encoding = "UTF-8"
repositories {
jcenter()
}
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
dependencies {
// 5. 스타터를 애플리케이션의 의존관계에 추가
compile "org.springframework.boot:spring-boot-starter-thymeleaf"
// 6. 테스트용 스타터를 애플리케이션의 의존관게에 추가
testCompile "org.springframework.boot:spring-boot-starter-test"
}
의존관계 관리
의존 라이브러리의 버전 덮어쓰기(build.gradle
)
ext["groovy.version"] = groovyVersion
ext
는 그레이들의 확장속성
확장 속성에 각 라이브러리 버전이 설정되어 있어 사용할 라이브러리의 버전을 변경하려면 버전값을 덮어 써야 함
구성 클래스
XML로 구성하기
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.sample.web" />
<mvc:annotation-driven />
<mvc:resources mapping="/static/**" location="/WEB-INF/static/" />
</beans>
JavaConfig로 구성하기
// 디폴트 설정을 위해 아무것도 설정하지 않는다
@Configuration
public class ApplicationConfig implements WebMvcConfigurer {
}
@SpringBootApplication(scanBasePackages = { "com.sample.web" })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
자동 구성
자동 구성을 사용하려면 @EnableAutoConfiguration
또는 @SpringBootApplication
애너테이션을 부여
현재 어떤 자동 구성이 적용되었는지 알고 싶다면 인수어 --debug
를 지정해 애플리케이션을 실행하면 자동 구성 보고서가 콘솔에 출력됨
특정 자동 구성을 비활성화하려면 exclude
속성으로 제외
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc;
import org.springframework.context.annotation.*;
@Configuration
// DataSourceAutoConfiguration 자동 구성 비활성화
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
메인 애플리케이션 클래스
메인 애플리케이션 클래스
@SpringBootApplication
은 @EnableAutoConfiguration
과 @ComponentScan
의 속성을 포함하고 있음
package com.sample.web;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
import com.sample.ComponentScanBasePackage; // 상위 패키지를 스캔의 기준으로 한다
// @Configuration, @EnableAutoConfiguration, @ComponentScan을 지정한 것과 동일
@SpringBootApplication(scanBasePackageClasses = {ComponentScanBasePackage.class })
@RestController // 원래 컨트롤러에 작성할 애너테이션
public class Application {
@RequestMapping("/") // 원래 컨트롤러에 작성할 메서드
public String hello() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
컴포넌트 스캔의 기준이 되는 패키지 지정하기
package com.sample;
/**
* 컴포넌트 스캔용으로 basePackages를 설정한다
*/
public class ComponentScanBasePackage {
}
설정 파일
애플리케이션 실행 시 다음 위치에 있는 application.properties
설정 파일을 읽어 들임
- 현재 디렉터리의
/config
서브 디렉터리 - 현재 디렉터리
- 클래스 경로의
/config
패키지 - 클래스 경로의 루트
환경 설정 별로 나누고 싶은 경우에는 application-{profile}.properties
의 명명 규칙으로 설정파일을 만듬
프로파일별 설정은 application.properties
설정을 덮어씀
속성 형식 설정
foo.remote-address=192.168.1.1
foo.security.username=admin
YAML 형식 설정
foo:
remote-address: 192.168.1.1
security:
username: admin
@ConfigurationProperties
를 사용하여 프로그램에서 설정값 이용하기
@Component
@ConfigurationProperties(prefix="foo")
@Validated
public class SomePojo {
@NotNull
InetAddress remoteAddress;
@Valid
Security security = new Security();
public static class Security {
@NotEmpty
String username;
// 게터(getters)와 세터(setters)
}
}
@Validated
애너테이션을 작성하면 빈 검증(bean Validation)으로 속성값을 체크
@ConfigurationProperties
애너테이션을 이용하면 클래스의 변수와 설정 파일의 키가 정확히 일치하지 않아도 느슨하게 바인딩 됨
- foo.remoteAddress
- foo.remote-address
- foo.remote_address
- FOO_REMOTE_ADDRESS
@Value
를 사용하여 프로그램에서 설정값 사용하기
@Component
public class SomePojo {
@Value("${foo.remote-address}")
String remoteAddress;
@Value("${foo.security.username}")
String securityUsername;
}
설정값 전달하기
환경 변수로 설정값 전달하기
$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar
시스템 속성으로 설정값 전달하기
$ java -Dspring.application.json='{"name":"test"}' - jar myapp.jar
명령줄 인수로 설정값 전달하기
$ java -jar myapp.jar --spring.application.json='{"name":"test"}'
애플리케이션 실행하기
인텔리제이에서 실행시 인수를 전달하고 싶다면 Run Configuration
에서 설정
배치 작업명을 인수로 전달하기(build.gradle
)
project(":sample-batch") {
bootRun {
// 프로젝트 속성을 인수로 건넨다
if (project.hasProperty("args")) {
args project.args.split("\\s+")
}
}
dependencies {
...
}
}