개발하는 삶
spring (3) - 의존관계 주입 본문
@Autowired
- @Autowired(required = false) : 주입할 대상이 없어도 동작할 수 있게 하는 것 (예외처리 발생 X)
- 의존관계 주입
- 생성자 주입
- 수정자 주입
- 필드 주입
- 일반 메서드 주입
옵션 처리
- 자동 주입 대상을 옵션으로 처리하기
- @Nullable : 자동 주입할 대상이 없으면 null이 입력됨
- ex )
- @Autowired
- public void setNoBean2(@Nullable Member member) {...}
- Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력됨
- ex.
- @Autowired(required = false)
- public void setNoBean3(Optional<Member> member){...}
- @Nullable : 자동 주입할 대상이 없으면 null이 입력됨
생성자 주입
- 생성자를 통해서 의존 관계를 주입받는 방법
- 생성자 호출 시점에 딱 1번만 호출되니 불변하게 설계가 가능
- 주입 데이터가 없으면 컴파일 오류가 발생해서 없다고 알려줌
- 생성자 주입을 사용할 때 final 사용 가능
수정자 주입
- setter 라 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입함
필드 주입
- 코드가 간결. 그러나 테스트하기 힘든 단점.
- 사용하지 않는 걸 추천한다.
일반 메서드 주입
- 일반 메서드를 통해 주입 받을 수 있음
- 한번에 여러 필드를 주입받을 수 있음
- 일반적으로 잘 사용하지 않음
자동 주입 시 빈 2개 이상 문제
- @Autowired 는 타입으로 조회함
- @Autowired 필드명 매칭
- 특정 인터페이스를 구현한 클래스가 2개 이상일때 대상 클래스 이름으로 바꾸어줌
- @Autowired private DiscountPolicy discountPolicy 를 @Autowired private DiscountPolicy rateDiscountPolicy 로 변경하라는 뜻
- @Qualifier 사용
- 사용할 의존객체를 선택해 줄 수 있음
- @Qualifier끼리 매칭 -> 빈이름 매칭(빈이름이 같으면) -> 예외 발생
- @Autowired 밑에 @Qualifier("mainDiscountPolicy") 등록
- @Qualifier("등록할 클래스 빈이름 (Pro -> pro)")
- 또는 생성자 자동 주입. 생성자 앞에 붙임.
- @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy
- @Primary 사용
- 붙이면 우선권을 가지게 해줌
- 하지만 스프링은 자동보단 수동, 넓은범위 보단 좁은범위의 선택권이 우선됨
- @Qualifier 이 우선권이 높음 (더 상세하게 동작함)
- @Primary 는 기본값처럼 동작함
- @Primary, @Qualifier 활용
- 메인 데이터베이스(코드사용량 빈번)의 커넥션을 획득하는 스프링 빈
- @Primary 를 적용해서 조회하는 곳에서 @Qualifier 지정 없이 편리하게 조회함
- 서브 데이터베이스(가끔 사용)의 커넥션을 획득하는 스프링
- @Qualifier 을 지정해서 명시적으로 획득하는 방식으로 사용하면 코드를 깔끔하게 유지함
- 메인 데이터베이스(코드사용량 빈번)의 커넥션을 획득하는 스프링 빈
- @Autowired 필드명 매칭
애노테이션 직접 만들기
- @Qualifier("mainDiscountPolicy") 이렇게 적으면 컴파일시 타입체크가 안됨
- "" 안에 오타가 좀 나거나 해도 컴파일에서는 그냥 넘어감 -> 이후 에러생김
- 그래서 @Qualifier 랑 똑같은 효과를 가진 애노테이션 만들면 좋다! (ex : @MainDiscountPolicy)
- @Qualifier 속 애노테이션 전체 복붙 -> 원래있던 자리에 @MainDiscountPolicy 이런식으로 적어주면 됨
- @Qualifier 뿐만 아니라 다른 애노테이션도 함께 조합해서 사용 가능
- 무분별하게만 쓰지 않길
롬복
- @RequiredArgsConstructor
- final, @NotNull 이 붙은 필드를 모아서 생성자를 자동으로 만들어줌 (값 초기화 하는 생성자)
- 필드가 포함된 클래스 위에 추가시, 필드들의 생성자를 만들어 줌
- (보이진 않지만 생성되었고 호출 가능)
- 최근엔 생성자를 딱 1개 두고 @Autowired 을 생략. 롬복 기능까지 함께 사용.
// before
public class Example {
private final Pro pro;
@Autowired
public ProImpl(Pro pro){
this.pro = pro;
}
}
// after
@RequiredArgsConstructor
public class Example {
private final Pro pro;
}
'Spring' 카테고리의 다른 글
[Spring] HTTP Method (0) | 2022.07.11 |
---|---|
[Spring] 웹서버 (0) | 2022.07.09 |
[Spring] 스코프, 프록시 (0) | 2022.07.06 |
[Spring] 스프링 빈 (0) | 2022.07.03 |
[Spring] 스프링과 스프링부트 (0) | 2022.06.27 |