[Spring] Bean 수동 등록

지인·2023년 6월 21일
0

TIL

목록 보기
23/38

🐰 Bean 수동 등록

  • @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.

  • 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다.

  • 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

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

1. 등록된 Bean 이름 명시

@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;
    
    @Autowired
    Food chicken;
}
  • 등록된 Bean 이름 pizza, chicken을 정확하게 명시한다.

2. @Primary

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

3. @Qualifier

  • Pizza 클래스에 @Qualifier("Pizza")를 추가한다.
@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
  • 주입하고자하는 필드에도 @Qualifier("Pizza")를 추가해주면 해당 Bean 객체가 주입된다.
@SpringBootTest
public class BeanTest {

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

우선순위

  • 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높다.

  • 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지역적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.

profile
열쩡

0개의 댓글