본문 바로가기

BackEnd/Java Spring

@Bean vs @Compoent

728x90

머리말

Spring 프레임워크 AOP를 공부중에 Compoent와 Bean과의 차이가 뭔지 궁금하게 되어서 내용을 정리하는 시간을 갖고자 글을 작성하게 되었습니다.

@BEAN

주로 @Confiuration 어노테이션이 들어간 Spring을 설정하는 클래스 내에 들어가는 메소드에서 선언한다.

@Bean의 경우 보통은 외부 라이브러리를 사용해서 등록하고자 할때 사용합니다. 예를들면 ObejctMapper의 경우 ObjectMapper Class에 @Compoent를 선언 할수는 없으니 ObjectMapper의 인스턴스를 생성하는 메소드를 만들고 해당 메소드에 @Bean을 선언하여 Bean으로 등록한다.

ModelMapper를 사용하게 되어서 아래와 같이 ModelMapper를 Bean에 등록하였습니다. 😊

@Configuration
public class ModelMapperConfig {
    @Bean
    public ModelMapper modelMapper(){
        return new ModelMapper();
    }
}

Scope의 종류

  • 싱글톤
    • Spring 프레임 워크에서 기본이 되는 스코프
    • 스프링 컨테이너 시작과 죵료까지 1개의 객체로 유지됨
  • 프로토 타입
    • 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
    • 요청이 오면 항상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
    • 프로토타입을 받은 클라이언트가 객체를 관리해야함.
    • request : 각각의 요청이 들어오고 나갈때까지 유지되는 스코프
    • session : 세션이 생성되고 종료될 때까지 유지되는 스코프
    • application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

@Compoent

싱글톤 클래스 빈을 생성하는 어노테이션이다. 물론 @Scope(”Prototype”) 어노테이션을 통해 싱글톤이 아닌 빈을 생성 할 수 도있다. 또한 @Service, @Repository 어노테이션 또한 이에 포함된다.

이 어노테이션은 선언적(Declarative)인 어노테이션이다. 즉, 패지키 스캔 안에 이 어노테이션은 “이 클래스를 정의 했으니 빈으로 등록해줘.” 라는 뜻이 된다. 개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Compoent를 사용한다.

그렇다면 개발자가 생성한 Class에 @Bean은 선언이 가능할까? 정답은 No이다. @Bean과 @Component는 각자 선언 할 수 있는 타입이 정해져있어 해당 용도외에는 컴파일 에러를 발생시킨다.

@Bean의 장점은 구현 클래스 인터페이스 기반 빈에 등록해주는 유연한 처리가 가능하다. Bean은 유연하게 인스턴스를 주입시킬 수 있으며, @Compoent는 클래스에 붙는 선언적인 어노테이션이기 때문에 유연하지 못하다.

정리

일반적인 당신은 빈 등록을 간편하게 하려면 @Component 어노테이션으로, 유연한 빈 등록이 필요하다면 @Configuration 어노테이션이 들어간 클래스 내 @Bean 어노테이션 메소드 선언으로 한다.

참고 : @SpringBootApplication 어노테인이 들어간 스프링 실행부에서도 @Bean 어노테이션이 깃든 메소드 등록이 가능히다

참고

728x90

'BackEnd > Java Spring' 카테고리의 다른 글

[Java Spring] @Bean vs @Compoent  (0) 2024.02.26
[Spring] WebSocket  (1) 2024.02.24