1) Bean을 수동으로 등록하는 방법
🤔 Bean 수동 등록은 언제 사용이 될까?
- 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들은 수동으로 등록하는 것이 좋음.
🤔 어떤 것을 Bean으로 수동 등록 할까?
- 기술 지원 Bean들을 주로 수동으로 등록 함.
수동 등록 장점
- 비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않음
- 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점 존재
Bean 수동 등록하는 방법
- Bean으로 등록하고자 하는 객체를 반환하는 메서드를 선언하고 해당 메서드 위해 @Bean annotation 추가
- Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration 설정
- Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장됨
- Bean 이름: @Bean이 설정된 메서드
BCryptPasswordEncoder()
: 인터페이스인 PasswordEncoder 구현체 중 하나
- PasswordEncoder Bean 등록 후 가져다가 사용하면(DI 받으면) BCryptPasswordEncoder 구현체가 등록됨.
- BCrypt
: 비밀번호를 암호화해주는 해시함수- 현재까지 사용중인 것들 중 아주 강력한 해시 메커니즘을 가지고 있는 것 중 하나
2) 같은 타입의 Bean이 2개라면?
Food interface를 사용하는 Bean 객체 Chicken, Pizza 를 등록하고, 테스트를 위해 테스트 코드를 작성했을 때 Food food; 필드에 @Autowired를 사용해 Bean 객체를 주입하려고 시도하면 오류가 발생함.
해당 오류는 Food 타입의 Bean 객체가 하나이상 존재하는데, food 필드에 둘 중 어느 것을 주입해야할지 몰라 발생하는 오류.
오류 해결 방법
- 등록된 Bean 이름 명시
- 등록된 Bean 이름 pizza, chicken 중 하나를 명시해주면 오류 해결
- @Autowired는 기본적으로 Bean Type(Food)으로 DI를 지원하는데, Bean이 하나이상일 때는 Bean Name(pizza, chicken)으로 찾음
- @Primary
- @Primary가 지정된 Bean이 있다면 해당 Bean을 우선적으로 주입해줌.
- @Qualifier
- 클래스에 @Qualifier("이름")을 추가한 후, 주입하고자 하는 필드에도 @Qualifier("이름")을 추가해주면 해당 Bean 객체가 주입됨.
Qualifier의 우선순위가 더 높지만 적용하기 위해서 주입 받고자 하는 곳에 해당 Qualifier를 반드시 추가해야 하기 때문에 같은 타입의 Bean이 여러 개 있을 경우,
➡️범용적으로 사용되는 Bean 객체에는 Primary 설정
➡️ 지엽적으로 사용되는 Bean 객체에는 Qualifier 사용
Spring에서 우선순위를 설정할 때는 큰 범위가 우선순위가 더 낮음.
용어 정리
- 기술 지원 Bean
:공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 제공하는 Bean
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] JWT / 패스워드 암호화 (0) | 2023.11.08 |
---|---|
[Spring] Authentication / Authorization / Cookie / Session (1) | 2023.11.08 |
[Spring] Spring Data JPA / JPA Auditing / Query Methods (0) | 2023.11.07 |
[Spring] SpringBoot의 JPA (0) | 2023.11.07 |
[Spring] Entity의 상태 (0) | 2023.11.07 |