supremest.35 개발 블로그

[Spring Boot] @Value 어노테이션이 값을 못 가져온다. 본문

Study/Spring Framework

[Spring Boot] @Value 어노테이션이 값을 못 가져온다.

supremest.35 2022. 5. 26. 23:16

@Value 어노테이션을 이용해서 테스트 환경에서와 실서비스 환경에서 메일 전송 문구를 다르게 하려고 했다.

환경변수 env 값은 dev, prod 로 나눴다.

 

dev 에서는 '테스트'라는 문구를 추가하고 prod에는 사용자가 등록한 폼을 그대로 전송했다.

메일 전송 로직을 구현한 뒤 해당 클래스에 @Component 어노테이션을 붙였다.

 

메일 전송 메소드(test()메소드)를 컨트롤러에서 실행했다.

 

환경변수 env값이 local이었기에 로그에 local라는 값이 찍혀야하지만 null값이 찍혔다.

구글링 결과 이유를 찾았다.

 

문제는 컨트롤러에서 test()메서드를 실행하기 전 testComponent객체를 생성하는 과정에서 문제가 발생했다.

 

스프링 빈 객체는 기본적으로 싱글톤으로 생성된다.

TestComponent 객체의 경우 @Component 어노테이션을 통해 인스턴스화 되어 스프링 빈으로 등록되었다.

빈으로 등록된 TestComponent객체는 등록될 때 @Value() 안에 값이 들어간 상태로 객체가 만들어진다.

 

컨트롤러에서 이미 스프링 빈으로 등록된 TestComponent 객체가 아닌 new 키워드를 통해 새로 생성된 객체를 사용했기 때문에 @Value로 불러온 환경설정 값이 null이 되었다.

 

컨트롤러에서 생성한 객체는 스프링 빈으로 등록되지 않았기 때문에 @Value어노테이션이 작동하지 않았다!

 

컨트롤러를 다음과 같이 변경하니 @Value의 값을 정상적으로 불러왔다.

 


참고문서