바로 앞 포스팅에서 properties의 종류와 우선순위에 대해 알아봤다.
이번 포스팅에선 properties를 읽어오는 4가지 방법에 대해 알아보겠다.
properties 읽어오는 방법
아래와 같이 4가지가 있다. 하나씩 알아보자!
- Environment
- @Value
- @ConfigurationProperties
- getter, setter
- constructor
0. 테스트 설명
application.yml에 아래와 같이 정의해주자.
server:
port: 9000
shutdown: graceful
ServerProperties를 아래와 같이 만들자.
class ServerProperties(
val port: Int,
val shutdown: String
)
application.yml에 정의한 server 정보를 ServerProperties 클래스에 담아 빈으로 등록해보자.
@SpringBootTest
class ServerConfigTest(
@Autowired private val serverProperties: ServerProperties
) {
@Test
fun serverProperties() {
assertThat(serverProperties.port).isEqualTo(9000)
assertThat(serverProperties.shutdown).isEqualTo("graceful")
}
}
위와 같이 테스트 클래스 하나 만들어서 아래 코드 작성하고 테스트 한번씩 돌려서 검증하자.
1. Environment
environment 빈을 이용하는 방법
@Configuration
class ServerConfig {
@Bean
fun serverProperties(env: Environment) =
ServerProperties(
port = env.getRequiredProperty("server.port", Int::class.java),
shutdown = env.getRequiredProperty("server.shutdown", String::class.java)
)
}
get, getProperty, getRequiredProperty 메소드를 이용해서 가지고 올 수 있다.
음 근데 딱 봤을 때 코드가 뭔가 깔끔해보이지 않고 사용법도 좀 불편해보인다. 별로다.
2. @Value
@Value 어노테이션을 이용하는 방법
@Configuration
class ServerConfig {
@Bean
fun serverProperties(
@Value("\${server.port}") port: Int,
@Value("\${server.shutdown}") shutdown: String,
) = ServerProperties(
port = port,
shutdown = shutdown
)
}
인자에 @Value 어노테이션을 붙여주면 된다.
Environment보단 괜찮아 보인다.
3. @ConfigurationProperties
@ConfigurationProperties를 이용하는 방법이다.
위 방법들과는 다르게 객체에 바로 바인딩하는 방법이다.
getter, setter를 이용하는 방법, constructor를 이용하는 방법 2가지가 있다.
3.1 getter, setter
getter, setter를 이용하는 방법
@ConfigurationProperties(prefix = "server")
class ServerProperties {
var port: Int = 0
lateinit var shutdown: String
}
음.. 별로다. Int는 lateinit을 사용할 수 없어 기본값을 넣어줬는데 일관되지 않은 느낌이라 별로다.
3.2 constructor
constructor를 이용하는 방법
@ConstructorBinding을 꼭 붙여줘야 한다.
@ConstructorBinding
@ConfigurationProperties(prefix = "server")
class ServerProperties(
val port: Int,
val shutdown: String
)
오우 제일 깔끔하다.
나는 실무에서 위 방법으로 사용 중이다.
참고사항
아마 위 코드만 작성했다면 아래와 같이 에러가 발생했을 거다.
@EnableConfigurationProperties
이 방법은 AutoConfiguration할 때 사용하면 좋다.
@EnableConfigurationProperties(ServerProperties::class)
@SpringBootApplication
class Demo3Application
fun main(args: Array<String>) {
runApplication<Demo3Application>(*args)
}
@Component
이 방법은 getter, setter 방법에만 사용 가능하다. 비추
@Component
@ConfigurationProperties(prefix = "server")
class ServerProperties {
var port: Int = 0
lateinit var shutdown: String
}
@ConfigurationPropertiesScan
이 방법을 제일 추천한다.
@ConfigurationPropertiesScan
@SpringBootApplication
class Demo3Application
fun main(args: Array<String>) {
runApplication<Demo3Application>(*args)
}
추가
@ConfigurationProperties를 사용하면 아래와 같이 Spring Boot Configuration Annotation Processor not configured 경고 문구가 나오는데 여기서 해결책을 확인해보자.
끝!
'Spring' 카테고리의 다른 글
[Spring] Maintenance Mode란? (0) | 2023.02.14 |
---|---|
[Spring] Spring Boot Configuration Annotation Processor not configured 해결 방법 (0) | 2023.02.10 |
[Spring] properties 가져오기 (1) - 종류, 우선순위 (0) | 2023.02.10 |
[Spring] MissingKotlinParameterException을 ExceptionHandler로 처리 하는 방법 (0) | 2023.01.15 |
[Spring] "has been compiled by a more recent version" 에러 처리 방법 (0) | 2022.12.19 |
댓글