어 나 갱수.

[Spring] @Bean과 @Component의 차이 👏 본문

Spring

[Spring] @Bean과 @Component의 차이 👏

김경수 2023. 11. 13. 18:09
728x90

 

SpringBoot로 개발하다 보면 @Bean, @Component 어노테이션을 정말 많이 볼 수 있다.

저 두 어노테이션을 많이 들어는 봤지만 두 개가 무엇인지 정확히 알지는 못한다.

오늘은 저 두개의 어노테이션에 대해 알아보고 둘의 차이점도 한 번 알아보려고 한다.

 

@Bean

@Bean의 경우 개발자들이 컨트롤하지 못하는 외부 라이브러리를 ioc 컨테이너에 Bean으로 등록시키고 싶을 때 사용하는 어노테이션이다.

 

Spring Security로 예를 들어보자 Spring Security는 Spring Security 개발자들의 의해 만들어진 외부 라이브러리이다.

이 외부 라이브러리 Spring Security에서 제공하는 PasswordEncoder 클래스도 외부 라이브러리 중 하나이다.

 

PasswordEncoder 이 클래스를 SpringBoot에서 사용하려면 Bean으로 등록시켜야하는데 이런 상황에서 @Bean 어노테이션을 사용한다. @Bean 어노테이션은 보통 아래 예시와 같은 메서드에 사용된다.

@Bean
fun passwordEncoder(): PasswordEncoder? = BCryptPasswordEncoder()

 

이렇게 외부 라이브러리를 Bean 등록시킬때 @Bean 어노테이션을 사용한다.

 

@Component

@Component의 경우 개발자들이 직접 컨트롤이 가능한 개발자 본인이 직접 만든 클래스를 Bean으로 등록시키고 싶을 때 사용하는 어노테이션이다.

 

개발자들이 직접 만든 클래스라고 하면 Service, Repository, Controller등이 있을 수 있다.

@Component 어노테이션은 @Service, @Repository, @Controller 등의 어노테이션을 모두 포함하고 있다.

 

아래와 같이 개발자가 직접 만든 클래스에 @Service와 같은 @Component에 포함되는 어노테이션을 추가함으로 Bean등록을 할 수 있다. @Component 어노테이션은 보통 아래 예시와 같은 클래스에 사용된다.

@Service
@Transactional(rollbackFor = [Exception::class])
class DeleteMusicServiceImpl(
    private val musicRepository: MusicRepository,
) : DeleteMusicService {
    override fun execute(musicId: Long) {
        val music: Music = musicRepository.findByIdOrNull(musicId) ?: throw MusicNotFoundException()

        musicRepository.delete(music)
        music.member.updateMusicStatus(MusicStatus.CAN)
    }
}

 

@Bean vs @Component

@Bean과 @Component에 대해 각각의 특징을 알아보았으니까 이제 둘의 차이점을 한번 비교해보겠습니다.

 

Bean과 Component는 Target이 다르다!!

@Bean

  • @Bean의 Target은 아래와 같이 METHOD, ANNOTATION_TYPE 으로 정해져 있어서 함수 단위 또는 어노테이션 단위에 사용해야 한다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})

 

@Component

  • @Component의 Target은 아래와 같이 TYPE 이므로 클래스, 인터페이스, 열거형에 붙일 수 있다.
@Target(ElementType.TYPE)

 

두 개의 어노테이션 모두 각각 맞는 Target이 있기 때문에 서로 바꿔서 사용할 수 없다. 만약에 바꿔서 사용할 경우 컴파일 에러가 발생할 수 있다.

728x90