1.관심사의 분리
위의 코드는 요일 계산을 코드다. 코드는 크게 입력, 요일 계산, 프로그램(코드) 출력 세 부분으로 나뉜다. 객체지향 설계(OOP설계)의 첫 번째 원칙은 '하나의 메서드는 하나의 책임' 단일책임원칙(SRP)다. 스프링 MVC는 단일 책임에 따라 작성하는 방법론이다. 따라서 위 코드를 MVC 패턴에 따라 작성하면 단일책임원칙에 따라 작성하게 된다.
※객체지향 설계 5원칙
- SRP (Single Responsibility Principle) : 단일 책임 원칙
- OCP (Open-Closed Principle) : 개방 폐쇄 원칙
- LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP (Interface Segragation Principle) : 인터페이스 분리 원칙
- DIP (Dependency Inversion Principle) : 의존관계 역전 원칙
2.공통 코드의 분리 - 입력의 분리
공통코드를 분리해보자. '입력'을 담당하는 부분을 따로 떼내어놓으면 나머지 작업에서는 처리와 출력 두 작업만 수행하면된다. 코드에서는 어떻게 나타낼 수 있을까??
클라이언트의 입력을 받아 request에 2022/2/23의 데이터를 담는다. 데이터를 담은 request는 변경된 코드의 매개변수에 각자 year, month, day라는 이름으로 입력된다. 이를 통해 형변환의 작업은 사라지고 메서드의 매개변수로 request요청의 데이터를 직접 받게된다.
3.출력(view)의 분리 - 변하는 것과 변하지 않는 것의 분리
위의 이미지에서 왼쪽 코드는 클래스 안에 출력하는 코드가 있지만 분리하면 다른 클래스(대부분 jsp를 쓴다)로 나눠 쓸 수 있다. 출력 코드가 같은 클래스에 있을 때는 상관없지만 다른 영역으로 이동하면 매개변수가 달라 출력에 쓰일 데이터를 넘겨줄 수 없다. 이를 위해 모델 객체에 값을 담아 view로 넘겨준다. 왼쪽 그림과 같이 코드의 로직을 처리하는 부분(Controller)와 값을 담는 모델(Model), 그리고 화면을 보여주는 View를 보여주는 코드를 나눈 패턴을 우리는 MVC패턴이라한다.
4.MVC 패턴
앞서 설명한 MVC 패턴을 코드와 함께 도식화 해보면 간단하게 위의 그림과 같이 나타낼 수 있다. (1)브라우저에서 입력요청이 들어오면 DispatcherServlet에서 값을 입력 및 변환하고 (2)로직을 수행하는 Controller로 작업이 이동한다. 로직을 수행함과 동시에 (3)출력 코드에 보낼 값을 DispatcherServlet으로 보내고 DispatcherServlet은 모델을 생성한 후 출력코드를 나타낸 jsp파일로 (4)모델을 객체로 넘긴다. 모델 객체를 넘겨받은 jsp파일은 출력 작업을 수행한 후 (5)완료된 작업을 브라우저에게 보낸다. 조금 더 MVC패턴을 파헤쳐보자.
클라이언트로부터 URL요청이 들어오면 DispatcherServlet은 HandlerMapping에게 URL에 알맞는 메서드 찾기에 대한 책임을 넘기고 HandlerMapping은 URL에 알맞은 메서드 정보를 DispatcherServlet에게 넘긴다. URL에 맞는 메서드 정보를 받은 DispatcherServlet은 메서드를 호출한다.
Controller는 다양한 HandlerAdapter를 가지고 있는데, HandlerAdapter는 DispatcherServlet으로 부터 넘겨받은 메서드 정보를 통해 Controller에게 호출된 메서드에 알맞은 HandlerAdapter 정보를 준다. 이를 통해 DispatcherServlet과 Controller를 느슨하게 연결하고 변경에 유리하게 한다. Controller에서 View에 대한 정보를 얻는다.
View의 정보를 넘겨받은 DispatcherServlet은 ViewResolver에게 뷰를 찾는 책임을 넘기고 ViewResolver는 요청에 알맞은 View의 정보를 DispatcherServlet에게 넘긴다. View에 대한 정보를 넘겨받은 DispatcherServlet은 출력 해야하는 jsp에게 데이터 값을 모델 객체에 담아 데이터 값을 넘겨준다. 출력값을 받은 jsp는 화면에 데이터 값을 입력한 후 클라이언트에게 출력 된 결과물을 보낸다.
출처
- 스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
- https://devpad.tistory.com/24?category=773041
'Spring > SpringMVC' 카테고리의 다른 글
[SpringMVC] rediect와 forward (0) | 2022.02.26 |
---|---|
[SpringMVC] 요청과 응답 (0) | 2022.02.25 |
[SpringMVC] 데이터 변환과 검증 (0) | 2022.02.24 |
[Spring MVC] 예외처리 (0) | 2022.02.23 |
[Spring MVC] 쿠키와 세션 (0) | 2022.02.22 |