JWT를 설정할 때 @Value로 값을 가져오지 못합니다.

Hyeonjun·2022년 9월 27일
0

질문내용

properties 파일에서 값을 주입하려고 하는데, Jwt를 설정하는 util 클래스이기 때문에 static으로 사용하려 합니다. 이때 해당 변수가 static이기 때문에 설정이 되지 않습니다.

문제상황

JWT를 사용할 때 특히 발생하는 문제인 것 같다. 해당 질문으로 검색 시 대부분이 같은 오류로 헤메는 모습을 보이고 있다. 내가 진행했던 프로젝트에서도 jwt를 사용했으나 내가 담당하지 않았고, 프로젝트에서는 key값을 모두 그대로 올려버리는 만행(...)으로 사용해보지 못했던 부분이다. AWS S3를 연결하기 위해 해당 키를 가져오는 경우에는 @Value를 사용해 값을 가져오긴 했다.
문제가 되는 부분은 멤버 변수가 아닌 전역변수로 설정하면서 값이 주입되지 않는다는 것이였다. "그럼 static을 빼고 선언해서 사용하면 되잖아...?"를 위한 뒷받침이 필요했다.

문제 해결 과정

1. 왜 전역변수?

인스턴스로 선언하고 사용한다면 큰 문제 없이 값을 주입받고 사용할 수 있을 것으로 기대했다. 매번, 각기 다른 곳에서 사용하기에 전역변수로 사용하는 것 보다는 Bean으로 스프링 컨테이너에 저장하고 불러오는 방식이 더 편할 것이라 생각했다. Spring Container에 Bean으로 등록하면 단 하나의 객체로 관리되기에 여러 객체로 관리되는 이슈도 사라질 수 있다. 심지어는 이미 Bean에 등록도 되어있었다.

2. 그럼 멤버변수로 사용해보는 것은 어때요?

Spring은 static으로 선언된 전역 변수에 @Value로 값을 가져오지 못하도록 되어있다. 한 블로그에서 확인한 내용이 가장 정확할 것 같은데, static으로 선언된 변수, 즉 전역 변수는 애플리케이션이 실행되는 시점에 선언되는데, Spring에서 properties에 있는 값을 선언하는 시기가 달라 값을 주입할 수 없다는 의견이다. Spring에서 지원하지 않으니 그냥 멤버변수로 사용하면 좋을 것 같다는 생각이였다.

3. 그럼에도 전역변수로 사용해야 한다면,

static을 아주 사용할 수 없는 것은 아니였다.
보통은 setter에 @Value를 설정하는 것으로 static 변수에도 값을 주입할 수 있다.
다른 한 블로그에서 값을 주입하는 방법으로 제시한 내용이다.

@RestController
public class PropertyController {

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}

주입해야하는 값을 non-static 매서드를 통해 전달하도록 구현했다.

jwt를 사용할 때 다들 static을 사용하나?

결과적으로는 "멤버변수를 사용하면 된다!"라는 답변이지만, 대부분의 사람들이 jwt를 사용하면서 static에 @Value를 사용하면서 이슈가 있었으니, 정확하게 jwt를 사용하는 경우에는 어떤 방식을 사용하는지 궁금해졌다.

예시

무료 강의이긴 하지만 대다수의 긍정적인 피드백이 있었기에 해당 강의의 예제를 확인할 수 있었다. 특히 jwt에서 토큰을 처리하는 부분에서 답을 얻을 수 있었다.
본 예시의 경우에는
1. header는 전역변수로 설정하고 리터럴은 선언과 함께 지정했으며
2. 민감할 수 있는 정보인 secret과 tokenTime은 멤버변수로 두고, 생성자에서 값을 받아오는 방식
으로 구현하였다.
구현한 TokenProvider는 여기에서 사용되었으며, 스프링 빈에 등록되어있기에 객체를 스프링으로부터 주입받고 사용하는 모습을 보였다.
다행히도 생각했던 내용과는 크게 다르지 않았다.

결론

스프링에 대해 배울수록 스프링이 객체지향을 살려내기 위해 참 많은 노력을 했지 싶다. 스프링 컨테이너와 빈에 대한 이해가 있었다면 객체를 매번 불러와야한다는 생각을 덜어낼 수 있지 않았을까.
빠르게 많은 내용을 배울 수 있는 SSAFY이지만, 너무 빠른 나머지 내실을 챙기기는 힘들다는 것을 다시 한 번 느낀다.

Referece

https://badstorage.tistory.com/69
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-jwt#curriculum
https://github.com/SilverNine/spring-boot-jwt-tutorial
https://www.baeldung.com/spring-inject-static-field

profile
더 나은 성취

0개의 댓글