본문 바로가기
공부/Spring

[스프링 핵심](6) 의존관계 자동 주입 + 롬복

by 다음에바꿔야지 2024. 1. 16.

의존관계 주입 방법은 크게 4가지가 있다.

1. 생성자 주입

2. 수정자 주입(setter 주입)

3. 필드 주입

4. 일반 메서드 주입

 

==============================

 

1. 생성자 주입

생성자 호출 시점에 의존관계 주입.

*딱 1번만 호출되는 것이 보장된다.

*불변, 필수 의존관계에 사용

@Component
public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
	
    @Autowired	//생략 가능
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
         this.memberRepository = memberRepository;
         this.discountPolicy = discountPolicy;
     }
}

 

생성자가 딱 1개 있으면 @Autowired를 생략해도 자동 주입된다.(스프링 빈에만 해당)

 

2. 수정자 주입(setter 주입)

setter를 통해 의존관계 주입.

*선택, 변경 가능성이 있는 의존관계에 사용

*자바빈 프로퍼티 규약(setXxx, getXxx)의 수정자 메서드 방식을 사용하는 방법

@Component
public class OrderServiceImpl implements OrderService {
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }
}

 

3. 필드 주입

필드에 바로 주입하는 방법.

*코드가 간결하지만 외부에서 변경이 불가능해 테스트하기 힘들다.

*DI 프레임워크가 없으면 아무것도 할 수 없다.

*사용하지 말자!

@Component
public class OrderServiceImpl implements OrderService {
    @Autowired
    private MemberRepository memberRepository;
    @Autowired
    private DiscountPolicy discountPolicy;
}

 

 

4. 일반 메서드 주입

일반 메서드를 통해 의존관계 주입.

*한번에 여러 필드를 주입받을 수 있다.

*일반적으로 잘 사용하지 않는다.

@Component
public class OrderServiceImpl implements OrderService {
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
    @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
         this.memberRepository = memberRepository;
         this.discountPolicy = discountPolicy;
         } 
     }

 

결론: 생성자 주입을 사용해라!

불변

* 대부분 의존관계 주입은 애플리케이션 종료시점까지 변경할 일이 없다. 오히려 변경하면 안된다.

누락

* 객체를 생성할때 의존 관계를 주입해야하기 때문에, 주입 데이터를 누락했을때 컴파일 오류가 발생한다.

final 키워드

* 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.

* 나머지 주입 방식은 모두 생성자 이후에 호출되므로, 필드에 final 키워드를 사용할 수 없다.

 

반복되는 생성자 코드 작성이 귀찮다면 Lombok을 적용해보자.

Lombok의 @RequiredArgsConstructor를 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.

롬복이 자바의 애노테이션 프로세서라는 기능을 이용해서 컴파일 시점에 생성자 코드를 자동으로 생성해준다.