의존 관계 주입 방법으로 크게 4가지 방법이 있다.
1. 생성자 주입
2. 수정자 주입(setter 주입)
3. 필드 주입
4. 일반 메서드 주입
▪️생성자 주입은 생성자를 통해서 의존 관계를 주입 받는 방법을 말한다.
▪️생성자 호출 시점에 딱 1번만 호출히 가능하다.
▪️불변, 필수 의존관계에 사용된다.
@Autowired
public OrderService(MemberRepository memberRepository, MemberService, memberService) {
this.memberRepository = memberRepository;
this.memberService = memberService;
}
}
생성자가 1개만 있으면 @Autowired는 생략해도 자동으로 주입된다.
▪️setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방식이다.
▪️setter메서드를 통해서 선택, 변경 가능성이 있는 의존관계에 사용된다.
@Autowired
public void setMemberRepository(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
setXxx, getXxx라는 메서드를 통해서 값을 읽거나 수정하는 규칙을 만들었는데, 이것이 자바빈 프로퍼티 규약이다.
▪️필드에 바로 주입하는 방식이다.
▪️코드가 간결하지만 치명적인 단점으로 외부에서 변경이 불가능해서 테스트하기하 어렵다.
▪️ DI 프레임워크가 없으면 아무것도 할 수 없다.
▪️사용하지 않는 것이 좋다.
@Autowired
private MemberRepository memberRepository
▪️일반 메서드를 통해서 주입 받을 수 있다.
▪️한번에 여러 필드를 주입 받을 수 있다.
▪️잘 사용하지 않는다.
@Autowired
public void init(MemberRepository memberRepository, MemberService memberService){
this.memberRepository = memberRepository;
this.memberService = memberService;
}
주입할 스프링 빈이 없어도 동작해야 할 때가 있다.
그런게 @Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.
▪️저동 주입 대상을 옵션으로 처리하는 방법
@Autowired(required = false)
자동 주입할 대상이 없으면 수정자 메서드 자체가 호출이 안된다.
바로 @RequiredArgsConstructor 어노테이션을 사용하는 것이다.
▪️롬북 라이브러리가 제공하는 @RequiredArgsConstructor기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
@RequiredArgsConstructor
public class OrderService {
private final MemberRepository memberRepository
}
정리하면 최근에는 생성자를 딱 1개 두고, @Autowired를 생략하는 방법을 주로 사용한다. 여기에 Lombok 라이브러리의 @RequiredArgsConstructor함께 사용하면 기능은 다 제공하면서, 코드는 깔끔해진다.