Spring을 이용해서 개발하다보면 기계적으로 무언가를 만들거나, 혹은 이 것을 왜 ? 이렇게 구분하거나 사용하거나 궁금증을 가지게 된다.
그럴때가 되면 항상 그 궁금증을 해결하려고 북마크를 걸어놓거나 바로 찾아서 정보를 획득하고 정리하는 편이다..
(물론 북마크만 걸어놓고 미루다가 나중에 하는 경우도..)
오늘은 컨트롤러(Controller) 그리고 서비스(Service)단이다.
이유에 대해서 먼저 설명을 하자면 다음과 같다
- 트랜잭션의 처리
- API의 확장 및 변경
1. 트랙잭션의 처리
내가 아는 트랜잭션은 DB 관련 작업 시 작업의 처리 순서? 단위?정도로 생각을 했었다.
트랜잭션은 DB에 데이터 관련 작업을 하고 업데이트를 할 때, 이 과정들을 한번에 처리하고, 성공 혹은 실패 시 롤백을 하거나, 커밋을 하거나 데이터를 핸들링 해주는 동작이다.
Spring에서는 Service단의 고유한 기능중 하나인 @Transaction 어노테이션을 이용해 트랜잭션을 처리할 수 있다.
2. API의 확장 그리고 변경
만약 컨트롤러에 모든 service 로직이 들어있을때?
성능상의 이슈로 너무 서비스가 느려서 -> 다른 방식을 도입할 때, 그에 맞춰서 다시 controlle로직을 구현
근데 컨트롤러와 서비스가 분리되어 있으면? -> 다른 방식을 도입할 때, 그냥 컨트롤러만 만들어서 service에 연결하면 됨.
Spring Application Layered Pattern & Domain Driven Design Layered Pattern
Spring Application Layered Pattern
Spring에서 흔히 사용하는 계층 구조로 Web Layer에서 사용자의 요청을 받아 Service Layer에서 처리하고, Repository Layer에서 데이터를 핸들링하는 구조
Domain Driven Design Layered Pattern
흔히 말하는 UI Layer에서 사용자의 요청을 받아 응답을 만들어서 Application Layer에서는 기능을 제공한다. Domain Layer에서는 기능을 제공하기 위한 실제 변경 작업을 진행하며 Infrastructure Layer에서는 Database, 다른 Application, 웹 프레임워크등 인프라에 접근하도록 인터페이스를 제공하는 레이어입니다.
Controller는 Web Layer와 User Interface Layer에 해당하고,
Service는 Service Layer와 Application Layer 혹은 Domain Layer에 해당합니다.
Controller에서는 사용자의 입력처리와 응답에만 집중하고, Service에서는 실제 기능을 어떤식으로 제공하는지에 대해서만 집중하여야 나중에 다른 팀원이 코드를 수정할 때도 어떤 기능이 어디에 있는지 쉽게 알 수 있고, 변경하기 유리합니다.
이는 단일 책임 원칙을 지키는 기본입니다.
'스프링' 카테고리의 다른 글
[#1] Spring Security - 시큐리티는 무엇이고, Filter는 무엇인지 (0) | 2022.12.29 |
---|---|
[10분 테코톡] - @JDK Dynamic Proxy & CGLIB (0) | 2022.12.22 |
[10분 테코톡] - @Transactional (0) | 2022.12.21 |
Spring- Lombok의 이해와 @Annotation (계속 추가합니다.) (0) | 2022.12.14 |
스프링 AOP (0) | 2022.12.07 |