본문 바로가기
Spring

[Spring] properties 가져오기 (2) - 4가지 방법으로 읽어오기

by 노력남자 2023. 2. 10.
반응형

바로 앞 포스팅에서 properties의 종류와 우선순위에 대해 알아봤다. 

 

이번 포스팅에선 properties를 읽어오는 4가지 방법에 대해 알아보겠다.

 

properties 읽어오는 방법

 

아래와 같이 4가지가 있다. 하나씩 알아보자!

 

  1. Environment
  2. @Value
  3. @ConfigurationProperties
    1. getter, setter
    2. 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 Boot Configuration Annotation Processor not configured 해결 방법

문제 @ConfigurationProperties 테스트 중에 IntelliJ가 "Spring Boot Configuration Annotation Processor not configured" 경고 문구를 띄워줬다. 경고 문구가 있어도 실행엔 문제는 없다. 근데 거슬린다. 원인 원인을 찾아

effortguy.tistory.com

 

끝!

반응형

댓글