Spring/실습 정리

Spring 5강 - BoardDAO 클래스와 CRUD 기능 구현

코딩하는냥이 2025. 6. 18. 12:19
반응형

이번 글에서는 실제 데이터베이스와 연동하여 게시글 정보를 등록, 수정, 삭제, 조회, 목록 출력하는 DAO(Data Access Object) 클래스를 작성해봅니다. DAO는 DB와 직접 연결되는 계층으로, 비즈니스 로직에서 데이터를 처리할 때 핵심 역할을 합니다.


📦 BoardDAO.java

package com.springbook.biz.board;

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

public class BoardDAO {
	private Connection conn;
	private PreparedStatement stmt;
	private ResultSet rs;

	private final String BOARD_INSERT = 
		"INSERT INTO board (seq, title, writer, content) " +
		"VALUES ((SELECT NVL(MAX(seq), 0) + 1 FROM board), ?, ?, ?)";

	private final String BOARD_UPDATE = 
		"UPDATE board SET title = ?, content = ? WHERE seq = ?";

	private final String BOARD_DELETE = 
		"DELETE FROM board WHERE seq = ?";

	private final String BOARD_GET = 
		"SELECT * FROM board WHERE seq = ?";

	private final String BOARD_LIST = 
		"SELECT * FROM board ORDER BY seq DESC";

	public void insertBoard(BoardVO vo) {
		System.out.println("insertBoard 시작");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public void updateBoard(BoardVO vo) {
		System.out.println("updateBoard 시작");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_UPDATE);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getContent()); // 수정됨
			stmt.setInt(3, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public void deleteBoard(BoardVO vo) {
		System.out.println("deleteBoard 시작");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_DELETE);
			stmt.setInt(1, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public BoardVO getBoard(BoardVO vo) {
		System.out.println("getBoard 시작");
		BoardVO board = null;
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_GET);
			stmt.setInt(1, vo.getSeq());
			rs = stmt.executeQuery();
			if (rs.next()) {
				board = new BoardVO();
				board.setSeq(rs.getInt("seq"));
				board.setTitle(rs.getString("title"));
				board.setWriter(rs.getString("writer"));
				board.setContent(rs.getString("content"));
				board.setRegDate(rs.getDate("regdate"));
				board.setCnt(rs.getInt("cnt"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return board;
	}

	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("getBoardList 시작");
		List<BoardVO> boardList = new ArrayList<>();
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_LIST);
			rs = stmt.executeQuery();
			while (rs.next()) {
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("seq"));
				board.setTitle(rs.getString("title"));
				board.setWriter(rs.getString("writer"));
				board.setContent(rs.getString("content"));
				board.setRegDate(rs.getDate("regdate"));
				board.setCnt(rs.getInt("cnt"));
				boardList.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return boardList;
	}
}

💬 코드 설명

  • insertBoard() : 새로운 게시글 등록 (글 번호는 자동 증가).
  • updateBoard() : 글 번호를 기준으로 제목과 내용을 수정.
  • deleteBoard() : 해당 글 번호를 가진 게시글 삭제.
  • getBoard() : 하나의 게시글 상세 조회.
  • getBoardList() : 전체 게시글 목록을 역순으로 조회.

💡 포인트 정리

  • DAO는 DB와 연결된 로직만 담당하며, 비즈니스 로직은 Service 계층에서 처리.
  • SQL은 상수로 정의해 가독성과 유지보수성을 높임.
  • JDBCUtil을 활용해 자원 해제를 일관되게 처리.
  • getBoardList()는 여러 개의 BoardVO를 리스트로 반환.

📌정리하자면, 이번 강의에서는 실제 데이터베이스와 연동되는 DAO 클래스를 직접 작성해 보았습니다. 게시글 등록, 수정, 삭제, 조회, 목록 출력까지의 CRUD 기능을 모두 구현했고, 다음 단계에서는 이 DAO를 서비스 계층에서 사용하여 MVC 구조로 연결해나갈 수 있게 됩니다.