2018년 1월 10일 수요일

Spring @Bean vs @Component

@Bean의 경우 개발자가 컨트롤할 수 없는 외부 라이브러리를 Bean으로 등록하고 싶은 경우에 쓰인다. (외부 라이브러리 인스턴스를 생성하는 메서드를 만들고 해당 메서드에 @Bean을 선언하여 Bean으로 등록한다.)
개발자가 직접 컨트롤할 수 있는 클래스엔 @Component를 사용한다.

@Bean
@Scope("prototype")
public SomeService someService() {
    switch (state) {
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}
위는 @Bean의 전형적인 사용 패턴이다. @Component로 대체할 수 없다. 좀 더 단순화 하면 @Bean은 반환되는 객체를 Bean으로 등록하기 위함이다. @Component는 사용자가 작성한, Component Scanning 되는 대상이다.

그리고 스프링이 제공하는 컨테이너를 통해서 관리되는 인스턴스를 모두 Bean이라 부를 수 있다. Bean은 기본적으로 싱글톤 scope를 가진다. 따라서 일반적으로 Bean으로 지정된 클래스는 컨테이너에서 1개의 인스턴스로만 존재할 수 있다.

Bean

이름을 왜 'Bean'으로 지었는지는 알 수 없지만 Java Bean은 아래의 특성을 가지고 있다.

1. 직렬화 가능해야 한다. (Serializable)
2. 인자가 없는 기본 생성자를 갖고 있어야 한다.
3. 속성에 대해 'public' setter / getter를 가지고 있어야 한다.
4. 인스턴스의 속성은 'private'로 지정되어 있어야 한다.

A JavaBean is a Java object that satisfies certain programming conventions:  
1.The JavaBean class must implement either Serializable or Externalizable
2.The JavaBean class must have a no-arg constructor
3.All JavaBean properties must have public setter and getter methods
4.All JavaBean instance variables should be private

스프링 프레임워크에는 이 외에도 다양한 Annotation이 존재한다.
@Controller: 스프링 MVC의 컨트롤러를 나타낸다. Spring 4+에선 REST 웹 서비스 용으로 @RestController가 추가로 제공된다. 차이점은 다음과 같다. @Controller의 주-동작은 View를 반환하는 것이고 @RestController의 주-동작은 데이터를 반환하는 것이다. 물론 @Controller에서 View가 아니라 데이터 반환 목적으로 @ResponseBody를 선언해 사용할 수도 있다. @RestController에선 @ResponseBody를 붙이지 않아도 되고, 상태 코드를 위한 ResponseEntity 장치가 준비되어 있다. (http://doublesprogramming.tistory.com/105)
@Service: 서비스 클래스를 나타내나 기능면에선 @Component와 동일하다.
@Repository: 리포지터리 클래스를 나타낸다. 이 Annotation이 붙은 클래스 내에서 발생한 예외는 DataAccessException으로 교체된다.

댓글 없음:

댓글 쓰기