의존관계 주입은 크게 4가지가 있다.
1. 생성자 주입
2. 수정자 주입(setter 주입)
3. 필드 주입
4. 일반 메서드 주입
생성자 주입
이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다.
지금까지 진행했던 방법이 바로 생성자 주입
특징
- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장
- 불변, 필수 의존관계에 사용
- 불변
- 한번 생성되면 바뀌지 않음
- 간단히 말하여 변할 수 없게 setter와 같이 수정할 수 있는 메소드를 만들지 않아야함
- 필수
- 관례적으로 생성자에는 값을 다 채워넣어야함.
- null을 허용한다고 명시되어있는 것이 아닌 경우에는
생성자가 딱 1개만 @Autowired를 생략해도 자동 주입된다.(스프링 빈에만 해당)
수정자 주입(setter 주입)
setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법
특징
- 선택, 변경 가능성이 있는 의존관계에 사용
- 선택
- memberRepository가 스프링 빈으로 등록되어 있지 않아도 사용가능
- @Autowired(required = false)로 지정하면 된다.
- 즉, 이는 주입할 대상이 없어도 동작하므로 필수가 아닌 선택임을 스프링에게 알려주는 것
- 변경
- 중간에 내가 인스턴스를 바꾸고 싶을 때 외부에서 강제로 호출하면 된다.
- 선택
- 자바빈 프로퍼티 규약의 수정자 메서드를 사용하는 방법
스프링 빈의 life cycle을 살펴보면 스프링 빈으로 모두 등록한 후에(컴포넌트 스캔 후)
의존관계를 주입한다.(@Autowired)
하지만 생성자를 통한 의존관계 주입은 스프링 빈 등록을 하면서 같이 주입된다.
빈을 등록하기 위해 객체를 생성할 때 어쩔 수 없이 생성자가 같이 호출되기 때문에
필드 주입
이름 그대로 필드에 바로 주입하는 방법이다.
특징
- 외부에서 변경이 불가능하여 테스트하기 힘들다는 치명적 단점 존재
- DI 프레임워크가 없으면 아무것도 할 수 없다.
- 사용하지 말자!
- 애플리케이션의 실제 코드와 관계 없는 테스트 코드
- 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용
- 수동 등록시 자동 등록된 빈의 의존관계가 필요할 때 문제를 해결할 수는 있음.
순수 자바 테스트 코드에서는 @Autowired동작 X
@SpringBootTest처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능하다.
일반 메서드 주입
일반 메서드를 통해서 주입 받을 수 있다.
특징
- 한번에 여러 필드를 주입 받을 수 있다.
- 일반적으로 잘 사용하지 않는다.
반응형
'Spring > Spring Core' 카테고리의 다른 글
생성자 주입을 선택해라!😠😠 (0) | 2021.03.18 |
---|---|
옵션 처리 (0) | 2021.03.18 |
중복 등록과 충돌 (0) | 2021.03.15 |
필터 (0) | 2021.03.15 |
탐색 위치와 기본 스캔 대상 (0) | 2021.03.13 |