의존 관계 주입

박지원·2024년 2월 8일

Spring

목록 보기
5/9
post-thumbnail

의존 관계 주입 방식

생성자 주입

  • 생성자를 통해 의존 관계 주입하는 방법
  • 특징
    • 생성자 호출 시점 1번만 호출이 보장
    • 불변, 필수 의존 관계에서 사용
      • final 은 값이 있음을 보장
      • 생성자가 하나만 있으면 Autowired 를 생략해도 된다! 자동으로 의존 관계 주입이 일어난다

수성자 주입 (setter 주입)

  • setter 라고 불리는 필드의 값을 변경하는 수정자 메소드를 통해 의존 관계 주입 하는 방법
  • set + Autowried 가 있으면 연간관계 자동 주입
  • 특징
    - 선택, 변경 가능성이 있는 의존 관계에 사용
    • 자바빈 프로퍼티 규약 : setXxx, get Xxx 메서드 통해 값을 읽거나 수정하는 규칙

필드 주입

  • 필드에 바로 주입하는 방식
  • 특징
    - 외부에서 변경이 불가능해서 테스트가 어려움
    • DI 프레임 워크가 없으면 아무것도 할 수 없다
      - 변경해야 할 경우 setter 를 따로 만들어서 변경해야한다
  • @Autowired는 스프링 컨테이너를 테스트에 통합한 경우에만 가능

일반 메서드 주입

  • 일반 메스드 통해 주입 가능
  • 특징
    - 한번에 여러 필드 주입 받을 수 없다
    • 일반적으로 잘 사용 x
  • 의존 관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작!

옵션 처리

  • 스프링 빈이 없어도 동작해야하는 경우가 있다
  • @Autowired 사용하면 기본값 (required = true) 오류 발생

옵션 처리 방법

  1. @Autowired(requred = false) : 수정자 메서드 자체 호출 x
  2. @Nullable : 자동 주입할 대상이 없으면 null 입력
  3. Optional<> : 자동 주입할 대상이 없으면 Optioanl.empty 입력

생성자 주입 선택하자!

불변

  • 의존 관계 주입은 보통 한 번 일어나면 종료시점까지 의존 관계를 변경할 일이 X
  • 수정자 주입을 사용하면 set 메서드를 Public 으로 열어두어야한다. -> 변경가능
  • 생성자 주입은 객체를 생성할 때 딱 한 번만 호출되므로 불변하게 설계 가능

누락

  • @Autowired 가 프레임 워크 안에서 동작할 때는 의존관계가 없으면 오류가 발생
  • 순수한 단위 테스트 시, 생성자 주입을 사용하며 의존성 주입을 하면 컴파일 오류가 발생해 에러를 쉽게 해결 가능

final

  • 생성자 주입을 사용하면 final 키워드 사용 가능
  • 값이 설정되지 않는 오류를 컴파일 시점에 막아줌

정리 (생성자 주입을 선택해야하는 이유!!)

  • 프레임 워크에 의존 X, 순수한 자바 언어의 특징을 잘 살리는 방법
  • 필수값이 아닌 경우 수정자 주입 방식을 옵션으로 부여
    -> 생성자 주입 (기본) , 수정자 주입(필요시)

롬북과 최신 트랜드

  • @ RequiredArgsConstructor : final 이 붙은 필드를 모아 생성자를 자동으로 만들어준댜
  • 최근에는 생성자 하나(@Autowired 생략) , @ RequiredArgsConstructor 을 같이 많이 사용

조회 빈이 2개 이상

  • @Autowired 는 타입으로 조회 ( ac.getBean(DiscountPolicy.class)

해결 방법

@Autowired 필드맹 매칭

  • 타입 매칭 -> 필드 이름 -> 파라미터 이름 순으로 매칭

@Qualifier 매칭

  • 주입시 추가적인 방법 제공하는 것(빈이름 변경 X)
  1. 빈 이름 등록시 @Qualifier("mainDiscountPolicy")
  2. 주입시에 @Qualifier 를 붙이고 등록한 이름 붙인다
  • 못찾을 경우 mainDIsountPolicy 라는 이름의 스프링 빈을 추가로 찾는다
  • @Primary 보다 우선순위가 높다
    ->
  1. Qualifier 끼리 매칭
  2. 빈 이름 매칭
  3. NoSuchBeanDefinitionException발생

@Primary 사용

  • 우선순위 부영하는 방법
  • Autowired 시 여러개 매칭되면 우선권을 가짐

0개의 댓글