2025-09-28

오늘 배운 것

JSP & MVC

JSP 소개 및 특징

기존 Servlet의 문제점

  • Java 코드 속에 HTML 태그를 작성해야 해서 가독성이 떨어짐
  • 비즈니스 로직과 프레젠테이션 로직이 뒤섞임

JSP란?

  • Jakarta Server Pages
  • HTML 태그 기반에 Java 코드를 작성하는 방식
  • Servlet보다 직관적이며 유지보수 용이

JSP 동작 원리

  • JSP는 결국 Servlet으로 변환됨 (중간단계)
  • Life Cycle: 변환 → 컴파일 → 실행
  • 생성된 자바 파일은 컨테이너 내부에 저장됨

JSP 작성

JSP 구성 요소

  • directive (지시자): JSP 실행 시 필요한 정보를 컨테이너에 전달
  • 스크립트 요소
    • script-let (<% ... %>): _jspService() 내부 실행문
    • declaration (<%! ... %>): 멤버 변수, 메서드 선언
    • expression (<%= ... %>): 출력 (out.print() 형태 변환)
    • comment (<%-- ... --%>): JSP 전용 주석 (Servlet에 전달 안 됨)

page directive

  • JSP page의 기본 정보 지정 (language, contentType, pageEncoding 등)

JSP 내장 객체

내장 객체

  • JSP 실행 시 _jspService() 메서드 내부에 자동으로 선언되는 객체
  • 예: request, response, session, out

Scope

  • 데이터를 저장·공유하는 영역
    • page: 현재 페이지에서만 유지
    • request: 요청이 유지되는 동안 공유
    • session: 클라이언트와의 세션 동안 유지
    • application: 애플리케이션 전체에서 공유

Servlet vs JSP

  • Servlet: Java 코드 기반, HTML 삽입
  • JSP: HTML 기반, Java 삽입
  • JSP는 직관적이지만, 결국 Servlet으로 변환되어 실행됨

MVC 디자인 패턴

MVC란?

  • Model: 비즈니스 로직, DB 연동
  • View: UI 담당
  • Controller: 요청을 받아 Model과 View를 연결

Model 1 방식

  • JSP가 Controller + View 역할 모두 수행
  • 장점: 구조 단순, 개발 속도 빠름
  • 단점: 유지보수 어려움, 확장성 부족

Model 2 방식 (MVC)

  • Servlet이 Controller, JSP는 View
  • 장점: 구조 명확, 유지보수 및 확장성 용이
  • 단점: 초기 개발 복잡, 학습 곡선 있음

웹 컴포넌트 호출

forward

  • RequestDispatcher#forward
  • 같은 request, response 객체 유지
  • 서버 내부에서 제어 이동

redirect

  • HttpServletResponse#sendRedirect
  • 클라이언트에게 새로운 요청을 발생시킴
  • 외부 리소스 접근 가능
  • request에 저장된 정보는 유지되지 않음

forward vs redirect

  • forward: 서버 내부 이동, 속도 빠름, 데이터 공유 가능
  • redirect: 클라이언트 요청 새로 발생, 외부 리소스 가능, 데이터 유지 불가

ControllerHelper (Utility Method)

public interface ControllerHelper {
    default String getActionParameter(HttpServletRequest request, HttpServletResponse response) {
        String action = request.getParameter("action");
        return (action == null || action.isBlank()) ? "index" : action;
    }

    public default void redirect(HttpServletRequest request, HttpServletResponse response, String path) throws IOException {
        if (path.startsWith("/")) {
            response.sendRedirect(request.getContextPath() + path);
        } else {
            response.sendRedirect(path);
        }
    }

    public default void forward(HttpServletRequest request, HttpServletResponse response, String path) throws ServletException, IOException {
        RequestDispatcher disp = request.getRequestDispatcher(path);
        disp.forward(request, response);
    }
}

results matching ""

    No results matching ""