일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Kafka
- 자바
- MSA
- 자료구조
- 정규화
- well-know port
- 삭제 이상
- 비관적 락
- java
- 데이터베이스
- buildSrc
- gatway
- 낙관적 락
- 삽입 이상
- ocp
- 캐시 오염
- null
- DB
- 갱신 이상
- 페이지네이션
- 스레드 풀
- Kotlin
- Spring
- Dirty Checking
- 3-way handshaking
- 네트워크
- AWS
- JPA
- Redis
- HTTP
- Today
- Total
어 나 갱수.
[Spring] @Bean과 @Component의 차이 👏 본문
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이 있기 때문에 서로 바꿔서 사용할 수 없다. 만약에 바꿔서 사용할 경우 컴파일 에러가 발생할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] 싱글톤 패턴 🐶 (0) | 2024.02.06 |
---|---|
[JPA] JPA 영속성 컨텍스트 🤫 (6) | 2023.12.03 |
[SpringBoot] Spring Security란? 👏🏿 (0) | 2023.09.02 |
[gradle] buildSrc를 사용해보자!!😜 (0) | 2023.08.28 |
[Spring] 디스패처 서블릿(Dispatcher Servlet)이란? 👍 (1) | 2023.08.02 |