티스토리 뷰

반응형

Spring 프레임워크로 개발을 하다 보면 프로퍼티(Properties)에 저장된 특정한 설정 값들을 불러와야 하는 경우가 있다. 많은 글 들에서 프로퍼티(Properties)를 불러오는 내용들을 설명하고 있는데, 이번에는 final 변수가 붙은 클래스에 설정 값을 불러오는 방법에 대해서 알아보고자 한다.

 

 

 

1. final 변수를 갖는 클래스에 프로퍼티(Properties) 설정 값 불러오기


[ 설정값 및 프로퍼티(Properties) 클래스 ]

아주 쉬운 예시로 Properties에 다음과 같은 설정 파일들이 있다고 가정하자.

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=h2test
spring.datasource.password=h2test

 

그리고 이 datasource 관련 설정 값들을 다음과 같은 클래스로 한번에 불러오고 싶다고 하자.

@Getter
public class DataSourceProperties {

	private String driverClassName;
	private String url;
	private String username;
	private String password;

}

 

이때 설정 값들을 불러오기 위해서는 Setter를 이용해 수정자로 바인딩하거나 @Constructor Binding를 이용해 생성자로 바인딩을 할 수 있는데, 먼저 수정자로 바인딩해보도록 하자.

 

 

[ Setter로 바인딩하기 ]

우선 Spring으로 하여금 컨테이너가 시작될 때 DataSourceProperties 설정 클래스를 초기화하고 빈으로 생성하도록 등록을 해주어야 한다. 이를 위해서는 @EnableConfigurationProperties를 등록하고, 해당 클래스를 추가해주어야 한다.

일반적으로 SpringBoot의 메인 클래스에 @EnableConfigurationProperties 어노테이션을 다음과 같이 추가해준다.

@Configuration
@EnableConfigurationProperties({DataSourceProperties.class})
public class SpringBootApplication {

}

 

그리고 이제 Setter로 바인딩하기 위해서는 우선 Properties 클래스에 Setter를 추가해주어야 한다. 롬복의 @Setter를 이용해 간편히 추가해주도록 하자.

DatasourceProperties에 우리가 바인딩하고자 하는 값들은 prefix로 spring.datasource가 공통된다. 그러므로 Spring 컨테이너가  spring.datasource로 시작되는 properties값을 바인딩하도록 @ConfigurationProperties를 추가하고 prefix를 다음과 같이 설정해주어야 한다.

@Setter
@Getter
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {

	private String driverClassName;
	private String url;
	private String username;
	private String password;

}

 

그리고 실행을 해보면 다음과 같이 정상적으로 바인딩이 됨을 확인할 수 있다.

 

 

[ 생성자로 바인딩하기(@ConstructorBinding) ]

하지만 위와 같이 Setter가 추가된 DatasourceProperties는 그다지 좋은 방법이 아니다. 왜냐하면 Spring 컨테이너에 의해 싱글톤으로 관리되는 클래스에 변경 가능성이 열려있기 때문이다.

그러므로 해당 클래스의 변수들을 final로 선언하고, 생성자를 만들어 생성자로 바인딩을 하도록 수정하는 것이 적합해 보인다.

(불변 객체 및 final을 이용하는 이유에 대해서는 너무 중요하므로, 이해가 부족하다면 이 글에서 참고하도록 하자.)

 

변경 가능성을 닫기 위해서는 해당 변수들을 모두 final로 선언하고, 생성자를 추가해주면 된다. 그리고 생성자를 이용해 properties의 값을 바인딩하도록 @ConstructorBinding 어노테이션을 추가해주면 된다.

@Getter
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "spring.datasource")
@ConstructorBinding
public class DataSourceProperties {

	private final String driverClassName;
	private final String url;
	private final String username;
	private final String password;

}

 

 

그리고 해당 프로퍼티의 값이 잘 불러와지는지 확인해보면 다음과 같이 정상적으로 불러와지는 것을 확인할 수 있다.

 

 

 

애플리케이션의 규모가 큰데, 변경 가능성이 열려 있어 변경 가능한 포인트가 많다면 나중에 유지보수가 어려워진다. 그러므로 불변 객체를 최대한 이용하도록 하고, 프로퍼티를 불러오는 경우에도 적용하도록 하자.

하지만 프로퍼티 설정 클래스들이 상당히 많아진다면 일일이 등록하는게 번거로워질 수 있다. 그래서 Spring Boot 2.2부터는 @ConstructorBinding 어노테이션이 붙은 클래스들을 스캔하여 처리하는 기능을 제공하고 있다.

다음 포스팅에서는 이러한 작업을 진행하는 @ConfigurationPropertiesScan에 대해 알아보도록 하자.

 

 

 

 

 

관련 포스팅

  1. final 변수를 갖는 클래스에 프로퍼티(Properties) 설정 값 불러오기, 생성자 바인딩(Constructor Binding) - (1/2)
  2. @ConfigurationPropertiesScan을 이용한 설정 프로퍼티 클래스(@Configuration Properties)의 빈 등록 - (2/2)

 

반응형
댓글
댓글쓰기 폼
  • ryumodern 오옹 @ConstructorBinding 이거는 처음 봤는데 일일이 @Value 지정 안 해줘도 되서 유용하겠어요 2021.09.15 16:59 신고
  • 망나니개발자 안녕하세요~! @Value를 일일이 만들어줄 필요가 없어서 상당히 유용한데, 그것을 해주는 거는 @ConfigurationProperties이고, @ConstructorBinding은 생성자로 바인딩하게끔 해주는 역할입니다! 이와 관련해서 오해가 생길수도 있을 것 같은데 제가 이따가 내용 자세히 수정하도록 하겠습니다:) 2021.09.15 17:58 신고
  • 망나니개발자 오해가 생기실 수 있을 것 같아서 내용 수정했습니다! 시간 되시면 천천히 읽어보시면 좋을 것 같습니닷:) 2021.09.15 18:45 신고
  • ryumodern 넵 이해했습니다 감사합니다 👍👍
    만약 properties binding 시킬 값들이 한 곳에 모을 수 없고 여러 Configuration 클래스에 퍼져 있다면 @EnableConfigurationProperties이 상당히 길어질 것 같은데 이런 경우엔 @PropertySource와 @Value 쓰는게 나을까요?
    2021.09.16 09:23 신고
  • 망나니개발자 제가 질문을 정확이 이해하지 못했는데욤ㅜㅜ
    @EnableConfigurationProperties에 추가해주어야 하는 클래스가 상당히 많은 경우를 여쭤보시는거라면 SpringBoot 2.2에서 지원하는
    @ConfigurationPropertiesScan 어노테이션을 사용하는 방법도 있을 것 같습니다:)
    2021.09.16 11:04 신고
반응형
공지사항
Total
1,584,951
Today
1,428
Yesterday
5,473
TAG more
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함