
MVC Model 2는 JSP와 서블릿을 기반으로 하는 웹 애플리케이션 아키텍처 패턴으로, Model-View-Controller(MVC) 구조를 사용하여 서버 측에서 요청과 응답을 처리하는 방식입니다. MVC Model 2는 비즈니스 로직, 데이터, 프레젠테이션(화면) 로직을 명확히 분리하여, 유지보수와 확장성이 높은 구조를 제공합니다. 이 패턴은 Java 웹 애플리케이션에서 JSP와 서블릿의 역할을 명확히 나누고, 데이터 흐름을 구조화합니다.
아래는 간단한 게시판 예제로, 게시글 리스트를 조회하는 흐름을 통해 MVC Model 2의 구조를 이해해 보겠습니다.
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로 전달할 때 사용됩니다.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 리스트로 반환합니다.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로 포워딩합니다.<%@ 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> 태그를 사용해 테이블 형식으로 화면에 표시됩니다.Controller(서블릿)는 클라이언트 요청을 처리하고, Model(DAO, DTO)은 데이터 처리를 담당하며, View(JSP)는 사용자에게 화면을 출력합니다.