서비스 추상화 (Service Abstraction)
서비스 ( @Service ? )
스프링에서 서비스 == @Service 일까? NO
스프링에 대한 오해
- Q) 스프링은 @Controller, @Service, @Repository만 기계적으로 찍어내는 개발 방법이다 ?
A) ❌
스프링 애플리케이션의 빈이 존재하는 계층 구조
- 3개의 전형적인(stereotype) 애너테이션을 사용하는 애플리케이션 빈의 위치
- @Controller
- Presentation(Web, UI) Layer
- 사용자한테 어떻게 보여줄 것인가?
- 사용자 행위에 대해서 어떻게 처리할 것인가?
- @Service
- Business(Service, Application) Layer
- 비즈니스 계층, 서비스 계층, 애플리케이션 계층
- 전체 애플리케이션의 핵심 비즈니스 로직이 들어감
- @Repository
- Persistence(Data Access, Infra) Layer
- DB에 접근하는 엔티티 저장, 조회를 하는 기능을 가진 클래스를 정의
- 영속 레이어로 저장해두면 오랫동안 보존해두는 기능을 담당하는 계층
서비스 추상화와 @Service가 붙은 클래스에 대한 추상화를 하는 걸까? ❌
- 서비스는 일반적인 용어라서 쓰이는 곳에 따라 다른 의미를 가짐
서비스의 두 가지 중요한 개념
1. 서비스는 클라이언트에게 서비스를 제공해주는 오브젝트나 모듈
- 서비스(서버)는 클라이언트(서비스를 요청하고 받는 쪽)가 반드시 존재해야됨
2. 서비스는 일반적으로 상태를 가지지 않음
- 서버에서 동작하는 서비스들은 일반적으로 상태를 가지지 않음
- 서버는 딱 한 명의 클라이언트만 상대하는 것이 아니기 때문에
(많은 수의 서비스를 이용하는 클라이언트들이 존재)
속성을 서버에 존재하는 서비스 오브젝트에 넣어두지 않음
- 상태가 없기 때문에 요청이 올 때마다 새로운 서비스 오브젝트를 만들필요가 없는 것
- 스프링 빈으로 사용하기 적합(싱글톤)
서비스의 종류
서버에 존재하는 서비스는 크게 3가지로 분류할 수 있음