ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3-1, 3-2 Bean 수동등록, 같은 타입의 Bean이 여러개 라면?
    스파르타 강의 정리 2023. 11. 7. 20:08

    Bean 수동등록

    빈은 애너테이션을 통해 자동으로 등록하는 것이 관리도 편하고 좋다.

     

    그럼 수동등록은 언제해야하는가?

    기술적인 문제나 공통 관심사를 사용할때 처리하는 객체들은 수동으로 등록하는게 좋다.

     

    공통 log처리,  같은 비즈니스로직을 지원하기 위한 부가적이고 공통적인 기능들을  기술지원 Bean이라고 부른다.

    그리고 이러한 것들을 수동으로 등록하나.

    수가 적기 때문에 수동으로 등록하는 것이 부담스럽지 않고, 여기서 문제가 발생했을 때 위치를 찾기도 쉽다.

     

    @Test
    @DisplayName("수동 등록한 passwordEncoder를 주입 받아와 문자열 암호화")
    void test1() {
       String password = "Robbie's password";
    
       // 암호화
       String encodePassword = passwordEncoder.encode(password);    // encode로 암호화
       System.out.println("encodePassword = " + encodePassword);
       String inputPassword = "Robbie";  // 입력 받아온 평문.  *암호화 되지 않은걸 평문이라고 함.
       
       // 복호화를 통해 암호화된 비밀번호와 비교  (평문, 암호화한 비밀번호)
       boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
       System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
       }
    }

     

     

     

    TMI

    BCryptPasswordEncoder()에 대한 정보

    - 해시함수이다.

    - 비밀번호를 암호화 해준다.

    - 현재 사용중인 것들 중에서 아주 강력한 해시매커니즘을 가진 것 중 하나로 많이 사용된다.

    - BCrypt 라는 해시함수를 사용하여 비밀번호를 암호화한다.

     

     

     

     

     


     

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

     

     

    Food 인터페이스를 만들고 해당 인터페이스를 구현하는 구현체 클래스를 만든 후 빈으로 등록하면

    Food 인터페이스에서도 어떤 클래스가 빈으로 등록되었는지 사진처럼 확인 가능하다.

     

    Food 인터페이스를 구현하는 구현체 (chicken, pizza)를 만들고 빈으로 등록했지만 아무런 문제가 없다.

    -> 등록 자체에는 문제가 없음을 알 수 있다.

     

     

    테스트 클래스를 만들어서 Bean을 연결해보면 

     

     

     

    빨간줄이 그이고 이러한 내용을 보여준다.

    대충 설명해보자면 food타입 bean이 하나 이상이니까 내(스프링)가 뭘 골라서 등록해야할지 알 수 없으니

    니가 확실히 정하라고 하고있다.

     

     

    해결방법은 3가지가 있다.

     

    첫번째는 진짜로 확실히 명시해서 적어주는 방법이다.

     

    에러없이 잘 되어 있음을 알 수 있다.

     

     

     

    두번째는   치킨 클래스에 @Primary를 적어주는 것이다.

     

    @Primary는 같은 타입의 빈이 여러개 일 경우  이 애너테이션이 적용된 빈을 최우선으로 적용한다.

     

     

     

     

    세번째는    @Qualifier 애너테이션을 사용하는 것이다.

     

    주의할점은 애너테이션 뒤에 ("") 안에  해당 클래스가 빈에 들어있을때의 이름을 적어줘야한다.

    (첫글자 소문자로 써야한다는 의미)

     

     

     

    그러면    @Primary  와  @Qualifier   가 동시에 적용될 경우 어느것이 우선순위가 더 높은가?

    -> @Qualifier 가 더 높다

     

    그렇지만 같은 타입의 빈 객체가 여러개일 때 범용적으로 사용되는 객체에는 @Primary

    지역적으로 사용되는 것에는 @Qualifier 를 쓰는것이 더 좋다.

     

    이건 자바에서 지역변수 전역변수 우선순위를 따지는 것과 동일한 논리이다.

    좁은범위가 우선순위가 더 높다.

     

    '스파르타 강의 정리' 카테고리의 다른 글

    회원가입 구현 및 Filter  (0) 2023.11.08
    3-5, 3-6 JWT  (0) 2023.11.07
    3-3, 3-4 인증과 인가 / 쿠키와 세션  (0) 2023.11.07
    [1주차] 새로배운 것들 정리 (1)  (0) 2023.11.01
    [0주차] 1~3강  (0) 2023.10.30
Designed by Tistory.