관리 메뉴

너와 나의 스토리

설정 파일(*.properties, *.yml)에 있는 값들을 자바 클래스로 바인딩해서 사용하기 - @ConfigurationProperties 본문

개발/Spring Boot

설정 파일(*.properties, *.yml)에 있는 값들을 자바 클래스로 바인딩해서 사용하기 - @ConfigurationProperties

노는게제일좋아! 2023. 7. 29. 17:09
반응형

@ConfigurationProperties

  • *.properties, *.yml과 같이 외부 속성을 바인딩하고 유효성을 검사할 수 있게 해주는 어노테이션.
  • @ConfigurationProperties를 클래스에 추가하면, 해당 클래스는 외부 설정을 담는 용도로 사용되고, 이 설정 클래스를 @Configuration 클래스 내에서 @Bean으로 등록하면 스프링 컨테이너에서 해당 설정을 사용할 수 있다.
  • 이 어노테이션을 사용하면 바인딩은 클래스의 setter 메서드를 호출하는 방식으로 수행된다.
    • @ConstructorBinding 어노테이션을 추가하면 생성자 주입 방식으로 바인딩이 이루어진다.
  • 외부 설정 파일에 정의한 이름대로 바인딩을 해주는데, 여러 표기법에 대해 자동으로 바인딩해준다.
    • first_name, firstName, first-name, FIRSTNAME 다 가능

 

사용 방법

  • application.yml에 필요한 데이터 작성
tistory:
  name: hororolol
  link: https://hororolol.tistory.com/
  • 바인딩할 클래스 생성
    • @ConfigurationProperties(prefix) 어노테이션으로 외부 설정 값을 바인딩하고, @Configuration 어노테이션을 통해 Spring IoC 컨테이너에게 Spring Bean을 제공
@Configuration
@ConfigurationProperties("tistory")
class TistoryProperties {
    lateinit var name: String
    lateinit var link: String
}
  • 설정된 값 가져오기
    • @Configuration을 통해 정의한 bean들을 가져오기 위해서는 다음의 작업이 필요하다.
      • @Component, @Service. @Controller 등의 어노테이션을 사용하여 해당클래스를 빈으로 등록
      • @Autowired 또는 @Resource 등의 어노테이션을 사용하여 해당 빈을 주입
@RestController
class TistoryController {

    @Resource
    private lateinit var tistoryProperties: TistoryProperties

    @GetMapping("")
    fun getName(): String {
        return tistoryProperties.name
    }
}
  • 테스트 결과

 

다른 클래스에서 TistoryProperties를 사용하는 방법

  • 새로운 클래스 생성
class TistoryService(private val properties: TistoryProperties) {

    fun printProperties() {
        println("name: ${properties.name}, link: ${properties.link}")
    }
}
  • 이 클래스를 빈으로 등록
@Configuration
class TistoryConfiguration(private val tistoryProperties: TistoryProperties) {

    @get:Bean
    val tistoryService: TistoryService by lazy {
        TistoryService(tistoryProperties)
    }
}
  • TistoryService 호출하기
@RestController
class TistoryController {

    @Resource
    private lateinit var tistoryService: TistoryService

    @GetMapping("")
    fun getName(): String {
        tistoryService.printProperties()
        return ""
    }
}

 

 

 

출처

- https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/properties/ConfigurationProperties.html

반응형
Comments