FireDrago
[Servlet] MVC 패턴의 출현 본문
1. Servlet 으로 웹 개발
Servlet 만으로 웹개발을 하던 초기에는 이런 식의 코드가 작성되었다.

위 코드의 문제점은 비지니스 로직 (회원 목록 가져오기) 과 html 페이지(회원 목록 출력)가 함께 있다는 것이다..
간단한 로직이라 크게 체감되지 않지만, 비지니스 로직이 복잡해질수록
비지니스 코드의 양도 늘어날 것이고, html 코드도 더 복잡해질 것이다. 코드가 너무 지저분해진다.
2. JSP의 출현
이에 따라 html 코드를 기반으로 필요할때만 자바코드를 중간에 삽입할수 있는 '템플릿엔진' 이 생겨나게 된다.
대표적으로 JSP가 있다. JSP로 위 Servlet 코드를 어떻게 표현할 수 있을까?

jsp 에서는 HTML의 기반위에 자바 코드가 필요할때는 자바코드를 중간중간 삽입하고,
태그라이브러리와 EL태그 (${}) 등을 활용하여 동적인 html 페이지를 만들수 있게 되었다.
그러나 jsp 역시 요구사항이 복잡해질 수록, 자바코드와 html 코드가 섞여 지저분해지는 문제점을 가지고 있었다.
1. 변경의 라이프 사이클 문제
- Servlet 이든 JSP 든 UI 변경과 비지니스 로직 변경의 두가지 라이프사이클을 모두 처리한다.
둘은 관련이 없는 경우가 많은데 두가지 변경 사이클을 다 처리해야 하는 것이다. 이는 유지보수를 어렵게 만든다.
2. 너무 많은 역할
- html 코드가 잘못되어도 코드를 수정해야하고, 비지니스 로직이 잘못되어도 코드를 수정해야한다. 이때 코드가
수천줄일때를 상상해보면 얼마나 복잡한 문제가 발생할지 예상가능하다.
3. MVC 패턴의 출현
개발자들은 동적 html 생성에 특화된 JSP는 화면 출력에만 집중하고,
Servlet은 비지니스 로직만 담당할 수 있는 구조를 만들어 냈다. 그것이 바로 MVC 패턴이다.


코드로 MVC 패턴이 어떻게 작동하는지 살펴보자

Servlet 과 JSP에서 봤던 회원목록 조회 로직을 MVC 패턴으로 리팩토링한 코드 중 Controller 코드다.
html 정보를 직접 작성하여 반환했던 이전 코드와 달리, View 역할을 담당하는 jsp 파일의 경로를 입력하고,
RequestDispatcher 객체를 사용하여 jsp 페이지로 forward 보낸다.
(Model 의 역할은 Request 객체가 수행하고 있다. Model은 컨트롤러가 View에 정보 전달할때 사용된다)
※ forward 와 redirect 차이
- forward는 클라이언트의 요청을 그대로 다른 리소스로 전달하는 것을 말한다. 즉, 클라이언트가 요청한 URL과 다른 URL로 요청이 전달되지만, 요청 정보는 그대로 유지된다. 따라서, forward는 요청 처리 속도가 빠르고, POST 요청과 같은 요청 정보가 필요한 경우에도 사용할 수 있다.
- redirect는 클라이언트에게 새로운 요청을 보내도록 하는 것을 말한다. 즉, 클라이언트가 요청한 URL과 다른 URL로 요청이 전달되며, 요청 정보는 새로 전달된다. 따라서, redirect는 요청 처리 속도는 느리지만, POST 요청과 같은 요청 정보가 필요한 경우에도 문제가 되지 않는다.
forward 된 members.jsp 를 살펴보자

복잡한 자바코드는 사라지고 Request 객체를 통해 전달된 members를 ${members} 를 사용하여 꺼내고
html 페이지를 동적으로 렌더링 한다. 이전과 달리 html을 생성하는 것에만 집중한다.
4. MVC 패턴의 한계
MVC 패턴을 구현하여, 유지보수가 편리하고 역할이 분명한 코드를 만들 수 있게되었다.
하지만 위의 MVC 패턴은 가장 기초적인 MVC 패턴으로 공통기능을 처리하기 힘들다는 점과
일부 중복이 있다는 단점이 있다. 다음 포스팅에서는 MVC 패턴을 단계적으로 리팩토링 하여
더 깔끔하고, 유지보수가 편리한 MVC 패턴으로 업그레이드 해보자
'프로그래밍 > Servlet' 카테고리의 다른 글
| [Servlet] MVC 패턴 업그레이드 하기 (0) | 2024.01.25 |
|---|---|
| [Servlet] Servlet 사용법 (Request, Response) (0) | 2024.01.22 |
| [Servlet] 서블릿이란 (0) | 2024.01.19 |
| [Servlet] 세션(Session) (0) | 2023.07.07 |
| [Servlet] 포워드, 바인딩 (0) | 2023.07.04 |
