Spring ‐ 서블릿, JSP, MVC 패턴 - thought-corner/Backend-PlayGround GitHub Wiki
서블릿
- 코드의 가독성 최악 : 수많은 HTML 태그를 자바 코드 내에서 직접 출력해야 하므로 코드가 매우 지저분해진다.
- 유지보수의 어려움 : 비즈니스 로직과 화면 UI 로직이 한 곳에 뒤섞여 있어, 단순한 오타 하나를 수정하려 해도 자바 코드를 다시 컴파일하고 서버를 재기동해야 한다.
- 협업의 비효율성 : 개발자가 디자인(HTML)까지 다루거나, 디자이너가 자바 코드를 이해해야 하는 불합리한 상황이 발생한다.
- 템플릿 엔진의 도입
- JSP(Java Server Pages) : 서블릿의 단점을 보완해 큰 인기를 끌었으나, 여전히 HTML 내에 복잡한 자바 로직이 섞일 수 있다는 단점이 존재한다.
- Thymeleaf/Mustache/FreeMarker : 최신 프레임워크(Spring Boot 등)에서 권장하는 방식으로 타임리프는 HTML 마크업을 깨뜨리지 않고 그대로 유지하며 렌더링하는 Natural Templates 기능을 제공한다.
JSP
- 지나친 책임 분담 부재 : HTML 코드 사이에 자바 로직이 직접 들어가면서 비즈니스 로직, DB 접근 로직, UI 로직이 한 파일에 뒤섞인다.
- 유지보수 지옥 : 코드 수만 줄이 넘는 JSP 파일 하나에서 디자인을 수정하다가 백엔드 로직을 건드리거나, 그 반대의 상황이 빈번하게 발생한다.
- 낮은 재사용성 : HTML과 로직이 강하게 결합되어 있어, 로직만 따로 떼어내어 테스트하거나 다른 곳에 재사용하기가 매우 어렵다.
- MVC 패턴의 도입
- 이런 JSP 문제들을 해결하기 위해 MVC(Model-View-Controller) 패턴이 도입되었다.
MVC(Model - View - Controller) 패턴
- MVC(Model - View - Controller)
- Controller : HTTP 요청을 받아서 파라미터를 검증하고 비즈니스 로직을 실행한다.
- Model : 뷰에 출력할 데이터를 담아둔다.
- View : 모델에 담긴 데이터를 사용해서 화면을 그리는 일에 집중한다.(HTML 생성)
- MVC는 사용자 인터페이스 개발에 흔히 사용되는 소프트웨어 아키텍처 패턴으로, 프로그램 로직을 서로 연결된 세 가지 요소로 분리한다.
1. Model
- 애플리케이션의 동적인 데이터 구조이며, 인터페이스와 독립적이다.
- 데이터, 로직, 그리고 애플리케이션의 규칙을 직접 관리한다.
2. View
- 차트, 다이어그램, 테이블 등 정보를 시각적으로 표현한다.
- 동일한 정보를 여러 방식으로 보여줄 수 있다.
3. Controller
- 사용자의 입력을 받아 모델이나 뷰에 전달할 명령으로 변환한다.
- 모델과 뷰 사이를 연결하는 가교 역할을 수행한다.
- URL 리디렉션은 하나의 URL을 통해 접속했을 때 다른 URL로 연결되게 하는 기술이다.
1. URL 리디렉션(URL Redirection / HTTP Redirect)
- 클라이언트가 서버에 요청을 보내면, 서버는 HTTP 응답 상태 코드와 함께 새로운 위치를 응답한다.(3xx와 Location 헤더)
- 브라우저는 이 응답을 확인하고 새로운 URL로 다시 요청을 보낸다.
2. 포워드(Forward)
- 서블릿 컨테이너 내부에서 일어나는 서버 측 이동 방식이다.
- 클라이언트가 서버에 요청을 보내면, 서버 내부 리소스가 다른 리소스로 제어권을 넘겨주는 방식이다.
- 이 모든 과정은 서버 안에서만 일어나며 브라우저는 이를 인지할 수 없다.