spring이 제공하는 @Value은 application.yml 등과 결합하여 변수를 상수처럼 사용할 수 있는 유용한 애노테이션이다.
예를 들어, 다음과 같이 사용할 수 있다.
# applicatio.yml
example:
name: Han
age: 26
// Example.java
@RestController
@RequestMapping("/example")
public class Example {
@Value("${example.name}")
String name;
@Value("${example.age}")
String age;
@GetMapping
public String example() {
return "Name: " + name + ", Age: " + age;
}
}
// localhost:8080/example
Name: Han, Age: 26
@Value는 스프링이 제공하는 애노테이션이기 때문에, 스프링이 실행되어야 설정 파일에서 값을 꺼낼 수 있다.
그런데, 이런 생각을 해볼 수 있다.
"상수를 클래스 안에서 관리하면 지저분하니까 따로 상수 클래스를 만들자."
예를 들면 다음과 같다.
// ExampleInfo.java
public class ExampleInfo {
public static String name = "Han";
public static String age = "26";
}
// Example.java
@RestController
@RequestMapping("/example")
public class Example {
@GetMapping
public String example() {
return "Name: " + ExampleInfo.name + ", Age: " + ExampleInfo.age;
}
}
이렇게 되면 @Value와 같은 상수를 클래스에서 지저분하게 나열할 필요가 없다.
다만, 여기서는 "Han"과 같이 static string을 직접 넣어서 사용했는데, 그 이유는 @Value 애노테이션은 static 변수에 직접 매칭시킬 수 없기 때문이다. 예를 들어, 다음과 같이 설정하면 name 변수에는 "Han"이 아닌 null 값이 들어간다.
@Value("${example.name}")
public static String name; // null 값 들어옴
따라서, @Value를 static 변수에 매칭시키고 싶다면 다른 방법을 사용해야 한다.
바로 setter를 활용하는 방법이 있다.
@Component
public class ExampleInfo {
public static String name;
public static String age;
@Value("${example.name}")
public void setName(String name) {
this.name = name;
}
@Value("${example.age}")
public void setAge(String age) {
this.age = age;
}
}
이 경우 setter 주입을 통해 자동으로 해당 static 변수에 값이 할당된다. 단, 스프링이 실행될 때만 적용되고, @Component로 상수 클래스를 빈 등록해야 한다.
이제 static 문자열이나 상수들은 한 클래스에 모아두면서 코드를 더 깔끔하게 하도록 노력해야겠다.
'java > spring' 카테고리의 다른 글
[Spring] AWS S3 접근 (0) | 2022.07.25 |
---|---|
[Spring] S3 Pre-Signed URL 생성 (0) | 2022.07.25 |
[Spring] Spring Security + Swagger 3.0 적용 (0) | 2022.07.22 |
[Spring] Swagger 3.0 적용 (0) | 2022.07.16 |
[Spring] Spring Security + JWT 토큰을 통한 로그인 (57) | 2022.07.16 |