개발하는 삶

spring (3) - 의존관계 주입 본문

Spring

spring (3) - 의존관계 주입

삶_ 2022. 7. 5. 11:08

 

@Autowired

  • @Autowired(required = false) : 주입할 대상이 없어도 동작할 수 있게 하는 것 (예외처리 발생 X)
  • 의존관계 주입
    • 생성자 주입
    • 수정자 주입
    • 필드 주입
    • 일반 메서드 주입

 

 

옵션 처리

  • 자동 주입 대상을 옵션으로 처리하기
    • @Nullable : 자동 주입할 대상이 없으면 null이 입력됨
      • ex )
      • @Autowired
      • public void setNoBean2(@Nullable Member member) {...}
    • Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력됨
      • ex.
      • @Autowired(required = false)
      • public void setNoBean3(Optional<Member> member){...}

 

 

 

생성자 주입

  • 생성자를 통해서 의존 관계를 주입받는 방법
  • 생성자 호출 시점에 딱 1번만 호출되니 불변하게 설계가 가능
  • 주입 데이터가 없으면 컴파일 오류가 발생해서 없다고 알려줌
  • 생성자 주입을 사용할 때 final 사용 가능

 

 

수정자 주입

  • setter 라 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입함

 

 

필드 주입

  • 코드가 간결. 그러나 테스트하기 힘든 단점.
  • 사용하지 않는 걸 추천한다.

 

 

일반 메서드 주입

  • 일반 메서드를 통해 주입 받을 수 있음
  • 한번에 여러 필드를 주입받을 수 있음
  • 일반적으로 잘 사용하지 않음

 

 

 

 

자동 주입 시 빈 2개 이상 문제

  • @Autowired 는 타입으로 조회
    • @Autowired 필드명 매칭
      • 특정 인터페이스를 구현한 클래스가 2개 이상일때 대상 클래스 이름으로 바꾸어줌
      • @Autowired private DiscountPolicy discountPolicy 를 @Autowired private DiscountPolicy rateDiscountPolicy 로 변경하라는 뜻
    • @Qualifier 사용
      • 사용할 의존객체를 선택해 줄 수 있음
      • @Qualifier끼리 매칭 -> 빈이름 매칭(빈이름이 같으면) -> 예외 발생
      • @Autowired 밑에 @Qualifier("mainDiscountPolicy") 등록
        • @Qualifier("등록할 클래스 빈이름 (Pro -> pro)")
      • 또는 생성자 자동 주입. 생성자 앞에 붙임.
        • @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy
    • @Primary 사용
      • 붙이면 우선권을 가지게 해줌
      • 하지만 스프링은 자동보단 수동, 넓은범위 보단 좁은범위의 선택권이 우선됨
        • @Qualifier 이 우선권이 높음 (더 상세하게 동작함)
        • @Primary 는 기본값처럼 동작함
    • @Primary, @Qualifier 활용
      • 메인 데이터베이스(코드사용량 빈번)의 커넥션을 획득하는 스프링 빈
        • @Primary 를 적용해서 조회하는 곳에서 @Qualifier 지정 없이 편리하게 조회함
      • 서브 데이터베이스(가끔 사용)의 커넥션을 획득하는 스프링
        • @Qualifier 을 지정해서 명시적으로 획득하는 방식으로 사용하면 코드를 깔끔하게 유지함 

 

 

애노테이션 직접 만들기

  • @Qualifier("mainDiscountPolicy") 이렇게 적으면 컴파일시 타입체크가 안됨
    • "" 안에 오타가 좀 나거나 해도 컴파일에서는 그냥 넘어감 -> 이후 에러생김
  • 그래서 @Qualifier 랑 똑같은 효과를 가진 애노테이션 만들면 좋다! (ex :  @MainDiscountPolicy)
  • @Qualifier 속 애노테이션 전체 복붙 -> 원래있던 자리에 @MainDiscountPolicy 이런식으로 적어주면 됨
  • @Qualifier 뿐만 아니라 다른 애노테이션도 함께 조합해서 사용 가능
  • 무분별하게만 쓰지 않길 

 

 

 

롬복

  • @RequiredArgsConstructor 
    • final, @NotNull 이 붙은 필드를 모아서 생성자를 자동으로 만들어줌 (값 초기화 하는 생성자)
    • 필드가 포함된 클래스 위에 추가시, 필드들의 생성자를 만들어 줌
    • (보이진 않지만 생성되었고 호출 가능)
  • 최근엔 생성자를 딱 1개 두고 @Autowired 을 생략. 롬복 기능까지 함께 사용.
// before
public class Example {
	private final Pro pro;
    
    @Autowired
    public ProImpl(Pro pro){
    	this.pro = pro;
    }
}


// after
@RequiredArgsConstructor
public class Example {
	private final Pro pro;
}

 

 

 

 

 

 

 

'Spring' 카테고리의 다른 글

[Spring] HTTP Method  (0) 2022.07.11
[Spring] 웹서버  (0) 2022.07.09
[Spring] 스코프, 프록시  (0) 2022.07.06
[Spring] 스프링 빈  (0) 2022.07.03
[Spring] 스프링과 스프링부트  (0) 2022.06.27