본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Bean

by mmm- 2023. 11. 8.

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