본문 바로가기
Spring

의존관계 주입방법

by 쁘니쁘나 2022. 6. 4.

 

의존관계 주입 전 주의사항❗

의존관계 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다! 스프링 빈으로 등록되지 않은 일반 자바 클래스 Member 같은 클래스에서 @Autowired 를 아무리 해봐야 소용이 없다!!

 

생성자 주입

이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 또한, 생성자 호출 시점에 딱 1번만 호출되므로 불변, 필수 의존관계에 사용해야한다.

private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

@Autowired // ✅ 만약 생성자가 이것 하나뿐이라면 @Autowired 생략가능!!
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}

 

Lombok 라이브러리가 제공해주는 @RequiredArgsConstructor 를 사용하는것을 추천❗❗❗

최근에는 생성자를 딱하나만 써서 @Autowired 를 생략하고 클래스 상단에 @RequiredArgsConstructor 를 붙여 자동으로 생성자 주입을 해주는 방식을 사용하고있다고 한다. 아래의 예시로 쉽게 이해해 보자.

@Component
public class OrderServiceImpl implements OrderService {

  private final MemberRepository memberRepository;
  private final DiscountPolicy discountPolicy;

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

✅ 위의 해당코드를 @RequiredArgsConstructor 를 사용하여 간단히 변경할 수 있다. 아래 예시는 완전히 동일한 코드이다.

@Component
@RequiredArgsConstructor // final 이 붙은 의존관계에 대해 생성자를 만들어주는 어노테이션
public class OrderServiceImpl implements OrderService {

  private final MemberRepository memberRepository;
  private final DiscountPolicy discountPolicy;

}

✅ @RequiredArgsConstructor 를 사용하니 아주 간단한 코드가 되었다!!

 

Setter (수정자) 주입

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

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 를 붙이는 방식이다. 코드가 간결해서 편해보이지만 외부에서 변경이 불가능해서 테스트하기 힘들다! 스프링 설정을 목적으로하는 @Configuration 같은 곳에서만 특별한 용도로 사용하고 나머지에서는 사용하지 말자!!

@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;

 

일반 메서드 주입

일반 메서드를 통해서 주입 받을 수 있다. 한번에 여러 필드를 주입 받을 수 있지만 일반적으로 잘 사용하지 않는다. (생성자 주입으로 대신할 수 있기 때문에!)

private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;

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

 

 

 

 

 

참고


인프런 - 김영한의 스프링 기본편

댓글