본문으로 건너뛰기

Component

@Component、@Service、@Repository、@Controller의 차이에 대해서

네가지 전부 기본적인 움직임은 같으며, 이 네가지의 어노테이션을 부여하면
스프링의 DI 컨테이너에 Bean으로써 등록하게 된다.

@Component를 부여해서 사용해도 되는데, 굳이 네가지를 나눠서 하는 이유는
비지니스 레이어를 구분하기 위해서 이다.

@Component는 스프링이 관리하는 컴포넌트를 나타내는 일반적인 스테레오 타입이다.
좀더 세부적인 유스케이스 들을 위하여 @Component의 구체화된 형태로 @Repository, @Service,  @Controller들이 있다.

  • @Service 비지니스 로직을 구현하는 객체에 사용(MVC패턴에서는 서비스 레이어)
  • @Controller 스프링MVC패턴에서 컨트롤러 계층에 사용
  • @Repository 데이터 엑세스 레이어에 사용(DAO등)
  • @Component 기능을 수행하는 라이브러리나, MVC패턴등에 구애받지 않고 Spring DI컨테이너에 등록해서 사용하고 싶을 때 사용

사용 예제

@Component

@Component
public class checkComponentImp implements checkComponent{

@Override
public boolean check(BLogicParam param) {
...
}
}

@Repository

@Repository
public class FindProductRepositoryImpl implements FindProductRepository {

private Collection<Product> products;

@Override
public Collection<Product> findAll() {
return products;
}
}

@Service

@Service
public class FindProductServiceImp implements FindProductService {

@Inject
FindProductRepository findProductRepository;

public Todo findAll() {

Collection<Product> products = findProductRepository.findAll();

if (products == null) {

// エラー処理
...
}
return products;
}
}

@Controller

@Controller
@RequestMapping("findProduct")
public class FindProductController {

@Inject
FindProductService findProductService;

@RequestMapping(value="list")
public String list(Model model) {
Collection<Product> products = findProductService.findAll();
model.addAttribute("products", products);
return "product/list";
}
}

여러가지 답변들

@Compnent를 써도 되는데 @Service같은게 있는 이유를 분류를 세분화해서 "얘네들만 따로 로직을 걸어주고 싶은 경우"가 자주 생기기 때문입니다.
비유하자면 @Component는 주류코너이고 @Service는 전통주코너같은거죠(그 옆에 맥주코너 와인코너도 있음). 전통주에 대해서 별도의 할인이나 면세 적용이라든가 포인트를 더 넣어준다든가 이런 일들을 처리하고 싶은겁니다.
"따로 로직을 걸어주고 싶은 경우"라고 했는데, 사실상 AOP를 적용해서 특정 레이어(컨트롤러들, 서비스들 등)에 일괄적으로 기능을 추가하는 경우가 대부분입니다.


Component는 스프링 빈으로 등록하겠다고 표시하는 애노테이션입니다. 즉 스프링 ApplicationContext에 표시를 해두면, 컨테이너가 빈으로 등록을 하는데요.
여기서 ApplicationContext는 Beanfactory를 상속한 인터페이스이며, 우리가 스프링 컨테이너라고 부르는 곳 입니다.
@service, @repository 등은 @Component의 좀 더 명확한 케이스라고 보시면 됩니다. 실제로 API를 보시면 두 애노테이션 모두 @Component를 가지고 있습니다. 즉 역할에 따라 나누는거죠.