Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

백정탈의 개발 블로그

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

스프링

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

'스프링' 카테고리의 다른 글

Spring-서블릿  (0) 2023.03.14
Spring-빈 생명주기 콜백  (0) 2023.03.08
Spring-컴포넌트 스캔  (0) 2023.03.01
Spring-싱글톤 컨테이너  (0) 2023.02.27
spring-스프링 컨테이너와 스프링 빈  (0) 2023.02.27