[Spring] 의존관계 자동 주입

ggamang·2023년 3월 29일
0

JAVA&Spring

목록 보기
17/27

다양한 의존관계 주입 방법

의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다

  1. 생성자 주입
    생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다
    불변, 필수 의존관계에 사용
    생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입된다
  2. 수정자 주입(Setter)
    선택, 변경 가능성이 있는 의존관계에 사용
  3. 필드 주입 → 사용하지 말기
  4. 일반 메서드 주입 → 잘 사용하지 않는다

옵션 처리

주입할 스프링 빈이 없어도 동작해야할 때가 있는데, @Autowired만 사용하면 required 옵션 기본값이 true라서 자동 주입 대상이 없으면 오류 발생

  1. @Autowired(required=false): 자동 주입할 대상이 없으면 메서드 자체를 호출하지 않는다
  2. org.springframework.lang.@Nullable: 자동 주입할 대상이 없으면 null을 입력한다
  3. Optional<>: 자동 주입할 대상이 없으면 Optional.empty를 입력한다

생성자 주입을 선택해라!

  • 불변
    의존관계 주입 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다
    수정자 주입 사용 시 set 메서드를 public으로 열어야 하는데, 누군가가 변경할 수 있어 좋은 설계가 아니다
    객체 생성 시 딱 1번만 호출되고 이후에 호출되는 일이 없어 불변 설계 가능
  • 누락
    생성자 주입 사용 시 주입 데이터 누락하면 컴파일 오류가 발생하기에 IDE에서 바로 어떤 값을 필수로 주입해야 하는지 알 수 있다. (수정자 주입의 경우 실행이 이루어진다)
  • final 키워드
    생성자 주입 사용 시 필드에 final 키워드 사용하여 값이 설정되지 않는 오류를 컴파일 시점에 막아준다

⇒ 항상 생성자 주입을 선택, 가끔 옵션이 필요하면 수정자 주입 선택하자

롬복과 최신 트랜드

@RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 필수로 하는 생성자를 자동으로 만들어준다
최근에는 생성자를 1개만 두어 @Autowired를 생략하는 방법을 주로 사용한다
여기에 lombok의 @RequiredArgsConstructor기능을 함께 사용하여 코드를 깔끔하게 유지한다

조회 빈이 2개 이상 - 문제

@Autowired는 Type으로 조회한다
Type으로 조회 시 선택된 빈이 2개 이상일 때 문제가 발생한다(ex. FixDiscountPolicy, RateDiscountPolicy 모두 빈으로 선언)

→ NoUniqueBeanDefinitionException 발생

@Autowired 필드 명, @Qualifier, @Primary

위의 문제 해결방법은 아래와 같다

  1. @Autowired 필드명 매칭
    @Autowired는 처음으로는 타입 매칭을 시도하고, 이 때 여러 빈이 있으면 필드 명, 파라미터 이름으로 빈 이름을 추가 매칭한다
  2. @Qualifier(등록이름)
    추가 구분자를 붙여주는 방법이다
    @Qualifier끼리 매칭된다
  3. @Primary - 자주 사용!
    우선순위를 결정지어 주는 방법이다

적용 우선 순위는 @Qualifier가 @Primary보다 더 높다

0개의 댓글