❓ Bean 수동 등록은 언제 사용되나?
- 기술적인 문제나 곹오적인 관심사 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음
- 기술지원 Bean을 수동등록 -> 공통 로그처리와 같은 비지느스 로직을 지원하기 위한 부가적이고 공통적인 기능들
- 비지니스 로직보다 기술지원 Bean의 수가 적기 때문에 수동으로 등록하기 부담스럽지 않음
- 장점 : 수동등록 된 Bean에서 문제가 발생핬을 때 해당 위치를 파악하기 쉬움.
⭐ Bean 수동 등록 하는 법 (spring-auth)
@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이 2개라면?
- Food 인터페이스를 만들고, Food 타입의 Bean 객체 Chicken, Pizza 등록
💥 Food 타입의 Bean 객체가 하나이상 있기 때문에 어떤 Bean을 등록해야 할지 몰라 오류가 생김

⭐등록 방법 ⭐
방법 1 , 등록된 Bean 이름 명시하기
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza;
@Autowired
Food chicken;
}
방법 2, @Primary 사용하기
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
- Chicken 클래스에 @Primary를 추가.
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
- @Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입 해줌.
방법 3, @Qualifier 사용하기
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
- Pizza 클래스에 @Qualifier("pizza") 를 추가.
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
}
- 주입하고자하는 필드에도 @Qualifier("pizza") 를 추가해주면 해당 Bean 객체가 주입 됨.
❓ @Qualifier 와 @Primary 가 같이 있을 때 우선순위?
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("Primary 와 Qualifier 우선순위 확인")
void test1() {
// 현재 Chicken 은 Primary 가 적용된 상태
// Pizza는 Qualifier 가 추가된 상태입니다.
food.eat();
}
}
- 우선순위 : Primary < Qualifier
- 많이 사용하는 Bean 객체에 Primary를 설정하고 자주 사용하지 않는 객체에 Qualifier을 사용하는 것이 좋음.
'Back-end > Spring' 카테고리의 다른 글
| JPA란? (1) | 2024.01.26 |
|---|---|
| 그레이들(Gradle), 서버 (1) | 2024.01.23 |