java/spring

[Spring] @Value, static 변수에 사용하기

danuri 2022. 7. 22. 14:35

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 문자열이나 상수들은 한 클래스에 모아두면서 코드를 더 깔끔하게 하도록 노력해야겠다.