스프링은 각 클래스를 빈으로 등록하기 위해서 @Component라는 어노테이션을 제공하지만, 실제 개발을 할 때는 @Component보다 @Contoller, @Service, @Repository를 더 많이 사용하게 되는 것 같다. 왜 @Component를 사용하지 않고 @Component의 하위개념인 어노테이션을 따로 제공하는걸까?

답을 찾기 위해 스프링 공식문서를 살펴봤더니 아래와 같은 문장이 있었다.

Therefore, you can annotate your component classes with @Component, but, by annotating them with @Repository, @Service, or @Controller instead, your classes are more properly suited for processing by tools or associating with aspects.

@Component를 사용하여 클래스에 주석을 달 수 있지만 @Contoller, @Service, @Repository을 사용하는게 도구를 활용한 처리나 다양한 측면과의 연관성을 더 적절하게 갖출 수 있다고 나와있다. 너무 번역말투라 느낌가는대로 받아들이면 더 상세하게 분류해서 어노테이션을 달아주면 여러가지 상황에 적절하게 쓸 수 있다~ 이런 뜻이 아닐까?!🤔

각 계층에 따른 역할이 있고, 그 역할에 맞게 코드를 구현해 놓으면 유지보수 할 때 유연하게 대응할 수 있다는 생각이 든다! 그럼 각 계층에 역할에 대해서 알아보자.

Controller(Presentation Layer)

  • @Contoller 사용
  • 사용자의 요청을 처리하고, 이에 따른 적절한 응답을 생성하는 역할

Service(Service Layer)

  • @Service 사용
  • 비즈니스 로직을 구현하고 처리하는 부분
  • 데이터 처리를 위해 레포지토리를 호출할 수 있음
  • 컨트롤러와 데이터 액세스 계층 사이의 중간 역할

Repository(Data Access Layer)

  • @Repository 사용
  • 데이터를 저장, 조회, 변경, 삭제하는등 데이터베이스 연상 수행
  • 이 계층에서 데이터베이스와의 통신을 추상화하기 때문에 비즈니스 로직이 데이터와 분리되어 유지보수 성을 높일 수 있음