스프링부트 서비스 레이어 사용하는 이유
스프링의 전체적인 구조
web.xml
스프링은 입구에서 클라이언트로부터 들어오는 모든 요청을 검수하는데 이때 검수하는 파일이 바로 배포 서술자이다. 이 배포서술자를 web.xml이라고 부른다.
xml : 통신에서 사용하는 공용어 (그림으로 이해하기)
port : 8080
클라이언트와 스프링 서버를 연결하는 입구이다.
Dispatcher Servlet
프론트 컨트롤러(Front Controller)라고도 불리며 모든 요청을 받는 영역이다. 요청받은 주소를 파싱하여 IoC 컨테이너에 있는 모든 컨트롤러를 스캔하여 함수를 호출한다. 스프링 프레임워크에서는 기본으로 제공하고 있다.
기본 파싱 전략은 x-www-form-urlencoded
Container
클라이언트와 통신하기 위한 중개점. 클라이언트의 요청을 받아 서비스에게 요청 처리를 전담하고 이를 받아 클라이언트에게 응답한다.
Service
데이터베이스와 관련된 트렌젝션을 관리하는 영역. 사용자의 요구사항 처리 DB 정보가 필요할 때는 Repository에게 전담한다.
Repository
DB 관리(연결, 해제, 자원 관리)하는 영역. DB의 CRUD 작업을 처리한다.
Persistence Context
영속성 컨텍스트. 영구적으로 하드디스크에 기록한다.
Session
시작부터 끝까지 떠 있는 메모리 영역이다.
Request
클라이언트의 요청이 들어오면 생겼다가 응답 후에 사라지는 메모리 영역이다.
DI : Dependency Injection
의존성 주입. 생성자(Constructor)가 IoC 컨테이너에 접근하는 것, 생성자에 타입이 있을 경우 Ioc 컨테이너에서 타입을 찾아낸다. 의존성 주입을 할 수 없다는 말은 즉 개발자가 접근할 수 없다는 것과 같다.
서비스 레이어의 역할
트렌젝션 단위로 서비스 관리
<은행 데이터베이스>
FK | 이름 | 잔고 |
1 | 홍길동 | 50,000원 |
2 | 장보고 | 10,000원 |
송금 서비스(Transection) : 홍길동이 장보고에서 2만원을 송금
- READ : 홍길동이 자신의 통장 잔고를 읽는다. 초
- WRITE : 홍길동의 잔고를 3만원으로 업데이트한다. 초
- WRITE : 장보고의 잔고를 1만원에서 3만원으로 업데이트한다. 초
입금 서비스(Transection) : 장보고가 자신의 통장에 4만원을 입금
- READ : 장보고가 자신의 통장 잔고를 읽는다. 초
- WRITE : 장보고가 자신의 통장에 돈을 4만원 입금한다. 초
서비스 레이어로 트렌젝션 관리
컨트롤러에서 이러한 트렌젝션을 관리하게 되면 데이터베이스에 write하는 동안 다른 사용자의 접근이 불가능해진다. 위의 첫번째 그림처럼 하나의 트렌젝션에서 데이터베이스에 접근하는 시간은 2초 밖에 걸리지 않는데 다른 작업을 수행하기 위해서 15초라는 시간을 더 다른 사용자가 데이터베이스에 접근하지 못하게 막아버린다.
이러한 문제를 해결하기 위해서 데이터베이스 접근을 하지 못하게 만드는 트렌젝션을 서비스 레이어에서 관리하게한다. 위의 두번째 그림처럼 데이터베이스에 접근할 필요가 없는 다른 작업을 컨트롤러에서 수행하게 만들고 데이터베이스에 접근하는 작업을 서비스 레이어에서 처리하게 만들면 데이터베이스에 접근을 하지 못하는 시간은 단 2초밖에 되지 않는다.
스프링에서는 Controller, Service, Repository에 대한 어노테이션(@RestController와 @Controller, @Service, @Repository)을 제공한다. 단, Repository의 경우 JPA를 extands하면 어노데이션을 붙이지 않아도된다.