@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을 찾아서 주입해준다.
'BackEnd > Spring' 카테고리의 다른 글
[Spring] Quartz 를 통한 스케줄링 등록 (0) | 2024.09.03 |
---|---|
[Spring] MVC HandlerInterceptor / Interceptor를 사용하여 HTTP 요청을 가로채는 방법 (0) | 2023.06.19 |
[Spring] com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class 오류 해결 (0) | 2023.02.28 |
MVC 패턴, Dispatcher-Servlet 정리 (0) | 2023.01.05 |
[SPRING] @RequestBody / @ResponseBody / Jackson2HttpMessageConverter (0) | 2022.10.26 |