기본 _ Ch.7

yuKeon·2022년 11월 11일
0

Spring_Core

목록 보기
7/8
post-thumbnail

1. 의존관계 주입 방법

  • 생성자
  • 수정자(setter)
  • 필드

생성자 주입(권장)

@Autowired
      public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
  discountPolicy) {
          this.memberRepository = memberRepository;
          this.discountPolicy = discountPolicy;
      }
}
  • 생성자를 통해 의존 관계를 주입(생성자가 한 개인 경우 자동 설정)
  • 한 번만 호출되는 것을 보장
  • 불변, 필수 의존 관계에 사용
    • 불변 : 의존관계가 변경되지 않도록 설계

수정자 주입

/**생성자(setter) 주입**/
//    @Autowired public void setMemberRepository(MemberRepository memberRepository) {this.memberRepository = memberRepository;}
  • setter 메서드를 통해 의존관계 주입
  • 선택, 변경 가능성이 있는 의존관계에 사용

필드 주입

/**필드 주입**/
//    @Autowired private final DiscountPolicy discountPolicy;
  • 외부에서 변경이 불가능, 테스트가 힘들다, DI 프레임워크가 없으면 아무것도 할 수 없음
  • 사용 금지 (테스트 코드, @Configuration 만 사용)

2. 옵션처리

  • @Autowired(required=false) : 자동 주입 대상이 없으면 메서드 호출 안 됨
  • org.springframework.lang.@Nullable : 자동 주입 대상이 없으면 null 입력
  • Optional<> : 자동 주입 대상이 없으면 Optional.empty 입력

3. Lombok

@RequiredArgsConstructor

  • final이 붙은 필드에 생성자를 자동으로 만들어줌

@Autowired
      public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
  discountPolicy) {
          this.memberRepository = memberRepository;
          this.discountPolicy = discountPolicy;
      }
}
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

4. 조회 빈이 2개 이상일 때 해결법

@Autowired 필드 명

  • 타입 매칭
  • 타입 매칭 결과가 2개 이상 → 필드 명, 파라미터 명으로 빈 이름 매칭

@Qualifier

  • @Qualifier ****끼리 매칭
  • 빈 이름 매칭
@Component
  @Qualifier("mainDiscountPolicy")
  public class RateDiscountPolicy implements DiscountPolicy {}

@Component
  @Qualifier("fixDiscountPolicy")
  public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
  public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicydiscountPolicy) {
      this.memberRepository = memberRepository;
      this.discountPolicy = discountPolicy;
}

@Primary

  • @Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가진다.
  • @Primary vs @Qualifier : @Qualifier 우선 순위가 더 높음
  @Component
  @Primary
  public class RateDiscountPolicy implements DiscountPolicy {}

5. 자동 vs 수동

업무 로직 빈(컨트롤러, 비지니스 로직, 데이터 계층 로직, 리포지토리)

  • 로직 숫자가 많음
  • 유사한 패턴 존재

자동 기능 사용


기술 지원 빈(기술적 문제, 공통 관심사 AOP)

  • 로직 수가 적음
  • 서비스 전반에 영향을 미침

→ 수동 등록 사용(명확하게 표시)


정리

  • 편리한 자동 기능을 기본으로 사용
  • 직접 등록하는 기술 지원 객체는 수동 등록
  • 다형성을 적극 활용하는 비즈니스 로직은 수동 등록을 고민

0개의 댓글