2023-11-30 작성

스프링부트 EnvironmentPostProcessor로 사용자 정의

이번 프로젝트에서 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