SpringBoot 개발 간에 많은 옵션들을 Application.properties, Application.yml 파일과 같은 속성 설정 파일을 이용하여 정의하고 사용하게 됩니다. 주로 SpringBoot에 대한 설정 외에 Database, JPA, Mail과 같은 라이브러리들을 위한 설정들을 포함하지만 이 외에도 애플리케이션의 비즈니스를 위한 속성이나 애플리케이션의 동작을 위해 사용자 정의 속성을 필요로 하는 경우도 자주 발생합니다.
Spring Application에 환경 변수나 속성을 주입하는 방식에는 여러가지가 있겠지만, 여기서는 Application 속성 파일을 이용하는 방법을 간단히 정리하고 그 외의 다양한 내용은 다음 기회에 정리합니다.
application.yml
파일에 사용자 정의 속성을 추가하고 이를 프로그램에서 사용하는 방법을 아래와 같이 구현할 수 있습니다.
1. application.yml
에 사용자 정의 속성 추가
당연한 얘기지만 일단 설정파일에 사용할 속성을 잘 구조화해서 추가합니다. 아래와 같이 application.yml 파일에 user.email 속성을 추가합니다.
user:
email: "user@example.com"
2. 사용자 정의 속성 매핑
Spring Boot에서 사용자 정의 속성을 사용하려면 @ConfigurationProperties 또는 @Value를 사용할 수 있습니다.
방법 1: @ConfigurationProperties
사용
속성 클래스 정의
package com.example.demo.config
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "user")
data class UserProperties(
var email: String = ""
)
컨트롤러에서 사용
package com.example.demo.controller
import com.example.demo.config.UserProperties
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class TestController(private val userProperties: UserProperties) {
@GetMapping("/test")
fun getUserEmail(): String {
return "User email: ${userProperties.email}"
}
}
방법 2: @Value
사용
@Value
어노테이션을 사용하면 특정 속성 값을 직접 주입받을 수 있습니다.
컨트롤러에서 사용
package com.example.demo.controller
import org.springframework.beans.factory.annotation.Value
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class TestController {
@Value("\${user.email}")
private lateinit var userEmail: String
@GetMapping("/test")
fun getUserEmail(): String {
return "User email: $userEmail"
}
}
3. 결과
요청
Controller에 정의된 주소로 요청을 던져 봅니다.
GET http://localhost:8080/test
응답
아래와 같이 속성에 정의된 값을 이용해서 응답을 받습니다.
User email: user@example.com
4. 차이점
@ConfigurationProperties
:- 한 번에 여러 속성을 매핑할 수 있고, 재사용성이 높습니다.
- 속성이 많을 경우 더 깔끔한 코드를 작성할 수 있습니다.
@Value
:- 간단히 특정 속성만 사용하려는 경우 적합합니다.