Cute Running Puppy

🍃Spring

# @Autowired 보단 생성자 주입 방식? @RequiredArgsConstructor란?

뭉지맘 2025. 5. 28. 11:05

@Autowired보다 생성자 주입 방식을 더 많이 쓰는 이유 ?

 

 1. 불변성(immutability) 확보 : 실수 방지 ( @Autowired는 나중에 값이 바뀌는 걸 방지할 수 없다.)

 2. 테스트가 쉬워짐 : Mock 주입하려면 Spring context 필요 → 느림

 3. 순환 참조 방지에 도움 : 생성자 주입은 순환 참조가 있으면 애초에 애플리케이션이 실행되지 않음 → 문제를 초기에 바로 발견할 수 있음

 

Spring 공식 문서에도 생성자 주입 방식 기본으로 쓰라고 권장하고 있다고 한다.

 

그래서 자주쓰이는 짝꿍이 @RequiredArgsConstructor다.

@RequiredArgsConstructor

이걸 클래스에 붙이면,
final로 선언된 필드들만 파라미터로 받는 생성자를 자동으로 만들어주는 Lombok에서 제공하는 어노테이션이다.

 

예제

@RequiredArgsConstructor
public class MemberService {
    
    private final MemberRepository memberRepository;
    
    private final EmailService emailService;

    private String someTempValue; // <- 이건 생성자에 포함되지 않음
}

이렇게하면 아래 생성자가 자동 생성된다.

public MemberService(MemberRepository memberRepository, EmailService emailService) {
    this.memberRepository = memberRepository;
    this.emailService = emailService;
}

즉 DI(의존성 주입)시 자주 쓰이는 패턴!

 

상황 쓰면 좋은 이유
불변 객체 설계 final 필드만 받는 생성자니까 객체의 일관성 유지에 유리
스프링 DI 생성자 주입 방식으로 final 필드 주입 간편