Spring Boot 기본 정리
07 Aug 2022패스트캠퍼스 Spring Boot 강의 정리
Spring Boot Properties
- 스프링 부트의 기본 기능 전체를 튜닝하는 전용 설정 프로퍼티
application.properties
또는application.yml
로 제어 가능- 스프링 부트의 대부분 기능 제어 가능
- 기본값이 설정되어 있어 아무것도 쓰지 않아도 작동
- 자바 코드로 적용하던 것을 프로퍼티에서 설정 가능
- 공식 문서
@SpringBootApplication
- 스프링 부트 애플리케이션의 시작점
- 스프링 부트 설정(@SpringBootConfiguration)
- 사전에 정의한 라이브러리 빈 등록(@EnableAutoConfiguration)
- 스프링 빈 애노테이션을 베이스 패키지에서부터 스캔해서 스프링 빈으로 등록(@ComponentScan)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
- 속성
- exclude
- excludeName
- scanBasePackages
- scanBasePackageClasses
- nameGenerator
- proxyBeanMethods
- 스프링 애플리케이션에 설정 추가하기
- SpringApplication 인스턴스 생성해서
run()
전에 설정 추가
- SpringApplication 인스턴스 생성해서
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(SampleApplication.class);
// 설정 추가 가능
app.setBannerMode(Banner.Mode.OFF);
// 애플리케이션 실행
app.run();
}
}
@Component
- 클래스를 custom bean으로 등록
- class-level 애노테이션
- 등록하려는 빈의 클래스 소스가 편집 가능한 경우 사용
- auto-detection에 걸림
@ComponentScan
으로 인해서 기본 패키지부터 모든@Component
검색- 인스턴스화하고 필요한 의존성을 모두 주입
- 스프링 컨테이너에 등록하여 필요한 곳에 주입
그 외에 bean 만드는 방법
- @Configuration에서의 @Bean
@Configuration
public class Config {
@Bean
public MyService myService() {
return new MyService();
}
}
- @Component에서의 @Bean (Lite Mode)
- proxy bean 사용하지 않는 방식
@Component
public class Config {
@Bean
public MyService myService() {
return new MyService();
}
}
@Bean
- method-level 애노테이션
- 좀 더 읽기 쉬움
- 인스턴스화 하는 코드 수동으로 작성
- 빈의 인스턴스 코드와 클래스 정의가 분리된 구조
- 외부 라이브러리, 서드 파티 클래스도 빈으로 등록 가능
@Configuration
- bean 설정을 담고 있음
- @SpringBootApplication이 컴포넌트 스캔을 통해 @Configuration 찾음
- bean 설정(메소드)를 읽어서 스프링 컨테이너에 등록
- 필요한 곳에 주입
- 각종 스프링 인터페이스 구현에 사용
- @Component 애노테이션 포함
Configuration properties
- 각종 설정값을 외부로 분리
- 서로 다른 환경에서도 사용 가능
- 애플리케이션을 새로 컴파일하지 않고 설정값 변경 가능
- 종류
- Java properties
- YAML
- environment variable
- command-line argument
- 외부 설정을 읽어들이는 순서(아래 설정이 위의 설정을 덮어쓰게 됨)
- 기본 프로퍼티
- @Configuration 클래스에 @PropertySource로 정의된 것
- 설정 파일(application.properties)
- RandomValuePropertySource
- OS 환경 변수
- 자바 시스템 프로퍼티(System.getProperties())
- JNDI 속성(java:comp/emv)
- ServletContext 초기 파라미터
- ServletConfig 초기 파라미터
- SPRING_APPLICATION_JSON 프로퍼티
- Command-line arguments
- 테스트에 사용된 프로퍼티
- @TestPropertySource
- Devtools 글로벌 세팅($HOME/.config/spring-boot)
- 설정 파일(Config data) 우선순위
- JAR 패키지 안의 application.properties / application.yml
- JAR 패키지 안의 프로파일이 지정된 파일(application-{profile}.properties)
- JAR 패키지 밖의 파일
- JAR 패키지 밖의 프로파일이 지정된 파일
- 설정 파일(Config data)의 위치
- classpath
classpath:
classpath:/config
- 현재 디렉토리
../
../config
../config/child
- classpath
- 설정 파일 읽는 방법
- @Value
- SpEL로 프로퍼티명 표현
- type-safe하지 않음
- 필드 주입 방식 사용할 경우
- 인스턴스화 이후에 주입하므로
final
쓸 수 없음 - 생성자 안에서 보이지 않음 (대체 방법: @PostConstruct)
- 인스턴스화 이후에 주입하므로
- 생성자 주입 방식 가능
final
사용 가능
- 프로퍼티 Relaxed binding 지원 (SpEL 표현은 kebal-case only)
- Meta-data 없으며 javadoc은 가능
@Component public class MyBean { @Value("${name}") private String name; }
- Environment
- application context에서 꺼내오는 방법
- environment bean을 가져오는 방법
- 눈에 잘 들어오지 않음
@Autowired public MyService(Environment environment, ApplicationContext context) { System.out.println(environment.getProperty("test.property")); System.out.println(context.getEnvironment().getProperty("test.property")); }
- @ConfigurationProperties
- 자바 클래스로 매핑하므로 type-safe
- 각 프로퍼티에 대응하는 meta-data 작성 가능
- Relaxed binding 지원
- 작성 방법
- 기본
- 애플리케이션 클래스에
@ConfigurationPropertiesScan
추가하여 @Configuration 생략 가능 - @Bean 메소드
- @ConstructorBinding
@ConfigurationProperties("my") @Configuration public class MyProperty { private Integer height; public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } }
@ConstructorBinding @ConfigurationProperties("my") public class MyProperty { private final Integer height; public MyProperty(Integer height) { this.heght = height; } public Integer getHeight() { return height; } }
- @Value
@ConfigurationProperties
이용하면 immutable & type-safe한 프로퍼티 생성 가능