티스토리 뷰

728x90

문제

배포 환경과 개발 환경이 달라짐에 따라 기존에 개발 환경에서만 사용하던 URL들을 환경변수로 꺼내서 개발, 배포 환경에 따라 다르게 값이 들어가야 했다.

application.properties에 url을 꺼내 @Value("${host.url}")로 선언하고 사용하는 방법으로 사용하고자 결정했고 그대로 구현하였으나 아래와 같은 에러가 발생하며 프로젝트가 빌드되지 않는 문제가 발생했다.

 

Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found

 

@Service
@Transactional
@AllArgsConstructor
public class ItemService {

    @Value("${host.url}")
    private String url;

 

원인

원인은 lombok의 @AllArgsConstructor였다.

생성자를 만든다는 것은 스프링부트 컨테이너에 거기에 들어오는 값을 사용하겠다고(DI) 선언하는 것이다.

 

하지만 @AllArgsConstructor는 롬복에 의해 생성되는데 이때 필드에 있는 모든 값을 전부 긁어와서 읽어버리는 문제가 발생한다.

 

즉 이것은 롬복은 annotation을 읽지 못 하므로 아직 선언되지도 않은 값을 가져와서 읽으려고 시도하게 되고 이에 따라서 생성자 오류가 발생하는 것이다.

 

해결

해결 방법은 다음과 같다.

 

@AllArgsConstructor를 @RequiredArgsConstructor로 바꾸어 사용한다.

@AllArgsConstructor는 애초에 모든 값을 읽으려고 시도하기 때문에 어떠한 상황에서도 사용하지 않는 편이 좋다.

 

@Service
@Transactional
//@AllArgsConstructor 사용하지 않는 것이 좋다.
@RequiredArgsConstructor
public class ItemService {

    @Value("${host.url}")
    private String url;

 

동작하는지 확인해본 코드는 아니나 아래와 같이 @Autowired 방식으로도 사용할 수 있다고 한다.

@Autowired
@Generated
public MyService(@Value("${my.config.value}") final String myField, final Object myDependency) {
    this.myField = myField;
    this.myDependency = myDependency;
}

 

레퍼런스

https://stackoverflow.com/questions/69798490/getting-null-value-for-value-with-allargsconstructor

 

Getting null value for @Value with @AllArgsConstructor

I am getting null as a value when I use @Value with @AllArgsConstructor combination. @Service @Slf4j @AllArgsConstructor public class ReconService{ private ReconRepo reconRepo; private

stackoverflow.com

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함