// application.properties
test.message=this is a message.
test.city=city is Seoul
@Value
애노테이션을 활용하여 프로퍼티의 값을 받아올 수 있다.// TestController.java
@RestController
public class TestController {
@Value("${test.message}")
private String message;
@Value("${test.city}")
private String city;
@GetMapping("/test")
public String test() {
return message + " / " + city;
}
}
@Value
애노테이션은 사용하기 간단하지만, 공통으로 묶어야할 프로퍼티가 많아질 경우 코드가 지저분해진다. @ConfigurationProperteis
이다.// PropertiesConfig.java
@Configuration
@EnableConfigurationProperties(value = TestProperties.class)
public class PropertiesConfig {
}
@Configuration
애노테이션으로 설정파일임을 스프링에 등록하고@EnableConfigurationProperties
애노테이션에 설정할 프로퍼티 클래스를 등록한다. TestProperties
를 만든다.// TestProperties.java
// Setter 방식
@ConfigurationProperties(prefix = "test")
public class TestProperties {
private String message;
private String city;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
// TestProperties.java
// 생성자 주입 방식
@ConfigurationProperties(prefix = "test")
@ConstructorBinding
public class TestProperties {
private final String message;
private final String city;
public TestProperties(String message, String city) {
this.message = message;
this.city = city;
}
public String getMessage() {
return message;
}
public String getCity() {
return city;
}
}
@ConfigurationProperties
애노테이션을 사용하여 프로퍼티파일의 값을 스프링 빈의 필드와 매핑할 수 있다. prefix
에 프로퍼티 prefix를 등록한다.application.properties
로부터 Setter
방식과 Constructor
2가지 방식으로 프로퍼티값을 주입받을 수 있다. @ConstructorBinding
애노테이션을 붙여줘야한다.Getter
를 만들어준다.참고로,
properties
가 아닌yml
로 작성해도 동일하게 작동한다.
또한properties
파일에서는 보통 camelCase보다 kebab-case(단어를 - 로 연결) 하는 형태를 자주 사용하는데@ConfigurationProperties
를 통해 자바 객체로 바인딩 될때는 카멜케이스로 자동으로 변경이 되기 때문에 프로퍼티 파일에 케밥케이스를 사용했다 하더라도 자바파일에서는 자바 코드 컨벤션인 카멜케이스를 그대로 사용하면 된다.※
@Value
애노테이션에서는 문자형태를 그대로 지켜줘야 값을 받아온다.
// TestController.java
@RestController
public class TestController {
private final TestProperties testProperties;
public TestController(TestProperties testProperties) {
this.testProperties = testProperties;
}
@GetMapping("/test")
public String test() {
return testProperties.getMessage() + " / " + testProperties.getCity();
}
}
Getter
를 사용해서 값을 받아오면 된다.@Value
애노테이션을 사용할떄보다 많아진다.test.xxx
, test.yyy
...) @ConfigurationProperties 를 활용하는 방법이 더 좋을 것 같다.@Component
public class TestProperties2 {
public static String message;
@Value("${test.message}")
public void setMessage(String message) {
TestProperties2.message = message;
}
}
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return TestProperties2.message;
}
}
참고링크
https://stackoverflow.com/questions/7253694/spring-how-to-inject-a-value-to-static-field