본문 바로가기
Spring

Spring 의존 주입 에러 상황

by 옹알이옹 2024. 2. 20.
목차

1. 기본 생성자에 의한 에러

2. 생성자 주입시 어노테이션과 직접 구현 우선순위

 


  1. 기본 생성자에 의한 에러

 

먼저 상황은 하나의 인터페이스에 대한 구현체가 5개 존재하고 해당 최초 구현체들에 대해 의존 주입을 받는 상황이다.

@Component
@RequiredArgsConstructor
@NoArgsConstructor
public class TestServiceFactory {

    private final TestService testServiceImpl1;
    private final TestService testServiceImpl2;
    private final TestService testServiceImpl3;
    private final TestService testServiceImpl4;
    private final TestService testServiceImpl5;

	...
}

 

그런데 해당 부분에서 컴파일 에러가 발생하였고, 우선 이유가 뭔지 몰라 final을 제거 한 뒤 사용해 봤지만
실제 구현체가 하나도 주입이 되지 않은 상황이었다.

원인은 @NoArgsConstructor에 있었다. 왜냐면 final을 붙였기 때문에 필수적으로 해당 필드 값을 초기화를 해주어야 하는데 기본 생성자는 함수 안에서 각 필드에 대한 값들을 초기화해주지 않는다.

그렇기 때문에 final을 붙였을 때 @NoArgsConstructor가 문제를 발생시킨 것이다.

@NoArgsConstructor를 제거하여 사용하여 final을 사용하였고, 실제 객체도 주입이 되는 것이 확인되었다.

 

  2. 생성자 주입 시 어노테이션과 직접 구현 우선순위

 

추가적으로 @RequiredArgsConstructor를 사용하고 기본 생성자를 직접 구현하면 어떻게 될지 테스트해보았다.

@Component
@RequiredArgsConstructor
public class TestServiceFactory {

    public TestServiceFactory() {
        
    }

    private TestService testServiceImpl1;
    private TestService testServiceImpl2;
    private TestService testServiceImpl3;
    private TestService testServiceImpl4;
    private TestService testServiceImpl5;

 

해당 상황에서도 당연히 각 필드에 final을 붙이면 컴파일 에러가 발생하므로 final을 제거하였다.

이후 스프링이 생성자를 통해 빈을 등록할 때 기본 생성자를 사용할지 아니면 @RequiredArgsConstructor를 통해
생성된 생성자를 사용할지 테스트를 해보았고 결론은 기본 생성자를 사용하여 실제 빈에 객체가 주입되지 않았다.

 

반대로 기본 생성자를 @NoArgsConstructor를 사용하여 생성하고, 5개의 인자를 가진 생성자를 직접 구현하면 
실제 빈이 등록된 것을 확인할 수 있었다.

 

결론은 스프링이 빈을 등록될 때 사용하는 생성자의 우선순위는 직접 구현이 어노테이션보다 우위에 있다.

해당 규칙은 생성자 뿐만 아니라 다른 상황에서도 똑같이 적용된다.

반응형

'Spring' 카테고리의 다른 글

Spring REST API @Valid  (0) 2024.03.06
Spring 비지니스 로직 위치  (0) 2024.02.25
Springboot ftp 파일 업로드/다운로드  (0) 2023.08.25
[Spring] CustomReponseEntity  (0) 2023.08.09