TIL 2023-11-17 Bean 수동 등록

장규빈·2023년 11월 17일

TIL

목록 보기
26/59
post-thumbnail

Bean을 수동 등록 하는경우

기술적인 문제나 공통적인 관심사 처리(공통 로그 처리등의 기술지원 @Bean)

장점

문제 발생시 해당 위치를 정확하게 파악 하기 쉽다.

사용법

클레스에 @Configuration 설정후 매서드에 @Bean 등록
(@Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.)

@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

테스트

@SpringBootTest
public class PasswordEncoderTest {

    @Autowired
    PasswordEncoder passwordEncoder;

    @Test
    @DisplayName("수동 등록한 passwordEncoder를 주입 받아와 문자열 암호화")
    void test1() {
        String password = "Robbie's password";

        // 암호화
        String encodePassword = passwordEncoder.encode(password);
        System.out.println("encodePassword = " + encodePassword);

        String inputPassword = "Robbie";

        // 복호화를 통해 암호화된 비밀번호와 비교
        boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
        System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
    }
}

같은 타입의 Bean이 2개라면

public interface Food {
    void eat();
}
...
@Component
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
...
@Component
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

하나의 인터베이스에 구현체 클래스를 2개 만든후 @Bean으로 등록 했을때 인터페이스는 직접 @Autowired가 불가능하다.

가능하게 하려면??

1) 구현체를 직접 등록한다

@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;

    @Test
    void test1(){
        food.eat();
    }
}

2) 구현체에 @Primary를 사용한다. 그러면 같은 타입의 구현체가 여러게 있더라도 우선적으로 @Primary가 적용되어 있는 객체를 주입해준다.

@Component
@Primary
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
...
@SpringBootTest
public class BeanTest {

    @Autowired
    Food food;

    @Test
    void test1(){
        food.eat();
    }
}

3) @Qualifier를 사용해 원하는 구현체를 들고온다.

@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
...
@SpringBootTest
public class BeanTest {

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

    @Test
    @DisplayName("Primary 와 Qualifier 의 우선순위 확인 ")
    void test1(){
        food.eat();
    }
}

우선순위

@Primary와 @Qualifier중 우선순위는 @Qualifier이다.(@Primary는 범용적으로 사용하는 곳에,@Qualifier는 지역적으로 사용하는 곳에 사용해준다.) 스프링은 대부분의 우선순위가 좁은 범위이다

profile
나다운사람

0개의 댓글