Spring

[Spring] Spring 핵심 원리 : @Autowired, 다양한 의존관계 주입 방법

yjk490 2023. 7. 14. 13:57

생성자 주입

생성자는 객체 생성 시점에 단 1회만 호출된다. 그래서 생성자를 통해 의존관계를 주입하면 객체의 불변성이 보장된다. 또한, 생성자는 의존관계를 문법적으로 강제한다. 즉, 객체 생성 시 생성자에 정의한 매개변수를 전달하지 않으면 컴파일 에러가 발생한다. 그래서 생성자 주입은 불변, 필수 의존관계에 사용된다.

생성자 주입에서 생성자가 한 개인 경우 @Autowired 애노테이션을 생략해도 자동 주입된다. 단, 스프링 빈으로 등록되어 있어야 한다.

@Component
public class MemberServiceImpl implements MemberService {
    private final MemberRepository memberRepository;

    @Autowired	// 생성자가 1개인 경우, @Autowired 애노테이션을 생략해도 됨
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

setter 메서드 주입

setter 메서드를 통해 의존관계를 주입받는다. setter 메서드는 여러 번 호출할 수 있기 때문에 개발자가 임의로 코드를 추가함으로써 혹은 프레임워크의 동작에 따라 런타임 중 의존관계를 변경할 수 있다. 또한, 생성자처럼 객체 생성 시 의존관계가 주입될 것을 강제하지 않으므로 의존관계를 선택적으로 주입할 수 있다. 그래서 선택, 변경 가능성이 있는 의존관계에 사용된다.

@Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생하지만 required 옵션을 false로 지정함으로써 정상 동작하도록 지정할 수 있다.

@Component
public class MemberServiceImpl implements MemberService {
    private MemberRepository memberRepository;

    @Autowired(required = false)
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

필드 주입

필드 주입은 이름 그대로 필드에 @Autowired를 붙이는 것이다. 코드는 간결하지만 DI 컨테이너가 없으면 아무것도 할 수 없다. 외부에서 변경이 불가능하기 때문에 테스트하기 힘들다는 단점이 있다. 테스트를 위해 의존 객체를 주입하는 setter 메서드를 선언해야 하는데 setter 메서드 주입이 있다는 걸 고려하면 비효율적이다. 그래서 권장되는 방법은 아니다.

@Component
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberRepository memberRepository;
}