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에 전달 안 됨)
- script-let (
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);
}
}