Written by
Sunwoo Han
on
on
서블릿, JSP, MVC 패턴
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 공부하고 정리하는 포스트입니다.
서블릿, JSP, MVC 패턴
개요
- Java 백엔드 웹 기술의 역사에 따라 순차적으로 어떻게 발전되었는지 비교
- 서블릿 -> JSP -> MVC 패턴 -> 프론트 컨트롤러 패턴 -> 스프링 MVC
회원관리 웹 애플리케이션 요구사항
- 회원정보
- 이름 : username
- 나이 : age
- 기능 요구사항
- 회원 저장
- 회원 목록 조회
회원 도메인 모델
회원 저장소
회원 저장소 테스트 코드
서블릿(Servlet)
MemberFormServlet - 회원 등록 폼
MemberSaveServlet - 회원 저장
MemberListServlet - 회원 목록
한계점
- Java 코드로 HTML을 만드는 과정이 매우 비효율적
- 템플릿 엔진이 등장한 이유!
JSP(Java Server Page)
- Java 언어를 기반으로 하는 Server Side 스크립트 언어
- HTML 코드에 Java 언어를 넣어 동적인 웹 페이지 생성
- Java 코드로 HTML을 비효율적으로 작성하는 서블릿(Servlet)의 단점을 개선
- JSP는 내부적으로 Servlet으로 변환되어 실행
- page import
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
- Java 코드 삽입
<% ~~ %>
- Java 코드 출력
<%= ~~ %>
회원 등록 폼 JSP
- 실행 시 .jsp까지 붙여서 실행
회원 저장 JSP
- member를 조회하는 코드를 view에 삽입
회원 목록 JSP
- member를 조회하는 코드를 view에 삽입
한계
- 비즈니스 로직이 모두 JSP에 노출
- JSP가 비즈니스 로직 + view의 역할을 모두 해야함
- 규모가 커질수록 관리하기 힘들어짐
- 비즈니스 로직과 뷰가 한 곳에 있음
- 따로 관리해야 함!
- 이러한 JPS의 한계 때문에 Model View Controller로 역할을 분리한 MVC 패턴이 등장함
MVC 패턴
개요
- 하나의 서블릿이나 JSP만으로 모두 처리하려면 너무 많은 역할이 주어짐
- 유지보수가 어려워짐
- 변경의 라이프 사이클이 다름
- UI를 수정하는 일 / 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고 서로 영향을 주지 않음
- 따라서, 변경의 라이프 사이클이 다른데 하나의 코드로 관리하는 것은 유지보수에 좋지 않음
- JSP 같은 뷰 템플릿은 화면을 렌더링하는데 최적화
- 해당 부분의 업무만 담당하는 것, 즉 기능특화가 효과적
- Model / View / Controller로 역할 분리
- Model : View에 출력할 데이터를 담아두는 역할
- View : Model에 담겨있는 데이터를 통해 화면에 렌더링 하는 역할
- Controller : HTTP 요청 파라미터를 검증 / 비즈니스 로직 수행 / 결과 데이터를 Model에 담음
- Controller에 비즈니스 로직을 둘 수 있지만, 그렇게 되면 너무 많은 일을 담당
- 그래서 일반적으로 비즈니스 로직을 수행하는 Service(서비스) 계층을 별도로 만듬
적용
Servlet
을Controller
로 사용JSP
를View
로 사용HttpServletRequest
를Model
로 사용
회원 등록 폼 - Controller
/WEB-INF
- 해당 경로에 JSP 파일을 위치시켜서 외부에서 접근할 수 없게 처리
- dispatcher
- 다른 Servlet이나 JSP로 이동하는 기능
redirect
VSforward
- redirect : 실제 클라이언트(웹 브라우저)에 응답이 나갔다가 redirect 경로로 다시 요청(url 경로 변경 여부 O)
- forward : 서버 내부에서 호출해서 페이지를 이동하는 것(url 경로 변경 X)
회원 저장 - Controller
- Model 역할을 하는 HttpServletRequest 객체에 저장
- HttpServletRequest 객체 내부에 Map과 같은 것이 존재
- 저장된 데이터는 View에서 꺼내 쓸 수 있음
회원 목록 - Controller
한계
- 포워드(forward) 중복 : viewPath를 지정하고 이동시키는 과정이 모든 Servlet에 반복적으로 발생
- ViewPath 중복 : 모든 절대 경로를 입력해야 하기 때문에 viewPath 입력 시 중복 발생
- prefix : /WEB-INF/views/
- suffix : .jsp
-
사용하지 않는 코드 : HttpServletRequest / HttpServletResponse 객체를 사용하지 않음에도 파라미터로 받는 경우가 존재
- 공통처리 어려움
- 공통으로 중복되는 부분을 하나로 처리하지 못해 전체적으로 중복이 많이 발생
- 위와 같은 문제점들 때문에 공통 부분을 효율적으로 처리하는 프론트 컨트롤러(Front Controller) 패턴이 필요
- 스프링 MVC의 내부 구조의 핵심이 바로
Front Controller
패턴
Comments
SPRING 의 다른 글
-
스프링 타입 컨터버 24 Jun 2022
-
API 예외 처리 17 Jun 2022
-
예외 처리와 오류 페이지 12 Jun 2022
-
로그인 처리 - 인터셉터 08 Jun 2022
-
로그인 처리 - 필터 06 Jun 2022
-
로그인 처리 - 쿠키, 세션 31 May 2022
-
Bean Validation 22 May 2022
-
검증 22 May 2022
-
메시지, 국제화 21 May 2022
-
타임리프 - 스프링 통합과 폼 19 May 2022
-
타임리프 - 기본 기능 10 May 2022
-
스프링 MVC 기본 기능 - 웹 페이지 만들기 02 May 2022
-
스프링 MVC 기본 기능 - HTTP 응답 30 Apr 2022
-
스프링 MVC 기본 기능 - HTTP 요청 24 Apr 2022
-
스프링 MVC 기본 기능 - 요청 매핑 19 Apr 2022
-
스프링 MVC 기본 기능 19 Apr 2022
-
스프링 MVC 구조 이해 14 Apr 2022
-
MVC 프레임워크 만들기 - V4, V5 12 Apr 2022
-
MVC 프레임워크 만들기 - V1, V2, V3 09 Apr 2022
-
서블릿, JSP, MVC 패턴 05 Apr 2022
-
서블릿 29 Mar 2022
-
웹 애플리케이션 이해 24 Mar 2022
-
스프링 웹 계층이란? 05 Nov 2021
-
스프링 시큐리티 공식문서 번역 27 Sep 2021
-
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP 27 Apr 2021
-
SpEL (스프링 Expression Language) 25 Apr 2021
-
데이터 바인딩 추상화 : Converter와 Formatter 21 Apr 2021
-
데이터 바인딩 추상화 : PropertyEditor 12 Apr 2021
-
Validation 추상화 10 Apr 2021
-
Resource 추상화 08 Apr 2021
-
IoC 컨테이너 9부 07 Apr 2021
-
IoC 컨테이너 8부 06 Apr 2021
-
IoC 컨테이너 7부 02 Apr 2021
-
IoC 컨테이너 6부 29 Mar 2021
-
IoC 컨테이너 5부 27 Mar 2021
-
IoC 컨테이너 4부 23 Mar 2021
-
IoC 컨테이너 3부 20 Mar 2021
-
IoC 컨테이너 2부 18 Mar 2021
-
IoC 컨테이너 1부 12 Mar 2021
-
스프링 PSA 07 Jan 2021
-
스프링 @AOP 실습 07 Jan 2021
-
프록시 패턴 06 Jan 2021
-
스프링 AOP 04 Jan 2021
-
의존성 주입(Dependency Injection) 04 Jan 2021
-
스프링 빈(Bean) 02 Jan 2021
-
스프링 IoC 컨테이너 01 Jan 2021
-
스프링 IoC 01 Jan 2021