24.09.02

윤지현·2024년 9월 2일

TIL

목록 보기
55/75

오늘의 루틴

  • 최소 강의 4개 듣기 (O)

01. Bean을 수동으로 등록하는 방법

🔻 Bean 수동 등록이란?

  • @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록
    • @Component를 사용하여 Bean을 자동으로 등록
  • Bean 수동 등록은 언제 사용
    • 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체
      -해당 위치를 파악하기 쉽다는 장점

🔻 Bean 수동 등록하는 방법

    @Configuration
    public class PasswordConfig {

        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
  • Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정
  • Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정
  • Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장
    // 1. @Bean 설정된 메서드 호출
    PasswordEncoder passwordEncoder = passwordConfig.passwordEncoder();

    // 2. Spring IoC 컨테이너에 빈 (passwordEncoder) 저장
    // passwordEncoder -> Spring IoC 컨테이너
  • 'Bean' 이름: @Bean 이 설정된 메서드명
    • public PasswordEncoder passwordEncoder() {..} → passwordEncoder

02. 같은 타입의 Bean이 2개라면?

🔻 등록된 Bean 이름 명시하기

  • 이렇게 등록된 Bean 이름 pizza, chicken을 정확하게 명시해주면 해결
  • 여기서 우리가 알 수 있는 점은 @Autowired가 기본적으로는 Bean Type(Food)으로 DI를 지원하며 연결이 되지않을 경우 Bean Name(pizza, chicken)으로 찾는 다는 것을 알 수 있다.
       @SpringBootTest
       public class BeanTest {

           @Autowired
           Food pizza;

           @Autowired
           Food chicken;

       }

🔻 @Primary 사용하기

  • @Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입
  @Component
  @Primary
  public class Chicken implements Food {
      @Override
      public void eat() {
          System.out.println("치킨을 먹습니다.");
      }
  }
  @SpringBootTest
  public class BeanTest {
      @Autowired
      Food food;
  }

🔻 @Qualifier 사용하기

  @Component
  @Qualifier("pizza")
  public class Pizza implements Food {
      @Override
      public void eat() {
          System.out.println("피자를 먹습니다.");
      }
  }
  @SpringBootTest
  public class BeanTest {

      @Autowired
      @Qualifier("pizza")
      Food food;
  }
  @SpringBootTest
  public class BeanTest {

      @Autowired
      @Qualifier("pizza")
      Food food;

      @Test
      @DisplayName("Primary 와 Qualifier 우선순위 확인")
      void test1() {
          // 현재 Chicken 은 Primary 가 적용된 상태
          // Pizza는 Qualifier 가 추가된 상태입니다.
          food.eat();
      }
  }
  • Pizza 클래스에 @Qualifier("pizza") 를 추가
    주입하고자하는 필드에도 @Qualifier("pizza") 를 추가해주면 해당 Bean 객체가 주입
  • 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높다.
  • 하지만 Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가
  • 따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.
profile
첫 시작

0개의 댓글