JSP를 이용한 간단한 **방명록**(Guestbook) 예제를 제공해드리겠습니다.
이 방명록은 **JSP + MySQL + JDBC**를 이용하여 사용자가 글을 남기고, 남긴 글을 조회하는 기능을 제공합니다.
---
## **1. MySQL 데이터베이스 설정**
먼저, 방명록 데이터를 저장할 **데이터베이스 및 테이블을 생성**합니다.
```sql
CREATE DATABASE guestbook;
USE guestbook;
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
## **2. DB 연결 설정 (`db.jsp`)**
JSP에서 MySQL에 연결하기 위한 **공통 설정 파일**을 만듭니다.
📌 **`db.jsp`**
```jsp
<%@ page import="java.sql.*" %>
<%!
// DB 연결 정보
private static final String DB_URL = "jdbc:mysql://localhost:3306/guestbook";
private static final String DB_USER = "root"; // 본인 MySQL 사용자 이름
private static final String DB_PASSWORD = ""; // 본인 MySQL 비밀번호
%>
<%
Connection conn = null;
try {
Class.forName("cohttp://m.mysql.cj.jdbc.Driver"); // MySQL 드라이버 로드
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
} catch (Exception e) {
e.printStackTrace();
out.println("DB 연결 실패: " + e.getMessage());
}
%>
```
- **JDBC 드라이버를 로드하고 MySQL에 연결**합니다.
- **모든 JSP 페이지에서 `include`하여 재사용**할 수 있습니다.
---
## **3. 방명록 글 작성 폼 (`form.jsp`)**
사용자가 **이름과 메시지를 입력**할 수 있는 폼입니다.
📌 **`form.jsp`**
```jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>방명록</title>
</head>
<body>
<h2>방명록에 글 남기기</h2>
<form action="submit.jsp" method="POST">
<label for="name">이름:</label><br>
<input type="text" id="name" name="name" required><br><br>
<label for="message">메시지:</label><br>
<textarea id="message" name="message" required></textarea><br><br>
<input type="submit" value="제출">
</form>
<hr>
<h2>방명록 글 목록</h2>
<jsp:include page="list.jsp" />
</body>
</html>
```
- 사용자 입력을 받아 `submit.jsp`로 전송합니다.
- `list.jsp`를 `include`하여 방명록 글 목록을 출력합니다.
---
## **4. 글 저장 처리 (`submit.jsp`)**
사용자가 입력한 데이터를 **DB에 저장하는 로직**입니다.
📌 **`submit.jsp`**
```jsp
<%@ page import="java.sql.*" %>
<%@ include file="db.jsp" %>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String message = request.getParameter("message");
if (name != null && message != null) {
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO messages (name, message) VALUES (?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, message);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
out.println("데이터 저장 실패: " + e.getMessage());
} finally {
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
}
// 방명록 폼 페이지로 리디렉션
response.sendRedirect("form.jsp");
%>
```
- `PreparedStatement`를 사용하여 **SQL 인젝션 방지**.
- 입력값을 `UTF-8`로 설정하여 한글 깨짐 방지.
- 데이터 저장 후 `form.jsp`로 **리디렉션**.
---
## **5. 글 목록 출력 (`list.jsp`)**
저장된 **방명록 글을 불러와 출력**합니다.
📌 **`list.jsp`**
```jsp
<%@ page import="java.sql.*" %>
<%@ include file="db.jsp" %>
<%
Statement stmt = null;
ResultSet rs = null;
try {
String sql = "SELECT * FROM messages ORDER BY created_at DESC";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (!rs.isBeforeFirst()) {
out.println("아직 방명록에 글이 없습니다.");
} else {
while (rs.next()) {
out.println("<p><strong>" + rs.getString("name") + "</strong> (" + rs.getTimestamp("created_at") + ")<br>");
out.println(rs.getString("message") + "</p><hr>");
}
}
} catch (SQLException e) {
e.printStackTrace();
out.println("데이터 가져오기 실패: " + e.getMessage());
} finally {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}
%>
```
- **DB에서 메시지 목록을 가져와 출력**.
- **최신 글이 위쪽에 표시되도록 정렬**.
- **데이터가 없을 경우 메시지 출력**.
---
## **6. 프로젝트 폴더 구조**
```
/guestbook
│── db.jsp // DB 연결 설정
│── form.jsp // 글 작성 폼
│── submit.jsp // 글 저장 처리
│── list.jsp // 글 목록 출력
└── web.xml // (필요 시 추가)
```
---
## **7. 실행 방법**
1. **MySQL에서 데이터베이스 및 테이블 생성**
2. **톰캣(Tomcat) 실행**
3. **웹 브라우저에서 `http://localhost:8080/guestbook/form.jsp` 접속**
---
## **8. 보안 개선 필요 사항**
- **SQL 인젝션 방지** → `PreparedStatement` 사용 (이미 적용됨)
- **XSS 방지** → `htmlspecialchars()`와 같은 필터링 적용
- **입력값 검증 강화** → 너무 긴 메시지 제한 등 추가 로직 필요
---
## **9. 결론**
이 JSP 기반 **방명록(Guestbook)**은 **사용자 입력을 받아 MySQL에 저장하고, 저장된 데이터를 불러와 출력하는 기본적인 웹 애플리케이션**입니다.
추가로 댓글 기능, 페이징 기능, 삭제/수정 기능 등을 추가하여 더욱 완성도 높은 애플리케이션으로 확장할 수 있습니다. 🚀