[LG U+ 유레카 3기]Servlet, JSP, MVC 패턴 (+Postman)정리

2025. 10. 29. 15:54Java/JSP

❶ 서블릿(Servlet)과 JSP(Java Server Page) 개념

ServletJava 기반 웹 애플리케이션의 핵심 구성 요소로, 클라이언트의 요청을 처리하고 응답을 생성하는 서버 측 프로그램입니다. 서블릿은 주로 서버에서 비즈니스 로직을 처리하며, HTTP 요청을 받고 응답을 생성하는 역할을 합니다.

JSP (Java Server Pages)는 HTML 코드 안에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. JSP는 클라이언트에게 표시할 내용을 작성하는 데 주로 사용되며, 서블릿과의 차이점은 비즈니스 로직을 처리하지 않고 화면 출력만 담당한다는 것입니다. JSP는 서버 측에서 동적으로 생성된 HTML을 클라이언트에게 반환합니다.

Servlet과 JSP의 관계는 다음과 같습니다:

  • Servlet: 클라이언트의 요청을 받아 비즈니스 로직을 처리하고, JSP로 결과를 전달
  • JSP: 비즈니스 로직을 처리한 후 HTML 형태로 결과를 클라이언트에게 전달


❷ MVC 패턴 개념

MVC (Model-View-Controller)는 웹 애플리케이션에서 비즈니스 로직과 사용자 인터페이스를 분리하여, 유지보수성과 확장성을 높이기 위한 설계 패턴입니다. 이 패턴은 애플리케이션을 세 가지 주요 구성 요소로 나누어 처리합니다:

  • Model: 데이터와 비즈니스 로직을 처리하는 역할을 하며, 데이터베이스와의 상호작용을 담당합니다. 예를 들어, 데이터를 저장하거나 조회하는 작업을 처리합니다.
  • View: 사용자 인터페이스로, 클라이언트에게 보여지는 화면을 담당합니다. JSP는 View로서 화면을 출력합니다.
  • Controller: 클라이언트의 요청을 받아 적절한 Model을 호출하고, 결과를 View로 전달하여 화면을 업데이트합니다. 서블릿은 Controller 역할을 합니다.

MVC 패턴을 통해 각 구성 요소가 서로 분리되어 있기 때문에 유지보수가 용이하고, 새로운 기능 추가가 쉬워집니다.


❸ ParamServlet 실습 (GET / POST 처리)

다음으로 ParamServlet.java를 이용한 GET과 POST 요청 처리 실습을 진행했습니다. 실습에서는 username, password 파라미터를 처리하여 GET 방식의 검색과 POST 방식의 로그인 기능을 구현했습니다.


@WebServlet("/param")
public class ParamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String searchWord = req.getParameter("searchWord");
        resp.getWriter().println("Search Word: " + searchWord);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        resp.getWriter().println("Username: " + username);
        resp.getWriter().println("Password: " + password);
    }
}

핵심 포인트:

  • request.getParameter() 사용: GET/POST 방식의 파라미터를 처리
  • request.setCharacterEncoding("utf-8") → 한글 처리 필수
  • GET과 POST 방식의 차이를 이해하고 각각의 파라미터를 어떻게 처리하는지 실습

❹ Postman으로 요청 확인

실습에서는 Postman을 이용해 GET/POST 요청을 보냈고, 콘솔에서 그 결과를 확인할 수 있었습니다.

Postman 

콘솔 출력 결과:

Postman을 통해 요청을 보내고 request-응답 사이클을 학습하며, 서버와의 연동이 잘 이루어졌는지 확인했습니다.


❺ BookServlet.java (CRUD 분기 실습)

이번에는 하나의 Servlet에서 여러 CRUD 작업을 분기 처리하는 실습을 진행했습니다. switch 문을 사용하여 job 파라미터에 따라 각 CRUD 작업을 구분했습니다.

두가지 방법으로 실습 진행하였습니다.

package servlet;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

// 하나의 서블릿으로 book 의 crud 처리
//   방법 1. job 파라미터 추가
// REST 방식 X
//@WebServlet("/books") // 방법 1
@WebServlet("/books/*") //방법 2
public class BookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

//	@Override
//	protected void doGet(HttpServletRequest request, HttpServletResponse response)
//			throws ServletException, IOException {
//		String job = request.getParameter("job");
//		switch (job) {
//		case "list":
//			list();
//			break; // get http://localhost:8080/WebBasic/books?job=list
//		case "detail":
//			detail();
//			break; // get http://localhost:8080/WebBasic/books?job=detail&bookId=123
//		case "insert":
//			insert();
//			break; // post http://localhost:8080/WebBasic/books?job=insert
//		case "update":
//			update();
//			break; // post http://localhost:8080/WebBasic/books?job=update
//		case "delete":
//			delete();
//			break; // get http://localhost:8080/WebBasic/books?job=delete&bookId=123
//		}
//	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println(request.getRequestURI());
		System.out.println(request.getContextPath());
		String job = request.getRequestURI().substring(request.getContextPath().length());
		
		switch (job) {
		case "/books/list":
			list();
			break; // get http://localhost:8080/WebBasic/books/list
		case "/books/detail":
			detail();
			break; // get http://localhost:8080/WebBasic/books/detail?bookId=123
		case "/books/insert":
			insert();
			break; // post http://localhost:8080/WebBasic/books/insert
		case "/books/update":
			update();
			break; // post http://localhost:8080/WebBasic/books/update
		case "/books/delete":
			delete();
			break; // get http://localhost:8080/WebBasic/books/delete?bookId=123
		}
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	private void list() {
		System.out.println("list");
	}

	private void detail() {
		System.out.println("detail");
	}

	private void insert() {
		System.out.println("insert");
	}

	private void update() {
		System.out.println("update");
	}

	private void delete() {
		System.out.println("delete");
	}
}

콘솔 결과:

각각의 URL 예시:

  • GET /books?job=list → 목록 보기
  • GET /books?job=detail&bookId=3 → 상세 보기
  • POST /books?job=insert → 추가
  • POST /books?job=update → 수정
  • GET /books?job=delete&bookId=3 → 삭제

❻ Postman을 이용한 CRUD 테스트

Postman을 사용하여 job 파라미터를 다르게 설정하여 각 CRUD 작업을 테스트해봤습니다.

각각의 GET/POST 요청을 통해 실시간으로 콘솔 결과를 확인하고, Servlet 기반의 컨트롤러 설계를 익힐 수 있었습니다.