본문 바로가기

개발일지/TIL

[230630] @Bean과 @Component 차이?

@ Bean과 @Component

❓@Bean과 @Component의 차이는 무엇일까?
💬 @Bean과 @Component는 IOC Container에 Bean을 등록해 주는 것은 동일하다. 그렇다면 어떤 차이가 있는 것일까? 직접 몇 가지 테스트를 해보니 내린 결론은 이렇다. @Bean의 경우 메서드를 통해 Bean 등록을 한다. @Component의 경우 생성자를 통해서 Bean등록을 한다. 그래서 외부 라이브러리에서 구현해 놓은 클래스를 Bean 등록을 하려면 생성자로 불가능하기 때문에 @Bean을 쓰는 것이 아닌가 싶다. 
❓그렇다면 내가 구현 클래스를 만든다면 Component를 사용해 Bean 등록을 할 수 있지 않을까?
💬 이것이 궁금해서 실제로 코드를 작성해서 해봤다. 인터페이스를 확장하고 실제로 내가 만든 클래스가 Bean으로 등록되고 DI가 되는지 말이다. PasswordEncoder를 기준으로 진행했다.

 

@Component
public class TestEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        return "TestEncoder " + rawPassword;
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return false;
    }

    @Override
    public boolean upgradeEncoding(String encodedPassword) {
        return PasswordEncoder.super.upgradeEncoding(encodedPassword);
    }
}

 

@SpringBootTest
public class PasswordEncoderTest {

    @Autowired
    PasswordEncoder passwordEncoder;


    @Test
    @DisplayName("내가 만든 PasswordEncoder 구현 클래스 테스트")
    void customPasswordEncoderTest() {
        String password = "Robbie's password";
        
        String encodePassword = passwordEncoder.encode(password);
        System.out.println("encodePassword = " + encodePassword);
    }
}

 

💬 이런 테스트를 통해서 얻는 결론은 내가 만들어서 사용하는 구현 클래스의 경우 @Component를 사용해 자동으로 Bean 등록을 하는 것이 좋다는 것이다. 외부 라이브러리에서 구현해놓은 클래스의 경우 @Component를 사용할 수 없기에 @Bean을 사용해 수동 등록을 해주어야 한다는 것이다. 

생각

오늘은 궁금한 것들은 실제로 코드도 작성해보고 테스트도 해볼 수 있었다. 이렇게 해보니 이해에 도움이 되는 것 같다. 앞으로도 이런 궁금증들이 생기면 코드로 해보는 습관을 들여봐도 좋을 것 같다. @Bean과 @Component의 차이에 대해 정확하다고는 말할 수 없지만 내가 해본 것들이니 그래도 자신감 있게 나중에 이야기해도 좋을 것 같다.