스프링

Springs-의존관계 주입과 옵션처리

백정탈 2023. 3. 3. 20:19

의존관계 주입

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

 

1.생성자 주입 수정자

2.주입(setter 주입)

3.필드 주입

4.일반 메서드 주입

 

생성자 주입 수정자

생성자 호출 시점에 딱 1번만 호출됨

불변,필수 의존관계 사용

주로 많이 사용한다.

 

생성자가 딱 1개만 있으면 @Autowired를 생략해도 된다.

예)

@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;
 }
}

수정자 주입(setter 주입)

setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.

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

하지만 의존관계 주입은 불변,필수여야 하는 경우가 많아 잘 쓰지 않는다.

예)

@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;
 }
}

필드 주입

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

외부에서 변경이 불가능해서 테스트 하기 힘들다.

웬만해서 쓰지 않는게 좋다. 다만 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용해라

일반 메서드 주입

일반 메서드를 통해서 주입 받을 수 있다.

이것도 웬만해서 잘 사용하지 않는다.


 

@Autowired 옵션처리

옵션처리 해야하는 이유: 주입할 스프링 빈이 없어도 동작해야 할때가 있다. @Autowired의 기본값은 true이기 때문에 주입대상이 없으면 오류가 발생한다.

 

3가지 방법

1.@Autowired(required=false)

2.@Nullable

3.Optional<>

 

 

@Autowired(required=false)

자동 주입할 대상이 없으면 메서드자체가 호출이 안된다.

@Autowired(required = false)
public void setNoBean1(Member member) {
 System.out.println("setNoBean1 = " + member);
}

 

@Nullable

자동 주입할 대상이 없으면 Null 호출

@Autowired
public void setNoBean2(@Nullable Member member) {
 System.out.println("setNoBean2 = " + member);
}

 

Optional<>

자동 주입할 대상이 없으면 Optional.empty를 출력한다.

@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
 System.out.println("setNoBean3 = " + member);
}