ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링 MVC 1] 3. 서블릿, JSP, MVC 패턴
    INFLEARN/스프링 MVC 1편 2021. 10. 18. 23:50

    3. 서블릿, JSP, MVC 패턴

     

    [강의 정리] 김영한님 :: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

     

     

     

    1. 회원 관리 웹 애플리케이션 요구사항

     

    # 기능 요구사항

    • 회원정보
      • 이름 : username
      • 나이 : age
    • 회원 저장
    • 회원 목록 조회

     

    # 도메인 모델 

     

    # 회원 저장소

    • 싱글톤 패턴 적용 (스프링 없이 순수 서블릿으로 구현하는 것이 목적)

    • save(Member member)
    • findById(Long id)
    • findAll()
    • clearStore()

     

    # 회원 저장소 테스트 코드

    • 회원을 저장하고, 목록을 조회하는 (findAll()) 테스트 작성
    • clearStore()로 각 테스트에 영향 주지 않도록

     

    2. 서블릿으로 회원 관리 웹 애플리케이션 만들기

     

    # 회원 등록 폼 - MemberFromServlet

    • 단순하게 회원 정보를 입력할 수 있는 HTML Form을 만들어서 응답

    # 회원 저장 - MemberSaveServlet

    • request.getParameter로 조회 후 Member 객체 생성
    • Member 객체를 MemberRepository 통해서 저장
    • Member 객체 -> 동적 HTML 응답 

     

    # 회원 목록 - MemberListServlet

    • memberRepository.findAll() 모든 회원 조회

    • 회원 목록 HTML을 동적으로 생성하고 응답

     

    # 템플릿 엔진

    • 서블릿은 html을 java 코드로 만들어서 매우 불편하고 비효율적
    • 템플릿 엔진은 html에다가 java 코드를 중간중간 넣는 방식으로 보다 편리 (ex. JSP, Thymeleaf)
    • 스프링과 잘 통합되는 Thymeleaf 주로 사용, JSP는 스프링 부트에서 권장하지 않고 성능과 기능면에서 밀리면서 점점 사장되어 가는 추세

     

    3. JSP로 회원 관리 웹 애플리케이션 만들기

     

    # JSP 라이브러리 추가

    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    implementation 'javax.servlet:jstl'

    # 회원 등록 폼 JSP

    • JSP 시작 (첫 줄 : JSP 문서)
    • 회원 등록 폼 JSP는 HTML과 유사
    • JSP는 서버 내부에서 서블릿으로 변환 (MemberFormServlet과 거의 비슷한 모습으로 변환)

    • 실행 시 .jsp 까지 적어야 함

     

    # 회원 저장 JSP

    • JSP는 자바 코드를 그대로 사용할 수 있음

    • 자바 코드 입력 <% ~~ %>

    • 자바 코드 출력 <%= ~~ %>

    • 회원 저장 JSP는 회원 저장 서블릿 코드와 같고, 다른 점은 HTML 중심에 자바 코드를 부분적으로 입력

     

    # 회원 목록 JSP

    • 회원 리포지토리 조회

    • 결과 List를 사용해 출력

     

    # 서블릿과 JSP의 한계

    • 서블릿 : 뷰(View) 화면과  HTML이 자바 코드에 섞여서 지저분하고 복잡함
    • JSP : 뷰를 생성하는 HTML 영역은 깔끔 + 동적으로 필요한 부분만 자바 코드로 구현 -> 뷰 영역 + 비즈니스 로직 이 섞여서 너무 많은 역할을 JSP가 처리함

    => MVC 패턴의 등장 (비즈니스 로직은 서블릿처럼 다른 곳에서 처리 + JSP는 HTML로 뷰(화면) 그리기)

     

     

    4. MVC 패턴 - 개요

     

    # 너무 많은 역할

    • 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하면, 너무 많은 역할을 하게 되고 결과적으로 비즈니스 로직과 UI를 변경할 때도 섞여 있는 코드 때문에 변경이 어려움 (유지보수 어려움)

     

    #  변경의 라이프 사이클

    • UI를 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고 서로 영향을 주지 않음

     

    #  기능 특화

    • JSP와 같은 뷰 템플릿은 화면을 렌더링하는데 최적화 되어 있어 해당 영역 업무만 처리하는게 더 효과적

     

    #  Model View Controller

    • MVC 패턴은 하나의 서블릿이나 JSP로 처리하던 것을 컨트롤러(Controller)와 뷰(View) 영역으로 나눈 것을 말함
    • 웹 애플리케이션은 보통 MVC 패턴을 사용
    • 컨트롤러(Controller)
      • HTTP 요청을 받아서 파라미터를 검증
      • 비즈니스 로직을 실행 (호출)
        • 컨트롤러에 비즈니스 로직을 두게되면 컨트롤러가 너무 많은 역할을 담당
        • 일반적으로 비즈니스 로직은 서비스(Service) 계층에서 처리 
      • 뷰에 전달할 결과 데이터를 조회해서 모델에 담음
    • 모델(Model)
      • 뷰에 출력할 데이터 담음
    • 뷰(View)
      • 모델에 담겨있는 데이터 사용하여 화면 그림
      • 뷰가 필요한 데이터는 모델에서 전달하므로 뷰는 비즈니스 로직이나 데이터 접근 몰라도 됨

    출처 : 김영한님 강의 자료 (MVC 패턴 1)

     

    출처 : 김영한님 강의 자료 pdf 캡쳐 (MVC 패턴 2)

     

    5. MVC 패턴 - 적용

     

    #  서블릿을 컨트롤러로, JSP를 뷰로 사용하여 MVC 패턴 적용

    • Model은 HttpServletRequest 객체 사용
    • request 내부 데이터 저장소 (request.setAttribute(), request.getAttribute()) - 데이터 보관 조회 가능

     

    #  회원 등록 폼 - 컨트롤러

    • JSP 호출

    • dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능 (서버 내부에서 호출 발생)
    • /WEB-INF : 이 경로 안에 있으면 외부에서 직접 JSP 호출 불가 (무조건 컨트롤러 통하게)
    • redirect vs forward
      • redirect : 실제 클라이언트에 응답이 나갔다가, 클라이언트가 redirect 경로 재요청 (url 경로 실제 변경)
      • forward : 서버 내부에서 일어나는 호출 (클라이언트 인지 불가)

     

    #  회원 등록 폼 - 뷰

    • 회원 등록 폼

    • 상대 경로 (/ 없음) 사용 : 폼 전송시 현재 URL이 속한 계층 경로 + save 호출 (다른 컨트롤러에서 해당 jsp 계속 사용 가능)

     

    #  회원 저장 - 컨트롤러

    • HttpServletRequest를 모델로 사용
    • request가 제공하는 setAttribute() 사용하여 request 객체에 데이터 보관하고 뷰에 전달 (뷰는 getAttribute()로 데이터 꺼냄)

     

    #  회원 저장 - 뷰

        • 회원 저장

        • <%= request.getAttribute("member")%> 로 모델에 저장한 member 객체 꺼낼 수 있지만 복잡
        • ${}는 JSP가 제공하는 문법. request의 attribute에 담긴 데이터 편리하게 조회 가능

     

    # 회원 목록 조회 - 컨트롤러

    • request 객체 사용하여 List<Member> members에 모델 보관

     

    #  회원 목록 조회 - 뷰

    • jstl : <c:forEach> 기능 사용하기 위해 선언 

    • 모델에 담아둔 members를 JSP가 제공하는 taglib 기능을 사용하여 출력
    • members 리스트에서 member를 꺼내서 item 변수에 담고 출력하는 과정 반복

     

     

    6. MVC 패턴 - 한계

     

    #  MVC 패턴의 한계

    • MVC 패턴 -> 컨트롤러 역할과 뷰 렌더링 역할 명확하게 구분 가능
    • 하지만, 컨트롤러는 중복이 많고 필요하지 않은 코드들도 많이 보임

     

    #  MVC 컨트롤러의 단점

    • 포워드 중복
      • View로 이동하는 코드 항상 중복 호출 (공통화 해도 메서드 항상 직접 호출 필요)

    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);

    • Viewpath 중복
      • prefix : /WEB-INF/views/
      • suffix : .jsp

    String viewPath = "/WEB-INF/views/members.jsp";

    • 사용하지 않는 코드
      • 특히 response는 현재 코드에서 사용되지 않음

    HttpServletRequest request, HttpServletResponse response

    • 공통 처리가 어렵다
      • 공통 기능을 메서드로 뽑아도 결과적으로 해당 메서드를 항상 호출해야함
      • 해결하기 위해서는 컨트롤러 호출 전에 먼저 공통 기능 처리 필요
      • 프론트 컨트롤러(Front Controller) 패턴 도입! (수문장 역할)

    댓글

Programming Diary