본문 바로가기
Spring-Java/Spring

@RequiredArgsConstructor

by 현대타운301 2023. 12. 21.

 

세 줄 요약

롬복에서 지원하는 생성자 DI를 위한 어노테이션

스프링 4.3부터 해당 어노테이션으로 더욱 간단하게 DI 가능

final 혹은 @NonNull이 붙은 필드에 대해서만 적용됨

 


 

의존성 주입 (DI)

 

* DI(Defendency Injection)?

: 객체를 생성해줌으로써 의존관계가 성립되는 것을 의미. XML 파일을 통해 직접 설정하거나, @Autowired 어노테이션을 사용해 주입.

 

1) 생성자(Constructor) 주입

@Controller
public class DummyController {

    private DummyService dsvc;

    @Autowired	// 생성자 주입
    public DummyController(DummyService dsvc) {
        this.dsvc = dsvc;
    }
}

 

 

2) 수정자(Setter) 주입

@Controller
public class DummyController {

    private DummyService dsvc;

    @Autowired	// Setter 주입
    public void setDsvc(DummyService dsvc) {
        this.dsvc = dsvc;
    }
}

 

 

3) 필드(Field) 주입

@Controller
public class DummyController {

    @Autowired	// 필드 주입
    private DummyService dsvc;
    
}

 


 

생성자 주입을 권장하는 이유?

 

* 스프링에선 아래와 같은 이유로 생성자 주입을 권장함

 

생성자 주입의 장점

1) 불변 객체

2) not null 보장

3) 코드 호출 시 완전히 초기화 되어 전달

출처:https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html

4) 순환참조방지

출처:https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html

 


 

@RequiredArgsConstructor

 

생성자 생략

스프링 4.3부턴 생성자 선언이 하나만 된 상태라면 생성자 생략가능.

단, 여러 개의 생성자가 선언된 상태라면 반드시 하나는 @Autowired 어노테이션이 붙어야 함.

출처:https://docs.spring.io/spring-framework/reference/core/beans/annotation-config/autowired.html

 

 

@RequiredArgsConstructor

final 혹은 @NonNull이 붙은 필드에 대해 자동으로 생성자를 생성해 DI 시전하는 어노테이션 (from 롬복 라이브러리)

즉, 스프링 4.3부턴 생성자 생략 → 롬복과 결합 → 생성자 주입 방식을 필드 주입 방식과 유사하게 사용 가능

출처:https://projectlombok.org/features/constructor

 

 

생성자 주입(+ @RequiredArgsConstructor)

@Controller
@RequiredArgsConstructor
public class DummyController {

    @Autowired	// 생성자 주입(with 롬복)
    private final DummyService dsvc;

}