[의존관계 주입의 종류]
- 생성자 주입
- 수정자 주입
- 필드 주입
- 일반 메서드 주입
[생성자 주입]
- 생성자를 통해서 의존 관계를 주입 받는 방식이다.
- 불변, 필수적인 의존 관계에서 사용한다.
- 생성자의 경우 한 번만 호출이 보장되기 때문에 불변적인 경우에 생성자 주입을 한다.
- final이 붙어 객체를 꼭 돌려줘야 하는 필수적인 경우에 생성자 주입을 한다.
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
[참고할 사항]
생성자가 1개만 있을 땐 @Autowired를 써주지 않아도 스프링빈이 자동 등록을 해준다. (이것은 물론 스프링 빈에서만 해당하는 사항이다.)
[수정자 주입 - 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;
}
}
[참고할 사항]
- @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정해주면 된다.
- 자바빈 프로퍼티, 자바에서는 과거부터 필드의 값을 직접 변경하지 않고 setXXX,getXXX라는 메서드를 통해 값을 읽거나 수정하는 규칙을 만들었는데, 그것이 자바빈 프로퍼티 규약이다.
[필드 주입]
- 필드에 바로 주입하는 방식이다.
- 코드가 간결해서 사용하기는 쉽지만 외부 변경이 불가해 테스트가 힘들다
- DI 프레임워크가 없으면 아무것도 할 수 없다.
- 순수한 자바 코드로 테스트를 할 수 없다는 것이다.
- 요즘은 사용하지 않는 추세이다
- 사용하는 곳
- 애플리케이션과 관련 없는 테스트 코드
- 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
[참고할 사항]
- 순수한 자바 테스트 코드에는 당연히 @Autowired가 동작하지 않는다. @SpringBootTest 처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능하다.
- 다음 코드와 같이 @Bean 에서 파라미터에 의존관계는 자동 주입된다. 수동 등록시 자동 등록된 빈의 의존관계가 필요할 때 문제를 해결할 수 있다
[일반 메서드 주입]
- 일반 메서드를 통해서도 주입 받을 수 있다.
- 한번에 여러 필드를 주입 받을 수 있다.
- 일반적으로는 잘 사용하지 않는다.
[출처]
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Back-End > Spring' 카테고리의 다른 글
[Spring][스프링 기본편] - 22. 생성자 주입을 사용해야 하는 이유(의존관계 설정) (0) | 2022.01.28 |
---|---|
[Spring][스프링 기본편] - 21. 옵션 처리(의존관계 주입) (0) | 2022.01.28 |
[Spring][스프링 기본편] - 19. 컴포넌트 스캔 (0) | 2022.01.27 |
[Spring][스프링 기본편] - 18. @Configuration과 싱글톤 (0) | 2022.01.26 |
[Spring][스프링 기본편] - 17. 싱글톤 방식의 주의점 (0) | 2022.01.26 |