의존관계를 주입
하는 4가지 방법이 있다.
(주로생성자 주입
을 사용하며 어쩌다 한번setter 주입
사용)
- 종류
1) 생성자 주입
2) setter 주입(수정자 주입)
3) 필드 주입
4) 일반 메서드 주입
1. 생성자 주입
불변
/필수
의존관계에 적용- 생성자 호출시점에 1번만 호출되는것이 보장
- 생성자가 1개일 때
@Autowired
생략 가능- 시점
--> 스프링 컨테이너가 빈 등록 하면서 의존관계가 함께 설정된다
(빈 등록시 생성자가 실행되기 때문에)
2. setter 주입
선택
/변경
의존관계에 적용자바빈 프로퍼티 규약
의 수정자 메서드 방식을 사용하는 방법- 시점
--> 사용자가 생성된 객체를 직접set~
메서드를 호출해서 넣어준다
(즉, 스프링 컨테이너가 빈을 등록하는 1단계가 지난 후의 시점에서 적용하는 것)
@Autowired(required = false)
: 필수적으로 주입할 대상인지에 대한 명시 / true인데 주입 안해주면 오류 발생!
(기본적으로required
속성은true
로 되어있다)
3. 필드 주입
- 애플리케이션의 실제 코드와 관계 없는 테스트 코드에 사용
- 실제 코드에 사용하기에는 적합하지 않음
- 외부에서 변경이 불가능해서 테스트하기 힘들다는 단점이 있음
서로 객체를 참조
하는순환 참조
의 경우 문제가 발생
-->생성자 주입
은발생하지 X
-->생성자 주입
은먼저 빈을 찾고 그 다음에 없으면 생성
하기 때문
4. 일반 메서드 주입
- 일반적인 메서드를 사용해서도 의존관계를 주입할 수 있다
- 실제 사용 할 일은 없음
[ 정리 ] - 생성자 의존관계 주입을 사용하자!
- 의존관계 주입시 99%는
생성자 의존관계 주입
을 사용- 어~쩌다 한번
setter 의존관계 주입
을 사용함
불변
- 대부분의 의존관계 주입은 변경할 일이 없다
--> 오히려 변하면 안되는 경우가 많다- 수정자 주입을 사용하면 public 으로 열어두어야 한다
--> 누군가가 실수로 수정할수도 있고, 불변성이 필요한 속성을 열어두는 것은 좋지 않음누락
setter
생성자를 사용할 때 의존관계를 주입하지 않고 호출할 경우에
NPE(Null Point Exception)
이 발생
-->생성자 의존관계 주입
+final
키워드 사용하면 반드시 주입된 이 후 사용을 할 수 있어 이러한 오류가 예방된다
생성자 의존관계 주입
은 프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법
: 주입할 스프링 빈이 없어도 동작해야 할 때가 있다
즉, 자동 주입 대상을 옵션으로 처리하는 방법은 크게 3가지가 있다.
- 3가지 처리 방법
1)@Autoriwed(required = false)
: 아예 해당 메서드를 실행하지 않게 하는 것 !
2)@Nullable
: 해당 메서드를 실행하기는 하지만 null로 출력하게 하는 것 !
3)Optional<>
: Optional로 감싼 객체이기 때문에Optional.empty
출력 !
생성자 의존관계 주입
을 할 때 우리는생성자
코드를 반드시 삽입해야 했다.
그러나, 이러한 것과 Getter / Setter 조차 간편하게 처리해주는 플러그인이 바로롬복(Lombok)
[ 설정 ]
1) build.gradle
/* Lombok 설정 추가 */ configurations { compileOnly { extendsFrom annotationProcessor } } ... dependencies { /* Lombok 라이브러리 의존성에 추가 */ compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' ... }
2) 인텔리제이 설정
Preferences
->Annotation Preocessors
->Enable annotation processing
[ 적용 ]
@RequiredArgsConstuctor
: 생성자를 만들어서 필드를 넣어주는 코드를 대체한다
@Getter
/@Setter
: getter / setter를 어노테이션으로 대체!