스프링 부트 구성의 핵심 요소 : 스타터, 자동설정, 액츄에이터
요소 | 기능 |
---|---|
Starter | 스프링이 제공하는 특정 모듈을 사용할 수 있도록 관련된 라이브러리 의존성을 해결 |
AutoConfiguration | 스타터를 통해 추가한 모듈을 사용할 수 있도록 관련된 빈 설정을 자동 처리 |
Actuator | 스프링 부트로 개발된 시스템을 모니터링할 수 있는 다양한 기능 제공 |
예를 들어, 현재 프로젝트에 스프링과 JPA를 연동하여 데이터 베이스 작업을 처리한다고 가정한다. 그렇다면 우선 해야할 작업은 아래와 같다.
그런데 이 때 어떤 하이버네이트를 사용하기 위해 추가적으로 필요한 라이브러리가 무엇인지 전부 알기 힘들다 ㅜ..
→ 스타터는 필요한 라이브러리들을 관련된 것끼리 묶어서 패키지처럼 제공
spring-boot-start-모듈명 형태의 파일들이 이러한 스타터임.
pom.xml에 스타터를 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.7.4</version>
</dependency>
스타터는 어떻게 최소한의 설정만으로 수많은 라이브러리들을 자동하으로 관리하나여??
→ 스타터에 있는 pom 파일의 상속구조
pom.xml에서 스타터 소스로 이동하면 아래와 같은 내용을 볼 수 있다.
어쩌구 저쩌구 뭐가 많음
아무튼 이렇게 특정 모듈과 관련된 의존성을 패키지처럼 관리하기 때문에 프로젝트 모듈관리가 간단해진다.
메이븐은 <parent>
태그를 통해 자바 클래스의 상속과 같이 상속을 통한 설정의 재사용이 가능하다.
스프링 부트에서 새로운 프로젝트를 생성하면 프로젝트에 설정된 pom.xml은 자동으로 아래와 같은 상속 구조를 가지게 된다
부모로부터 상속된 의존성은 자식 프로젝트에서 재정의 가능하다~!
스타터를 이용하여 프로젝트에 필요한 라이브러리들을 효과적으로 관리할 수 있다. 그러나 라이브러리만 추가한다고 해서 추가된 모듈을 바로 사용할 수 있는 것은 아니다
라이브러리들이 추가되고 나면, 해당 모듈들을 사용할 수 있도록 스프링 설정 파일에 빈 등록해야 하고 의존성 주입도 해줘야 한다
→ 스프링 부트가 다 해줌~!
스프링 MVC를 사용해서 웹 애플리케이션을 개발할 때, 여러가지 설정을 추가적으로 해줘야하는데 스프링부트는 이러한 설정을 안 했다..
왜냐면 스프링부트가 제공하는 자동설정 기능으로 인해서 수많은 빈들이 등록되고 동작했기 때문이다~~
누가 이렇게 기특한건데... @SpringBootApplication
임...
그리고 그 중에서도 @SpringBootApplication
에 포함된 @EnableAutoConfiguration
덕분이다~~
@SpringBootApplication
어노테이션을 클릭해서 해당 소스로 이동해보면 아래와 같다
저 중에서 핵심은 @SpringBootConfiguration
, @EnableAutoConfiguration
,
@ComponentScan
이다. @SpringBootApplication
은 위의 3가지 어노테이션을 합친 것이다.
@SpringBootConfiguration
@Configuration
과 동일하다.@ComponentScan
@Configuration
, @Repository
, @Controller
등 어노테이션이 붙은 객체를 메모리에 올리는 역할@EnableAutoConfiguration
스프링 부트는 Bean을 두번 등록하는데, 처음에는 @ComponentScan
을 통해서 등록하고 이후에 추가적으로 @EnableAutoConfiguration
을 사용하여 필요한 Bean들을 등록하는 것이다.
- 스타터 : 프로젝트에 필요한 의존성을 편하게 관리하기 위해서 사용한다.
- 자동설정 : 애플리케이션 운용에 필요한 빈들을 초기화하는 기능 제공
자동설정으로 등록된 빈 대신 다른 객체를 빈으로 등록하고 싶다면? 해당 빈의 이름과 동일한 클래스를 작성하면 기존에 자동으로 등록된 빈을 새롭게 작성된 빈이 덮어 쓴다.
다만 메모리상에 이름이 같은 두 개의 빈이 올라가면 오류가 발생하기 때문에 추가적인 설정이 필요하다.
application.properties 파일에 설정을 추가한다.
spring.main.allow-bean-definition-overriding=true
@Conditional
어노테이션 사용위의 설정을 추가하고 빈 또한 재정의한 후에도 재정의한 빈이 사용되지 않고 기존에 자동설정으로 등록된 빈이 사용된다. 그 이유는 메인 클래스의 @SpringBootApplication
의 동작 순서 때문이다.
@SpringBootApplication
은 @EnableAutoConfiguration
과 @ComponentScan
을 포함하고 있는데, @ComponentScan
이 먼저 동작하여 사용자가 등록한 빈을 메모리에 올린 후 나중에 @EnableAutoConfiguration
이 실행되어 자동설정에 의한 빈 등록을 처리한다. 따라서 사용자가 생성한 빈이 덮어써져서 동작하지 않게 되는 것이다.
새롭게 정의한 빈을 사용하기 위해서는 @Conditional
어노테이션을 사용한다. 이 어노테이션은 조건에 따라 새로운 객체를 생성할지 말지 결정할 수 있다.
자동 설정 클래스에서 해당 어노테이션을 사용하여 조건에 따라 빈 등록을 다르게 처리하도록 한다.
@ConditionalOnMissingBean
프로젝트의 외부 설정 파일인 application.properties에 프로퍼티를 추가하고 이를 사용하는 방법.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.7.4</version>
</dependency>
프로퍼티 사용을 위한 클래스를 작성하고 해당 클래스에 @ConfigurationProperties
어노테이션을 설정한다.
활성화할 프로퍼티 클래스의 선언부에 @EnableConfigurationProperties(활성화할 프로퍼티 클래스.class)
을 설정한다
활성화된 프로퍼티 객체는 @Autowired
로 의존성을 주입하여 사용이 가능해진다.