본문 바로가기
BackEnd/Spring

@Value 애너테이션이 property 값을 null로 받아오는경우

by 성은2 2024. 8. 14.

@Value 애너테이션이 property 값을 받아오지 못하는 경우는 여러가지가 있다.

일단,

1.문법도 프로퍼티명도 틀리지 않았고,

2. 빈으로도 정상적으로 등록했을 경우 최종최종~ null 오류였던 코드를 메모했다.

* Bean으로 등록되지 않은 경우란?

  • 클래스를 Bean으로 등록하지 않으면 Spring이 의존성 주입을 할 수 없다.
  • 나같은 경우, UploadSftp 클래스를 @Component 애너테이션으로 Bean 등록을 했기 때문에 문제가 없었다.

 

또한 FileUploadController.java 라는 다른 코드에서는 똑같은 문법으로 작성했을때 env.properties 파일에서 값을 잘 받아왔다. 그런데 새로 만든 UploadSftp.java 에서만 null 오류 발생.

 

@Value("#{env['FLOOR_SFTP_USERNAME']}")
private String FLOOR_SFTP_USERNAME;

 

요 값으로 읽어올 때 계속 null.. 

 

분명, 다른 서비스단에서는 잘 불러오고, 그렇다고 @Component 등록을 안한 것도 아닌데 왜? 

Spring에서 못 가져올까..

이유는, Controller에서 UploadSftp의 소스를 호출할 때 new로 생성했기 때문이었다.

 

// 오류코드 

UploadSftp uploadSftp = new UploadSftp(); // 오류코드 
ResponseCode uploadResult =  uploadSftp.doJsch();

 

// 해결

@Autowired
private UploadSftp uploadSftp;

ResponseCode uploadResult =  uploadSftp.doJsch();

 

// 해설

* 외부에서 해당 클래스를 new로 생성했을 경우

  • @Value 애너테이션은 Spring Context에 의존하기 때문에 해당 클래스가 Spring Bean으로 등록되어 있지 않으면 @Value 값은 null을 반환한다.
  • 따라서 new로 클래스 인스턴스를 생성하면 Spring Bean으로 등록되어 있지 않기 때문에 @Value 값이 null을 반환했던 것이다.
  • 등록된 Bean을 사용하기 위해서는 @Autowired 애너테이션을 사용해야 한다. @Autowired 애너테이션은 해당 타입의 Bean을 찾아서 주입해준다.