@Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해줌
@Component를 사용하여 Bean을 자동으로 등록하는 게 좋음
기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음
공통 로그처리와 같은 비지니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동 등록이라고 함
비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하는게 부담스럽지 않음
수동 등록된 Bean에서 문제가 발생했을 떼 해당 위치를 파악하기 쉬움
@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' 이름: @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
}
}
등록한 passwordEncoder ‘Bean’을 사용하여 문자열을 암호화
matches : 내부에서 비교함