나의 브을로오그으

#7-1. [스프링 핵심 원리-기본편] - 의존관계 주입 방법 본문

Spring

#7-1. [스프링 핵심 원리-기본편] - 의존관계 주입 방법

__jhp_+ 2022. 7. 27. 08:08

다양한 의존관계 주입 방법

- 생성자 주입

- 수정자 주입(setter 주입)

- 필드 주입

- 일반 메서드 주입

 

 

생성자 주입

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

- 이름 그대로 생성자를 통해 의존성 주입

- 생성자 호출 시점에 딱 1번만 호출되는 것을 보장함.

- 주로 불변, 필수 의존관계에 사용

- 생성자가 1개면 @Autowired를 생략 가능

 

 

수정자 주입(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;
 }
 
}

- 선택, 변경 가능성이 있는 의존관계 주입

 

※참고 : @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정하면 된다.

 

 

자바 빈 프로퍼티 규약 예시

class Data {
 private int age;
 
 public void setAge(int age) {
   this.age = age;
 }
 
 public int getAge() {
   return age;
 }
}

※참고 : 자바 빈 프로퍼티, 자바에서는 과거부터 필드의 값을 직접 변경하지 않고, setXXX, getXXX라는 메서드를 통해서 값을 읽거나 수정하는 규칙을 만들었는데, 그것이 자바빈 프로퍼티 규약이다.

 

 

필드 주입

@Component
public class OrderServiceImpl implements OrderService {
 @Autowired
 private MemberRepository memberRepository;
 @Autowired
 private DiscountPolicy discountPolicy;
 
}

- 필드에 바로 집어넣는 방법

- 다만 필드주입은 스프링에서 더이상 권장하지 않음.

- 코드는 간결하지만, 변경이 불가능해서 테스트하기 힘들다.

- 필드주입을 할거면 테스트 코드에서만 사용하길 권장한다.

 

 

일반 메서드 주입

@Component
public class OrderServiceImpl implements OrderService {
 private MemberRepository memberRepository;
 private DiscountPolicy discountPolicy;
 
 @Autowired
 public void init(MemberRepository memberRepository, DiscountPolicydiscountPolicy) {
   this.memberRepository = memberRepository;
   this.discountPolicy = discountPolicy;
 }
}

- @Autowired만 붙여주면 의존성주입을 해준다. 다만 이 방법은 거의 쓰지 않는다.

당연한 이야기이지만 @Component를 통해 스프링 빈으로 등록된 클래스만이 @Autowired가 가능하다.