Spring 7. DI 4가지 방법
7. DI 4가지 방법

Bean을 주입 받는 방법

  • Spring이 관리해주는 @Component에서 사용 가능
  • 생성자 주입
    • 생성시점에 딱 한번 주입
  • setter 주입
    • setter 메소드 위에 @Autowired를 붙여주면 주입
      @Autowired
      public void setProperty(Property property) { ~~~ }
  • 필드 주입 (안티 패턴)
    • 필드 옆에 @Autowired를 붙여주면됨
      @Autowired private Property property;
    • 최초 실행시 DI를 받고 변경이 불가능. 따라서 테스트 불가능 및 유연성이 떨어짐
    • reflection을 통해서 값을 주입 받음
    • 단, test code에서는 이렇게 사용해도 됨.
  • 일반 메서드 주입
    • setter랑 같은 원리지만, 메소드 이름이 set으로 시작하는 외에 메소드위에 @Autowired를 붙여주면됨

@Autowired Optional

@Autowired를 주입 받을때 기본적으로 빈이 없는 경우 exception이 발생된다.

  • @Autowired(required = false)로 설정해두면 빈이 없더라도 에러가 안나게됩니다.
    • 빈이 없으면 메소드 자체가 호출이 안됨.
  • @Autowired(required = true) 더라도 주입받을 변수 옆에 @Nullable을 적게되면 에러가 안나고 null로 주입이됩니다.
    • 빈이 없더라도 메소드 호출되고 null로 주입됨
  • 주입 받고싶은 필드를 Optional<빈>로 감싸면 Optional.empty로 주입 됨
    • 똑같이 빈이 없어도 메소드 호출되고 Optional.empty로 주입

생성자 주입을 써라!

  • 불변 (생성시에만 주입 가능)
  • 누락 방지
  • final 키워드 사용

생성자 만들기 넘모 귀찮아요~

그럴때는 lombok의 @RequiredArgsConstructor를 사용하시죠!

  • final 필드로 선언되어 있고, 기본값이 없는 경우 자동으로 생성자로 만들어집니다.
  • @RequiredArgsConstructor: final 필드 및 final 필드더라도 기본값이 있는 경우 제외
  • @AllArgsConstructor: 모든 필드
  • @NoArgsConstructor: 인자 없는 생성자 (JSON 직렬화 할때 필요), 필드들은 setter

설정법

  • Intellij plugins에서 lombok 플러그인도 설치하자.
  • Intellij Enable annotation processing을 켜둬야한다. (안켜도 잘되던데 뭐지..?)
    Intellij 설정

DI에서 같은 type의 빈이 여러개 있는 경우 어떻게 될까?

  • NoUniqueBeanDefinitionException이 발생한다. 2개이상 빈이 발생해서 생긴 문제
  1. 타입으로 찾기
  2. 타입이 겹치면 필드명으로 찾기
  3. 필드명으로도 못찾으면 exception 발생
  • 이런 경우를 위해 @Qualifier를 제공. 필드명 대신 @Bean 이름을 지정 가능
private final @Qualifier("mainProperty") Property property; // 사용 하는 곳
-------------------
@Qualifier("mainProperty") // 별명 지정 (빈 이름은 변경 안됨)
@Component("mainProperty") // 빈 이름을 변경
public class Property1 { ... }
  1. @Qualifier가 등록 되어 있는 클래스를 먼저 찾는다.
  2. 빈 이름에서 찾는다.
  3. 못 찾으면 exception 발생
  • 요번에 첨안건데 @Qualifier는 @Qualifier 끼리 사용하는게 좋다고 한다. 여태꺼 빈 이름 찾는 용도로 사용했는데…

@RequiredArgsConstructor를 사용하고 @Qualifier 사용법

  • resources 폴더가아닌 java 폴더 밑에 패키지 바깥에 두어야한다.
    lombok.config
lombok.copyableannotations += org.springframework.beans.factory.annotation.Qualifier

빈이 여러개 있을때 우선순위를 줄 수 있따.

  • @Primary가 붙은 빈, 컴포넌트를 1순위로 지정한다.
  • @Order로 직접 순서를 정할 수 있다.

직접 빈 등록은 언제 해야하나요?

  • 대부분 자동으로 빈 등록하는 기능을 사용해도 충분하다.
  • 비즈니스 로직은 자동 빈 등록을 사용하는게 좋고, 성능 체크나 로깅 같은 빈은 직접 등록하는게좋다
    • @Configuration에서 모아두고 명시적으로 확인 가능

© 2025 seokh1213

LinkedIn LinkedIn GitHub