카테고리 없음

@Value로 프로퍼티 바인딩을 한 프로퍼티를 참조해서 또다른 프로퍼티를 생성하는 방법

martial 2022. 10. 4. 18:20

안녕하세요. 이번에도 제가 마주했던 에러를 가지고 왔습니다.

 

저는 kotlin/spring 환경에서 JWT로 인증인가를 구현하던 도중

기존의 base64EncodedSecretKey를 parameter로 받는 signWith method들이 deprecated가 되었기 때문에

deprecated가 되지 않은 Key parameter를 사용하는 방법으로 구현하던 도중 에러를 마주했습니다.

 

코드를 보시면

class의 body에서 secretKey를 프로퍼티 바인딩 해서 해당 base64EncodedSecretKey를 참조해서 Key를 생성하는 코드인데요.

기본적으로 kotlin은 class의 body안에서는 값이 할당된 변수만 들어갈 수 있습니다.

그렇기에 class의 body안에 프로퍼티 바인딩을 한 secretKey의 경우 lateinit을 사용해 선언해주었습니다.

 

바로 AccessToken을 발급받는 로직까지 개발을 하였습니다.

application run을 해보니 exception이 발생하였습니다.

 

발생한 exception은 다음과 같습니다.

exception을 읽고 유추를 해보니 secretKey가 초기화 되지 않은 상태에서 참조하여 key 프로퍼티를 생성해서 발생한 exceptin인거 같았습니다.

 

그래서 바로 @Value의 초기화 시점을 알면 쉽게 해결할 수 있을거 같아서 구글링을 해본결과 찾지 못했습니다.

여러 stackOverFlow, 공식 문서 다 뒤져봐도 제가 원하는 해답을 명쾌하게 내놓는 글이 없더군요..

 

혼자 끙끙 앓다가 문득 클래스를 생성할때 생성자를 사용하니까,

생성자에서 @Value 어노테이션으로 프로퍼티 바인딩을 하면 될까? 라는 생각으로 바로 실행에 옮겨 봤습니다.

application run을 한 결과 성공했습니다.

accessToken또한 발급이 잘 되네요.

 

생각해보면 JwtTokenProvider class가 생성자로 초기화 될때 secretKey를 프로퍼티 바인딩 해줘서 

바로 사용 가능한 프로퍼티가 되서 문제가 해결된거 같다고 유추하고 있습니다.

 

도움이 되셨다면 좋겠습니다.

또한 저도 이 모든 문제에 대해 무지한 상태로 포스팅을 한거기 때문에 제 포스팅이 맞다고 보장하진 못할것 같습니다.

이 문제에 대해 알고 계신분은 댓글로 피드백 해주시면 정말 감사할것 같습니다!