게으른 개발자의 끄적거림

Jsp 게시판 만들기(코드 포함)

끄적잉 2024. 3. 20. 22:13
반응형

Jsp 게시판 만들기(코드 포함)

 

JSP(Java Server Pages)를 사용하여 게시판을 만드는 방법에 대해 자세히 설명해 드리겠습니다. 게시판은 웹 애플리케이션에서 가장 기본적이면서도 많은 사람들이 사용하는 기능 중 하나입니다. 이 튜토리얼에서는 JSP, 서블릿, 그리고 데이터베이스를 사용하여 간단한 게시판을 만드는 과정을 안내하겠습니다.

1. **프로젝트 환경 설정:**
   - 먼저 자바 개발 환경(JDK)과 웹 서버(Apache Tomcat 등)가 설치되어 있어야 합니다.
   - 웹 애플리케이션 개발 도구(예: Eclipse, IntelliJ 등)를 설치하여 사용할 수 있습니다.

2. **프로젝트 생성 및 구조 설정:**
   - 새로운 Dynamic Web Project를 생성하고 필요한 폴더 및 파일 구조를 설정합니다.
   - WEB-INF 폴더 아래에 lib 폴더를 만들고 JDBC 드라이버 등 필요한 라이브러리를 추가합니다.

3. **데이터베이스 설계:**
   - MySQL 또는 PostgreSQL과 같은 데이터베이스를 설치하고 데이터베이스를 생성합니다.
   - 게시판에 필요한 테이블(예: 게시글, 댓글 등)을 설계하고 테이블을 생성합니다.

4. **JDBC 연결 설정:**
   - 데이터베이스와의 연결을 위해 JDBC(Java Database Connectivity)를 사용합니다.
   - 데이터베이스에 연결하고 CRUD(Create, Read, Update, Delete) 기능을 수행할 수 있는 자바 클래스를 작성합니다.

5. **모델(JavaBean) 생성:**
   - 게시글이나 댓글과 같은 데이터를 표현하는 모델 클래스를 생성합니다.
   - 이 클래스들은 자바빈(JavaBean) 규약을 따르며, 데이터를 캡슐화하고 게시판의 핵심 로직을 구현합니다.

6. **서블릿 작성:**
   - 사용자의 요청을 처리하기 위해 서블릿을 작성합니다.
   - HTTP 요청을 받아서 적절한 처리를 수행하고, 그 결과를 HTTP 응답으로 돌려줍니다.

7. **JSP 페이지 작성:**
   - 사용자 인터페이스를 구성하기 위해 JSP 페이지를 작성합니다.
   - HTML과 자바 코드를 혼합하여 동적으로 컨텐츠를 생성하고, 서블릿을 호출하여 데이터를 처리합니다.

8. **게시판 기능 구현:**
   - 게시판에 필요한 기능(글 목록 조회, 글 작성, 수정, 삭제, 댓글 작성 등)을 구현합니다.
   - 사용자가 요청한 기능에 대한 서블릿과 JSP를 연결하여 원활한 동작을 보장합니다.

9. **보안 및 예외 처리:**
   - 사용자의 입력값을 검증하고, 보안 취약점을 방지하기 위해 적절한 예외 처리 및 입력값 검증을 수행합니다.
   - XSS(Cross-Site Scripting)나 SQL Injection과 같은 보안 취약점을 방어하기 위해 노력합니다.

10. **디자인 및 스타일링:**
    - CSS를 사용하여 게시판의 디자인을 개선하고 사용자 경험을 향상시킵니다.
    - 부트스트랩과 같은 프론트엔드 프레임워크를 활용하여 더욱 멋진 UI를 구현할 수도 있습니다.

11. **테스트 및 디버깅:**
    - 개발한 게시판을 다양한 시나리오에 대해 테스트하고 버그를 찾아 수정합니다.
    - 로깅을 활용하여 애플리케이션의 동작을 모니터링하고, 문제가 발생할 경우 디버깅을 수행합니다.

12. **배포:**
    - 개발이 완료되면 웹 애플리케이션을 서버에 배포합니다.
    - WAR 파일을 생성하고 웹 서버에 배포하여 실제 사용자들이 액세스할 수 있도록 합니다.

이러한 단계를 거쳐서 JSP를 사용하여 게시판을 만들 수 있습니다. 중요한 점은 개발 과정에서 지속적인 테스트와 개선을 통해 사용자들의 요구사항을 충족하는 안정적이고 효율적인 게시판을 제공하는 것입니다.

 

예시 코드

1. **데이터베이스 연결 및 CRUD 기능 구현 (DAO 클래스)**

```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class PostDAO {
    private Connection conn;

    public PostDAO() {
        conn = ConnectionProvider.getConnection(); // 데이터베이스 연결
    }

    // 게시글 작성
    public void addPost(Post post) throws SQLException {
        String sql = "INSERT INTO posts (title, content) VALUES (?, ?)";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, post.getTitle());
            pstmt.setString(2, post.getContent());
            pstmt.executeUpdate();
        }
    }

    // 게시글 목록 조회
    public List<Post> getAllPosts() throws SQLException {
        List<Post> posts = new ArrayList<>();
        String sql = "SELECT * FROM posts";
        try (PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                Post post = new Post();
                post.setId(rs.getInt("id"));
                post.setTitle(rs.getString("title"));
                post.setContent(rs.getString("content"));
                posts.add(post);
            }
        }
        return posts;
    }

    // 게시글 상세 조회
    public Post getPostById(int postId) throws SQLException {
        String sql = "SELECT * FROM posts WHERE id = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, postId);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    Post post = new Post();
                    post.setId(rs.getInt("id"));
                    post.setTitle(rs.getString("title"));
                    post.setContent(rs.getString("content"));
                    return post;
                }
            }
        }
        return null;
    }

    // 게시글 삭제
    public void deletePost(int postId) throws SQLException {
        String sql = "DELETE FROM posts WHERE id = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, postId);
            pstmt.executeUpdate();
        }
    }
}
```

반응형


2. **모델 클래스 (JavaBean)**

```java
public class Post {
    private int id;
    private String title;
    private String content;

    // Getter와 Setter 메서드
    // ...
}
```

 


3. **서블릿 (게시글 목록 조회 및 게시글 작성)**

```java
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

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

@WebServlet("/posts")
public class PostListServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PostDAO postDAO = new PostDAO();
        try {
            List<Post> posts = postDAO.getAllPosts();
            request.setAttribute("posts", posts);
            request.getRequestDispatcher("/post_list.jsp").forward(request, response);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

```java
import java.io.IOException;
import java.sql.SQLException;

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

@WebServlet("/addPost")
public class AddPostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String title = request.getParameter("title");
        String content = request.getParameter("content");
        Post post = new Post();
        post.setTitle(title);
        post.setContent(content);
        PostDAO postDAO = new PostDAO();
        try {
            postDAO.addPost(post);
            response.sendRedirect(request.getContextPath() + "/posts");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

 


4. **JSP 페이지 (게시글 목록 표시 및 게시글 작성 폼)**

```jsp
<!-- post_list.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>게시판</title>
</head>
<body>
    <h1>게시글 목록</h1>
    <ul>
        <c:forEach var="post" items="${posts}">
            <li><a href="postDetail.jsp?id=${post.id}">${post.title}</a></li>
        </c:forEach>
    </ul>
    <h2>게시글 작성</h2>
    <form action="addPost" method="post">
        제목: <input type="text" name="title"><br>
        내용: <textarea name="content"></textarea><br>
        <input type="submit" value="작성">
    </form>
</body>
</html>
```

 

 

반응형