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 |