Skip to content

Conversation

@shinminkyoung1
Copy link

완료 작업 목록

웹 서버 7단계 - 기본 게시판 구현

  • H2 DB 설정: 프로젝트에 H2 의존성 추가 및 Article 테이블 생성
  • Article 모델 생성: 제목, 본문, 작성자, 작성시간을 담는 객체 설계
  • User / Article Dao 구현: 게시글 저장 및 전체 조회를 위한 JDBC 로직
  • 글쓰기 핸들러 (Post)/article/write 요청 시 DB에 게시글 저장
  • 메인 페이지 동적 렌더링index.html 로딩 시 DB에서 글 목록을 가져와 HTML에 삽입
  • 접근 권한 설정SecurityInterceptor에 글쓰기 경로 추가

주요 고민과 해결 과정

  • DAO(Data Access Object) 구현 방식

    1. 어디까지 DAO가 담당해야 하는가

    DAO는 쿼리를 실행하고 객체로 변환하는 일에만 집중하게 하고, 유저가 로그인 가능한 상태인지 등의 판단은 제외함 (단일 책임 원칙)

    /db/ArticleDao.java

    package db;
    
    import model.Article;
    
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ArticleDao {
    
        // 게시글 저장
        public void insert(Article article) {
            String sql = "INSERT INTO ARTICLE (writer, title, contents) VALUES (?, ?, ?)";
    
            try (Connection connection = ConnectionManager.getConnection();
            PreparedStatement pstmt = connection.prepareStatement(sql)) {
    
                pstmt.setString(1, article.writer());
                pstmt.setString(2, article.title());
                pstmt.setString(3, article.contents());
    
                pstmt.executeUpdate();
            } catch (SQLException e) {
                throw new RuntimeException("Failed to save article: " + e.getMessage());
            }
        }
    
        // 게시글 조회
        public List<Article> selectAll() {
            String sql = "SELECT * FROM ARTICLE ORDER BY createdAt DESC";
            List<Article> articles = new ArrayList<>();
    
            try (Connection connection = ConnectionManager.getConnection();
                 Statement stmt = connection.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {
    
                while (rs.next()) {
                    Article article = new Article(
                            rs.getLong("id"),
                            rs.getString("writer"),
                            rs.getString("title"),
                            rs.getString("contents"),
                            rs.getTimestamp("createdAt").toLocalDateTime()
                    );
                    articles.add(article);
                }
            } catch (SQLException e) {
                throw new RuntimeException("Failed to retrieve article list: {}", e);
            }
            return articles;
        }
    }
  1. connection을 어떻게 닫을 것인가

    finally 블록으로 일일이 .close() 하지 않고, try-with-resources 문법으로 해결함

AI에 도움 받은 부분

  • 커밋 메시지 작성
  • JS 관련 코드 수정 (Template Engine 수정 시, 치환자가 렌더링 되지 않는 문제를 해결하기 위해 조언 받음 → 메인 페이지를 정적 파일 등록에서 제외하는 방식으로 해결)

@github-actions
Copy link

main 브랜치로 병합 시도 || 적절한 라벨이 있는지 확인해 주세요.

1 similar comment
@github-actions
Copy link

main 브랜치로 병합 시도 || 적절한 라벨이 있는지 확인해 주세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant