스프링 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(서비스) 계층을 별도로 만듬


적용

  • ServletController로 사용
  • JSPView로 사용
  • HttpServletRequestModel로 사용

회원 등록 폼 - Controller


  • /WEB-INF
    • 해당 경로에 JSP 파일을 위치시켜서 외부에서 접근할 수 없게 처리
  • dispatcher
    • 다른 Servlet이나 JSP로 이동하는 기능
  • redirect VS forward
    • 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 패턴