ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 의존관계 자동 주입
    스프링 2021. 9. 6. 11:55

    김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.

     

    스프링 핵심 원리 - 기본편 - 인프런 | 강의

    스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주

    www.inflearn.com


     

    의존관계 주입 방법

    • 생성자 주입
    • 수정자 주입
    • 필드 주입

     

    생성자 주입

    생성자를 통해서 의존 관계를 주입받는 방법

     

     

    특징

    • 생성자 호출 시점에만 호출된다.
    • 불변하는 의존관계에 적용하면 좋다

     

    생성자에 Autowired를 선언해 자동주입을 선언

     

     

    필요한 인자들이 자동주입 된 것을 볼 수 있다

     

     


     

    수정자 주입(setter 주입)

     

    setter 메소드를 통해서 의존관계를 주입하는 방법

    setter 메소드에 @Autowired를 붙여주면 된다

    선택이나 변경의 가능성이 있는 의존관계에 사용하면 좋다. 

     

    수정자에 Autowired를 선언해 자동주입을 선언
    필요한 인자들이 자동주입 된 것을 볼 수 있다

     

    * 그 외에 일반 메소드에 @Autowired를 붙여 일반 메소드를 통해서 의존관계 주입을 할 수도 있다.

     

     

     


     

    필드 주입

    필드에 바로 의존관계를 주입하는 방법

     

     

    * 외부에서 변경이 불가능하기에 테스트하기가 힘들다

    * DI 프레임워크가 없으면 아무것도 할 수 없다

    * 그러니 사용하지 말자!

     

    필드에 Autowired를 선언해 자동주입을 선언
    필요한 인자들이 자동주입 된 것을 볼 수 있다

     

    DI 프레임워크가 없으면 아무것도 할 수 없기 때문에 순수 자바 테스트 코드에는 @Autowired가 동작하지 않는다.

     

     

     

     

    이 세가지 방법 중에서 '생성자 주입' 방식을 스프링 프레임워크에서 권장하고 있다.

     


     

    생성자 자동주입의 장점 

    • 한번 생성자를 호출하면 이후에 변경될 일이 없다. 따라서 누가 실수로 의존관계를 변경 할 일이 없어진다.
    • Final 키워드를 사용할 수 있어 값이 설정되지 않는 오류를 컴파일 시점에 막아준다
    • 순수 자바코드로 테스트를 하기에 간편하다

     

    순수 자바코드로 테스트

    수정자 자동주입을 사용하는 빈
    순수 자바코드 테스트, 24번라인을 보면 NPE가 날 경우 테스트를 통과하도록 했다
    테스트 통과, NPE가 발생한 것을 알 수 있다.

     

    수정자 주입은 이렇게 순수 자바 코드로 테스트를 할경우 NullPointerException이 발생한다

    생성자 자동주입을 활용할경우 아예 객체를 생성할 때 컴파일타임에서 에러가 발생하여 에러를 처리하기 쉽다

     

     


     

    @Autowired와 @Qulifier, @Primary

     

    자동주입을 하는데 조회대상 빈이 2개 이상일 때의 해결방법

    @Autowired 필드 명 매칭

    @Qulifier -> @Qulifier끼리 매칭 -> 빈 이름 매칭

    @Primary 사용

     

     

     

    @Autowired 필드 명 매칭

     

    인터페이스 상속

    인터페이스 DiscountPolicy가 위와같은 상속관계를 가지고 있을 때

    @Autowired
    private DiscountPolicy discountPolicy

    위와같은 코드는 FixDiscountPolicy, RateDiscountPolicy 두개의 빈이 들어오기 때문에 오류가 생긴다

    @Autowired
    private DiscountPolicy rateDiscountPolicy

    위와같이 필드명을 바꿔주면 정장적으로 주입된다

     

    필드명 매칭은 먼저 타입매칭을 시도하고 그 결과로 여러 빈이 있을 때 추가적으로 동작하는 기능이다.

     

     

     

    @Qulifier

    빈 등록시 @Qulifier("적당한 이름")를 붙여주는 방법

    위와 같이 사용하면 된다

    * @Qulifier("mainDiscountPolicy")를 못찾으면 추가로 mainDiscountPolicy라는 이름의 스프링 빈을 추가로 찾는다

     

     

     

    @Primary

    우선순위를 가지게 하는 방법이다 @Autowired시에 여러 빈이 매칭되면 @Primary가 우선권을 가진다.

     

     

     

    @Primary와 @Qulifier의 활용

    메인 데이터베이스의 커넥션을 획득하는 스프링 빈이 있고 서브 데이터베이스의 커넥션을 획득하는 스프링 빈이 있다고 하자. 메인 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Primary를 적용해서 @Qulifier 지정없이 획득하고

    서브 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Qulifier를 지정해 명시적으로 획득하는 방식을 사용하면 좋다

    '스프링' 카테고리의 다른 글

    빈 스코프  (0) 2021.09.17
    빈 생명주기 콜백  (0) 2021.09.09
    컴포넌트 스캔  (0) 2021.09.01
    싱글톤 패턴과 싱글톤 컨테이너  (0) 2021.08.28
    스프링 빈과 스프링 컨테이너  (0) 2021.08.02

    댓글

Designed by Tistory.