스프링 : 의존관계주입

Jaemin_Eun·2024년 11월 16일

의존관계주입방법

  1. 생성자 주입
    특징 : 생성자 호출 시점에 딱 1번만 호출 보장
    불변, 필수 의존관계에 사용함
    스프링 빈 등록시에 호출됨
  2. 수정자 주입
    특징 : setter 메서드로 의존관계 주입
    선택, 변경 가능성이 있는 의존관계에 사용
  3. 필드 주입
    필드에 바로 주입하는 방법, 추천되지 않음
    특징 : 외부에서 변경이 불가능해서 테스트가 힘듬
    DI프레임워크가 없으면
    어플리케이션 실행과 관계없는 테스트에는 사용가능
    스프링 설정하는 Configuration에서 특별한 목적으로 사용
  4. 일반 메서드 주입
    특징 : 한번에 여러 필드를 주입 받을 수 있다.
    거의 사용하지 않음

옵션처리

주의할 스프링 빈이 없어도 동작해야 할 때가 있다.

  1. Autowired(required = false)
  2. SpringFramework - @Nullable
  3. Optional

생성자 주입을 선택

장점

  1. private final을 사용 가능 -> 혹시 모를 생성자에서의 오류 검출
  2. 데이터 누락시에 컴파일 오류가 발생해서 검출가능
  3. 프레임워크에 의존하지 않고 순수 자바 언어의 특징을 잘 살릴 수 있는 방법

롬복

생성자 주입을 사용할 때, 테스트 작성할 때 너무 이것저것 작성할 것이 많다.

롬복

  1. @Getter, @Setter, @ToString 등 다양한 기능 지원(개편함)
  2. @RequiredArgsConstructor : 생성자 자동으로 생성
    -> 생성자 직접 안만들어도됨 ㄷ;

최근에는 생성자를 딱 1개 두고, @Autowired를 생략하는 방법을 주로 사용

조회할 빈이 두 개 이상

하위타입을 빈으로 지정하는 것은 DIP를 위배하고 유연성이 떨어짐.
그리고 이름만 다르고, 완전히 똑같은 타입의 빈이 2개 있을 때 해결이 안된다.

@Autowired 필드명, @Qualifier, @Primary

  1. @Autowired fieldName
    @Autowired 는 타입매칭을 시도하고, 이때 여러빈이 있으면 필드명, 파라미터 이름으로 빈이름을 추가한다.
    -> 타입매칭 시도하고, 결과가 2개 이상이면 필드명, 파라미터 명으로 빈 이름을 매칭

  2. @Qualifier
    그냥 Qualifier를 찾는 용으로만 사용하는게 좋음
    단점 : 모든 코드에 어노테이션을 붙여야 함

  3. @Primary
    우선순위를 정해줌

@Primary 보다 @Qualifier가 더 세세하게 동작함
스프링은 항상 자동보다 수동이 우선순위가 높음
따라서 primary < qualifier

Annotation 직접 만들기

@Qualifier를 쉽게 사용할 수 있는 방식
@Qualifier("이름")에서 문자를 잘못 입력해서 발생하는 오류 방지 가능

조회한 빈이 모두 필요할 때 List, Map

의도적으로 정말 해당 타입의 빈이 모두 필요할 때
=> test.autowired.AllBeanTest

0개의 댓글