의존관계 자동 주입

KJH·2023년 3월 6일
0
post-custom-banner

의존관계 주입 방법

생성자, 수정자, 필드 ,메서드 4가지

생성자 주입

  • 생성자를 통해 주입받는 방법
  • 생성자 호출시점에 단 한번만 (불변, 필수)

생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입

수정자 주입

  • setter을 통해 의존관계 주입
  • 선택, 변경 가능성이 있는 의존관계에 사용 (거의 사용할일 없음)

필드 주입

  • 필드에 바로 주입하는 방식
  • 코드가 간결하지만, 외부에서 변경 불가 => 테스트하기 어려움
  • DI 프레임워크가 없으면 암것도 못함
  • @Configuration 같은 곳에서만 특별한 용도로 사용
    웬만하면 사용하지 말자!!
    실무에서 많이씀

일반 메서드 주입

  • 일반적인 메서드를 통한 주입
  • 안씀

옵션 처리

주입할 스프링 빈이 없어도 동작해야 될 때

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

생성자 주입선택!!

과거에는 필드 주입을 많이 사용했지만, 최근에는 DI 프레임워크 대부분이 생성자 주입을 권장

불변

  • 대부분 DI는 애플리케이션 종료시점까지 의존관계가 변하면 안됨
  • 객체를 생성할 때 딱 1번만 호출됨

누락

  • 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우
    NPE 위험 방지

final 선언 가능

  • 생성자에서 뭔가를 잘못해도, 컴파일 시점에 막아줌
    final은 항상 생성자에서 들어가야됨

조회할 빈이 2개이상

@Autowired 는 타입으로 조회하는데, 같은 타입이 2개 이상이라면??

수동으로 등록해서 해결할 수도 있다

@Autowired 필드 명 매칭

@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 추가 매칭

@Qualifier

추가 구분자를 붙여주는 방법 (주입시 추가적인 방법을 제공)

주입할 객체, 주입받을 객체에 모두 @Qualifier 붙여줘야됨

빈등록할때

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy...

찾을때

 @Autowired
 public OrderServiceImpl(MemberRepository memberRepository, 
 @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
	...
    }

@Primary

@primary가 있으면, 다 무시하고 우선권을 가짐

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy{

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

  • Map<String, 타입>으로 주입받으면, 해당 타입의 <빈이름 :객체> Map을 받을 수 있다.
  • List로 주입받으면 모든 빈을 담아준다
    해당사향이 없으면 빈 컬랙션이나 Map을 주입한다

자동, 수동의 기준

웬만하면 자동을 쓰는 추세

애플리케이션은 크게 업무 로직, 기술지원 로직으로 나눌 수 있다.

  • 업무 로직 빈 : 컨트롤러, 서비스, 리포지토리 등
  • 기술 지원 빈 : 기술적인 문제나, 공통 관심사를 처리 (DB연결, 공통 로그 처리)

업무 로직의 경우는 자동 빈 권장

기술 지원 로직은 수가 매우 적고, 애플리케이션 전반에 걸쳐서 광범위한 영향
또한 적용이 잘 되나조차 파악하기 어려운 경우가 많음
따라서 수동으로 등록하여 설정정보에 바로 나타나게 하는것이 유지보수에 좋음

post-custom-banner

0개의 댓글