이번 프로젝트에서 Spring Boot 애플리케이션 구동시 실행되는 기능을 만들어야 했다.
EnvironmentPostProcessor 인터페이스를 활용하여 커스터마이징 환경으로 구현할 수 있었다. 이 인터페이스는 Environment 애플리케이션 컨텍스트가 올라가기 전에 애플리케이션을 사용자 정의할 수 있게 해주는 기능이다.
실제 예시를 살펴보자.
사용자 정의 클래스 생성
EnvironmentPostProcessor 인터페이스를 구현한 사용자 정의 클래스를 작성한다.
import org.apache.commons.logging.Log;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.core.env.ConfigurableEnvironment;
public class LoadLicenseProcessor implements EnvironmentPostProcessor {
private final Log logger;
public LoadLicenseProcessor(DeferredLogFactory logFactory) {
this.logger = logFactory.getLog(LoadLicenseProcessor.class);
}
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
logger.info("EnvironmentPostProcessor START!!!");
loadLicense(); // 사용자 정의 로직
}
}
위 예제를 보면 Log를 별도로 구현했는데 이유는 롬복의 @Slf4j 를 이용했더니 로그 출력이 안되는 이슈가 발생했기 때문이다. stackoverflow 답변을 참고하여 DeferredLogFactory로 별도로 구현했다.
Spring Boot 2.4부터 EnvironmentPostProcessor 구현 시 선택적으로 다음 생성자 매개변수를 사용할 수 있다.
- DeferredLogFactory : 애플리케이션이 완전히 준비될 때까지 출력이 지연되는 로거를 생성하는 데 사용할 수 있는 팩토리(환경 자체에서 로깅 수준을 구성할 수 있음)
spring.factories 파일 생성
EnvironmentPostProcessor를 구현한 클래스가 정상적으로 동작하기 위해서는 META-INF/spring.factories 파일을 만들고 해당 클래스의 풀 경로를 기입해주어야한다.
프로젝트 src/main/resources 경로에 META-INF 폴더를 만들고 spring.factories 파일을 만든다.
해당 파일에 생성한 클래스의 full 경로를 기입한다.
org.springframework.boot.env.EnvironmentPostProcessor=com.company.helloBoard.config.LoadLicenseProcessor
이렇게 설정한 뒤 jar 또는 war 파일로 압축하면 아래와 같이 spring.factories 파일이 잘 들어가져 있다.
jar로 배포할 경우 META-INF 안에 포함되어 있음
war로 배포할 경우 WEB-INF/classes/META-INF 안에 포함되어 있음
jar 파일 실행하여 애플리케이션 구동시, 로그도 잘 찍히고 사용자 정의 기능도 잘 수행되었다.
References
'Backend > Spring, SpringBoot' 카테고리의 다른 글
Spring Boot 내장 톰캣 제외시키는 방법 (0) | 2023.12.05 |
---|---|
Spring Boot에서 static 변수로 선언한 @Value 값이 NULL일 경우 (0) | 2023.12.01 |
STS 4에서 war 파일로 쉽게 배포하는 방법 (배포 및 실행까지) (0) | 2023.11.29 |
스프링부트 개발환경 구성하기 (8) 동적 정렬처리 (1) | 2023.11.13 |
스프링부트 개발환경 구성하기 (7) 페이징 (Mybatis에서 Pageable) (2) | 2023.11.03 |