회사에서 암호화 관련 유틸을 만들고있던 과정에 발생한 일이다.
Aes256Utils 클래스를 리팩토링 하고있었다.
간단히 설명하자면,
본론으로 들어가서
아래 그림을 보면
나는 문제없이 동작할거라 예상했었지만 NPE가 발생하는것이였다.
생각해보니
@Value의 필드 주입시점을 잘 모르고 있었다.
@Value 어노테이션이 필드에 붙었다면
의존관계 주입 시점에 동작한다.
추측하건데 @Component 가 붙은 Aes256Utils 의 생성자 호출 시점은 스프링의 빈이 생성되는 시점일것이다.
참고로 스프링 빈의 생명주기는
즉, 2번의 빈의 생성시점에 Aes256Utils 생성자가 호출되고 key 값은 null 이며,
2번이 지나간 후에야 key 값에 환경변수가 초기화된다.
그러므로 Aes256Utils 의 생성자에 key.getBytes() 는 null 이며 NPE 가 발생하는것이다.
자 빈의 생명주기로 인해 null 이 들어간다는걸 알았다.
해결법은 바로 코드로 알아보자
위의 코드로 리팩토링을 하였다.
자 그럼 위의 코드를 보면 생성자 매개변수에 @Value 어노테이션을 넣었다.
결론적으로
해서 빈생성시에 @Value 어노테이션의 값을 환경변수 값으로 초기화 할수있다.
@Value 필드 주입의 경우는 스프링 빈이 생성자로 빈 생성 후 의존관계 주입시에 필드값이 초기화가 되므로 스프링의 빈 생명주기로 인하여 null 값이 필연적으로 들어가게 된다.
스프링의 빈 생성자에서 환경변수의 값을 초기화 하려면 생성자 매개변수에 @Value 어노테이션을 붙이자.
End