MVC Model2

신정범·2026년 4월 14일

JSP

목록 보기
1/3


MVC Model 2는 JSP와 서블릿을 기반으로 하는 웹 애플리케이션 아키텍처 패턴으로, Model-View-Controller(MVC) 구조를 사용하여 서버 측에서 요청과 응답을 처리하는 방식입니다. MVC Model 2는 비즈니스 로직, 데이터, 프레젠테이션(화면) 로직을 명확히 분리하여, 유지보수와 확장성이 높은 구조를 제공합니다. 이 패턴은 Java 웹 애플리케이션에서 JSP와 서블릿의 역할을 명확히 나누고, 데이터 흐름을 구조화합니다.


MVC Model 2의 주요 구성 요소

  1. Model (모델):
    • 비즈니스 로직과 데이터베이스와의 상호작용을 담당합니다.
    • DAO(Data Access Object)와 DTO(Data Transfer Object)를 사용하여 데이터를 관리합니다.
    • 서블릿이 처리한 데이터는 모델을 통해 JSP에 전달됩니다.
  2. View (뷰):
    • 클라이언트에게 보여질 화면을 담당하는 부분으로, JSP가 주로 이 역할을 수행합니다.
    • 화면에 표시할 데이터를 모델로부터 받아와 사용자에게 전달합니다.
    • 비즈니스 로직은 포함하지 않고, 데이터 표시와 UI만을 담당합니다.
  3. Controller (컨트롤러):
    • 클라이언트의 요청을 받아서 어떤 작업을 수행할지 결정하고, 필요한 데이터를 준비한 뒤 적절한 뷰로 데이터를 전달합니다.
    • 서블릿이 컨트롤러 역할을 수행하며, 요청을 받고 모델과 뷰 간의 흐름을 제어합니다.
    • 컨트롤러는 사용자 요청을 해석하고, 비즈니스 로직을 처리하며, 최종적으로 데이터를 뷰에 전달하는 책임을 가집니다.

MVC Model 2의 흐름

  1. 클라이언트의 요청: 사용자가 웹 브라우저에서 특정 URL을 통해 요청을 보내면, 이 요청이 컨트롤러(서블릿)로 전달됩니다.
  2. 컨트롤러의 요청 처리: 컨트롤러는 요청을 해석하고, 필요한 경우 모델(비즈니스 로직 또는 데이터베이스 작업)을 통해 데이터를 처리합니다.
  3. 뷰 선택 및 데이터 전달: 컨트롤러는 요청 처리 후, 결과 데이터를 뷰(JSP)에 전달하고, 클라이언트에게 보여질 페이지를 결정합니다.
  4. 응답 생성 및 반환: JSP 뷰는 전달받은 데이터를 사용자에게 보여줄 HTML 페이지로 렌더링하여 클라이언트에게 반환합니다.

MVC Model 2 간단 예제

아래는 간단한 게시판 예제로, 게시글 리스트를 조회하는 흐름을 통해 MVC Model 2의 구조를 이해해 보겠습니다.

구성 파일

  1. BoardDTO.java - 게시글 데이터를 저장하는 데이터 전송 객체.
  2. BoardDAO.java - 데이터베이스와 연결하여 게시글을 조회하는 데이터 접근 객체.
  3. BoardListServlet.java - 클라이언트 요청을 처리하고 뷰로 데이터를 전달하는 컨트롤러.
  4. boardList.jsp - 클라이언트에게 게시글 목록을 보여주는 뷰.

1. BoardDTO.java (Model)

public class BoardDTO {
    private int id;
    private String title;
    private String content;

    // 기본 생성자 및 getter, setter
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }
}
  • BoardDTO는 게시글 데이터를 저장하는 객체로, 데이터베이스에서 조회한 데이터를 JSP로 전달할 때 사용됩니다.

2. BoardDAO.java (Model)

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BoardDAO {
    public List<BoardDTO> getAllPosts() throws Exception {
        List<BoardDTO> postList = new ArrayList<>();
        Connection conn = null;

        try {
            conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/boarddb", "root", "password");
            String sql = "SELECT * FROM board ORDER BY id DESC";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                BoardDTO post = new BoardDTO();
                post.setId(rs.getInt("id"));
                post.setTitle(rs.getString("title"));
                post.setContent(rs.getString("content"));
                postList.add(post);
            }
        } finally {
            if (conn != null) conn.close();
        }
        return postList;
    }
}
  • BoardDAO는 데이터베이스에서 모든 게시글을 조회하여 BoardDTO 리스트로 반환합니다.

3. BoardListServlet.java (Controller)

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

import java.io.IOException;
import java.util.List;

@WebServlet("/board/list")
public class BoardListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BoardDAO dao = new BoardDAO();
        try {
            List<BoardDTO> postList = dao.getAllPosts(); // 데이터 조회
            request.setAttribute("postList", postList); // 데이터 뷰로 전달
            request.getRequestDispatcher("/WEB-INF/views/boardList.jsp").forward(request, response);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}
  • BoardListServlet/board/list URL 요청을 처리하는 서블릿으로, 게시글 리스트를 가져와 boardList.jsp로 전달합니다.
  • request.setAttribute 메서드를 통해 게시글 데이터를 뷰에 전달하고, RequestDispatcher를 사용해 boardList.jsp로 포워딩합니다.

4. boardList.jsp (View)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>게시글 목록</title>
</head>
<body>
    <h2>게시글 목록</h2>
    <table border="1">
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>내용</th>
        </tr>
        <c:forEach var="post" items="${postList}">
            <tr>
                <td>${post.id}</td>
                <td>${post.title}</td>
                <td>${post.content}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
  • boardList.jsp는 서블릿에서 전달받은 postList 데이터를 출력하는 역할을 합니다.
  • 게시글의 각 항목은 <c:forEach> 태그를 사용해 테이블 형식으로 화면에 표시됩니다.

MVC Model 2의 장단점

장점

  1. 유지보수성 향상: 비즈니스 로직, 데이터, 프레젠테이션이 각각 Controller, Model, View로 나뉘어 있어 유지보수가 용이합니다.
  2. 재사용성 증가: Model, View, Controller의 역할이 분리되어 재사용성이 높습니다.
  3. 코드의 가독성 증가: 역할이 명확히 나누어져 있어 코드를 쉽게 이해할 수 있습니다.

단점

  1. 구현 복잡도 증가: 각 부분이 독립적으로 분리되므로 구조가 복잡해질 수 있습니다.
  2. 작은 프로젝트에는 비효율적: 구조가 분리되기 때문에, 간단한 웹 애플리케이션에서는 구현이 비효율적일 수 있습니다.

요약

  • MVC Model 2는 JSP와 서블릿을 기반으로 하는 구조로, 모델, 뷰, 컨트롤러를 분리하여 역할을 명확히 하고 유지보수성을 높입니다.
  • Controller(서블릿)는 클라이언트 요청을 처리하고, Model(DAO, DTO)은 데이터 처리를 담당하며, View(JSP)는 사용자에게 화면을 출력합니다.
  • 이 구조는 대규모 애플리케이션에서 관리와 확장이 용이하며, Java 웹 애플리케이션 개발에서 널리 사용되는 패턴입니다.
profile
성장하는 개발자가 되겠습니다

0개의 댓글