@Autowired 사용하지 않을 때
public class MemberService {
private MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void join(Member member) {
memberRepository.save(member);
}
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
public void deleteMember(Long memberId) {
memberRepository.deleteMember(memberId);
}
public void updateMember(Member member) {
memberRepository.updateMember(member);
}
}
@Autowired 사용할 때
public class MemberService {
@Autowired
private MemberRepository memberRepository;
public void join(Member member) {
memberRepository.save(member);
}
}
의존관계 주입 방법에는 @Autowired 어노테이션으로 의존관계 주입 방법에는 3가지와 일반 메서드 주입으로 총 4가지가 있다.
@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;
}
}
특징
장점
단점
@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;
}
}
특징
장점
단점
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
특징
private으로 지정할 수 있으므로, 필드의 캡슐화를 유지할 수 있다.장점
단점
null이 될 수 있다.@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;
}
}
특징
init을 만들어 의존성을 주입한다.결론: 생성자 주입을 선택하자!
이유
1. 불변: 생성자 주입은 객체 생성할 때 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계 가능하다.
2. 누락: 프레임워크없이 자바 코드를 단위 테스트하는 경우에 생성자 주입을 사용하면 주입 데이터를 누락했을 때, 컴파일 오류가 발생한다.
3. final 키워드: 생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있다. 생성자에 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.