Spring Framework의 controller,repository,service 클래스를 만들어서 각각의 역할에 맞게 개발을 진행했다. 각 층별로 하는 역할이 무엇인지 그리고 왜 Layer를 나누어야 하는지에 대해 조사한 것을 기록해보자
Layer는 관심사의 집합이다. 따로 각각의 집합이라고 표현하지 않고 Layer라고 표현하며 계층관계를 나타내는 것은 , 상위 Layer에서 하위Layer로만 컨트롤 할 수 있기 때문이다.
구체적인 예시를 들면, PresentLayer에 있는 Controller는 Service의 인터페이스를 조작하여 데이터를 전달 받을 수 있지만 Service는 Controller를 조작하는 코드를 작성하면 안된다.
또한 관심사의 집합이라 표현한 이유는 관심사 주제별로 층을 많이 나누면 구조가 복잡해지기 때문에 관심사를 묶어 계층으로 나타냈다.
Layer 생성에는 두가지 원칙이 존재한다.
1. 소프트웨어를 만들 때, 관심사를 명확히 알고 Layer에 관심사를 정해줄 것 ( Layer의 책임역할 이 분명해진다.)
2. 분리하되, 너무 많은 Layer를 생성하지 말것.
위의 계층을 나누는 원칙을 생각하여, Spring MVC 관점으로 관심사를 나누어 보자
이렇게 관심사가 나누어지고 spring 에서는 보편적으로 3개의 Layer로 분리해서 사용한다
Presentational Layer - Service Layer - Repository Layer
*cf) 비지니스 로직이란? = 업무처리에 대한 로직이다
예를들어 쇼핑몰 사이트의 view(웹페이지) 를 통해 주문이라는 행동을 요청하게 되면, 우리는 업무처리에 대한 로직을 실행해서 주문에 맞는 행동을 서버에서 진행해야한다. 이 때, 주문에 해당하는 로직들을 service layer에서 수행한다고 생각하면 좋을거 같다.
이렇게 층별로 관심사가 나뉘어 진다. 또한 3개의 레이어로 나눈 이유 중 하나는 재사용성에 있다.
만약 쇼핑 페이지에서 사용자의 요청이 웹페이지가 아닌 윈도우 어플리케이션에서 요청하는 것으로 바뀌었다. 그렇다고 가정하면, 사용자의 요청에 따른 비지니스 로직이 바뀔까? 혹은 DB가 바뀔까?
Presentationa layer가 바뀌었다 하여 service layer, repository layer가 바뀌진 않는다.
service layer를 기준으로 쉽게 때어낼 수 있또록 presentational layer 에 대한 설정과 repository layer, service layer의 설정을 분리한다.
그래서 service Layer를 기준으로 controller 간 의존성을 낮추기 위해 service interface를 작성한다.
https://www.petrikainulainen.net/software-development/design/understanding-spring-web-application-architecture-the-classic-way/
https://jurogrammer.tistory.com/78