(JPA+Boot)외부설정 @ConfigurationProperties

스프링 부트 애플리케이션에서 외부 설정 파일의 값을 타입 안전하게 자바 객체로 바인딩하고 스프링 빈으로 등록하여 활용하는 @ConfigurationProperties의 구현 방법과 장점을 상세히 설명하는 가이드입니다.



외부설정(@Value -> @ConfigurationProperties)

외부 설정(application.yml) 에서 설정한 내용을 -> 자바객체로 바꿔서 -> 스프링 빈에 등록하여 사용하자는 방법! (messages랑 다른거다 오해하지말자!)

특히, spring.config.import=optional:file:../prod.properties 로 외부의 설정 파일(ex:prod.properties가 우선순위)도 가져올 수 있다.(권장!)

  • application.ymlmy.datasource.imgPath=값를 설정해서 사용하고자 한다면?
  • @Value(“${my.datasource.imgPath}”) 로 간단히 가져올 수 있지만, 우린 이걸 쓰려는게 아니니까 이건 잠시 잊자.
  • 우린 @ConfigurationProperties이걸 사용할 것이고 아래 코드를 보고 이해하자.
@ConfigurationProperties 사용코드(+외부설정 포함): 이거 적용함


3개 자바파일 + 내부,외부 application.properties 필요
application.properties -> 내부 resources에서 코드

# 내부설정.property + 외부설정.properties(ex: pageUnit=10)
# file:../prod.properties란 프로젝트 상위에 잇는 외부설정
spring.config.import=optional:file:../prod.properties 
my.datasource.pageUnit=10
my.datasource.pageSize=10
my.datasource.imgPath=C:/images-spring/

MyDataSource.java -> 객체로 사용할 클래스

@Slf4j
@Data
public class MyDataSource {
	private int pageUnit;
	private int pageSize;
	private String imgPath;
	// 생성자
	public MyDataSource(int pageUnit, int pageSize, String imgPath) {
		this.pageUnit = pageUnit;
		this.pageSize = pageSize;
		this.imgPath = imgPath;
	}
//
	@PostConstruct // 로딩완료 후 바로 실행 (로그 확인용)
	public void init() {
		log.info("init: pageUnit={}, pageSize={}, imgPath={}", pageUnit, pageSize, imgPath);
	}
}

MyDataSourceProperties.java -> @ConfigurationProperties로 application.properties 내용을 JVM에 로드

/**
 * 외부설정:
 * @ConfigurationProperties 로 application.properties 에 저장한 my.datasource 하위 내용
 * 가져와서 "자바 객체" 로 변환 + 검증까지
 */
@Slf4j
@Getter @Setter
@ConfigurationProperties("my.datasource")
//@Validated
public class MyDataSourceProperties {
//    @NotEmpty
    private int pageUnit;
    private int pageSize;
    private String imgPath;
    public MyDataSourceProperties() { // 기본 생성자
    	log.info("properties 기본생성자 TEST");
    }
    public MyDataSourceProperties(int pageUnit, int pageSize, String imgPath) {
    	log.info("properties 일반생성자 TEST");
        this.pageUnit = pageUnit;
        this.pageSize = pageSize;
        this.imgPath = imgPath;
    }
}

MyDataSourceConfig.java -> @EnableConfigurationProperties로 @ConfigurationProperties를 빈 사용 활성화
참고) 바로 사용해도 되지만 객체로 쉽게 사용할 수 있게 추가로 MyDataSource.java 를 빈 등록 했다.

/**
 * 외부설정:
 * @EnableConfigurationProperties 로 MyDataSourceProperties 를 사용 및 스프링 빈
 * @Import 를 통해서 "컴포넌트 스캔 대상 꼭 지정하기!"
 */
@Slf4j
@EnableConfigurationProperties(MyDataSourceProperties.class)
public class MyDataSourceConfig {
    private final MyDataSourceProperties properties;
    public MyDataSourceConfig(MyDataSourceProperties properties) {
        this.properties = properties;
    }
//
    @Bean
    public MyDataSource getMyDataSource() {
        return new MyDataSource(
                properties.getPageUnit(), properties.getPageSize(), properties.getImgPath()
        );
    }
}

TEST_CODE

//필요한 곳에서 불러오고
private final MyDataSourceConfig source; 
//이를 바로 사용하면 끝!
.addResourceLocations("file:///"+source.getMyDataSource().getImgPath());
//MyDataSource 불러와 바로 사용해도 됨
private final MydataSource source;
log.info("{}", source.getImgPath());



댓글남기기