Spring

Spring Basic- DI(의존 관계) 자동 주입

녁이 2023. 5. 19. 20:59
728x90
반응형

DI(의존관계 주입)에는 크게 4가지가 있다. 

1. 생성자 주입

2. 수정자 주입

3. 필드 주입

4. 일반 메서드 주입

 


1. 생성자 주입

  • 생성자(constructor)를 통해서 DI를 주입하는 방법
  • 1번만 호출되는 것을 보장
  • 불변, 필수 DI에 적용
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}

 

DIP,OCP 등을 위반하지 않도록 작성한 코드들 중 하나이며, OrderServiceImpl이라는 구현체, MemberRepository, DiscountPolicy 라는 인터페이스를 예로 들었다.

// 여기서 @Autowired 는 생성자가 1개일때 생략이 가능하다. ( 스프링 빈에만 해당 )

 

2. 수정자 주입

  • setter라는 수정자 메서드로 DI를 주입하는 방법
  • JavaBean property 규약의 수정자 메서드 방식 사용
    • JavaBean property, Java에서는 과거부터 필드 값을 직접 변경 X --> set__, get__ 메서드를 통해 수정
  • 선택, 변경 가능성이 있는 DI에 적용
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;

@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
	this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
	this.discountPolicy = discountPolicy;
}

// @Autowired 는 주입할 대상이 없으면 오류가 발생

// 주입할 대상이 없어도 동작하기 위해선 @Autowired( required = false ) 로 지정

 

3. 필드 주입

  • 필드에 바로 DI를 주입하는 방법
  • DI framework가 없으면 무쓸모
  • 코드가 간결
  • 외부에서 변경이 불가능 -> test가 용이하지 않음.
@Autowired
private MemberRepository memberRepository;

@Autowired
private DiscountPolicy discountPolicy;

// test가 힘들다는 단점때문에 사용이 꺼려짐

 

4. 일반 메서드 주입

  • 일반 메서드를 통해 DI를 주입
  • 한번에 여러 필드를 주입 받을 수 있음.
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;

@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}

init이라는 일반 메서드를 통해서 의존 관계를 주입했다.

※ 앞에서 말한 모든 DI 주입들은 스프링 컨테이너가 관리하는 스프링 빈이어야 가능하며 동작한다는 사실을 잊지 말자

 

 


다음 게시글

@Autowired를 통해 DI를 주입하는 데에 있어서 여러 가지 상황과 이에 대한 옵션 처리 

728x90
반응형