개인 프로젝트/Java Spring 프레임워크
[Board Project] 테이블 구조 -> ServiceImpl, DAO, VO
응_비
2024. 10. 17. 20:49
DAO 계층은 데이터베이스 접근만을 담당하고,
서비스 계층은 비즈니스 로직을 담당하며,
VO는 데이터를 담는 객체
테이블 구조
CREATE TABLE BOARD(
SEQ NUMBER(5) PRIMARY KEY,
TITLE VARCHAR2(200),
WRITER VARCHAR2(20),
CONTENT VARCHAR2(2000),
REGDATE DATE DEFAULT CURRENT_DATE,
CNT NUMBER(5) DEFAULT 0
);
- SEQ: 게시글의 고유 번호, NUMBER(5) 타입, Primary Key.
- TITLE: 게시글의 제목, VARCHAR2(200) 타입.
- WRITER: 게시글 작성자, VARCHAR2(20) 타입.
- CONTENT: 게시글의 내용, VARCHAR2(2000) 타입.
- REGDATE: 게시글 작성일자, DATE 타입, 기본값은 현재 날짜 (CURRENT_DATE).
- CNT: 조회수, NUMBER(5) 타입, 기본값은 0.
1. VO (Value Object) 클래스
BoardVO.java
import java.util.Date;
public class BoardVO {
private int seq;
private String title;
private String writer;
private String content;
private Date regdate;
private int cnt;
// 생성자
public BoardVO() {}
public BoardVO(int seq, String title, String writer, String content, Date regdate, int cnt) {
this.seq = seq;
this.title = title;
this.writer = writer;
this.content = content;
this.regdate = regdate;
this.cnt = cnt;
}
// Getter 및 Setter
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
}
2. DAO (Data Access Object)
BoardDAO.java
import java.util.List;
public interface BoardDAO {
// 게시글 등록
void insertBoard(BoardVO board);
// 게시글 수정
void updateBoard(BoardVO board);
// 게시글 삭제
void deleteBoard(int seq);
// 게시글 조회
BoardVO getBoard(int seq);
// 전체 게시글 목록 조회
List<BoardVO> getBoardList();
}
3. DAO 구현 클래스
BoardDAOImpl.java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BoardDAOImpl implements BoardDAO {
private Connection conn;
public BoardDAOImpl(Connection conn) {
this.conn = conn;
}
@Override
public void insertBoard(BoardVO board) {
String sql = "INSERT INTO BOARD (SEQ, TITLE, WRITER, CONTENT, REGDATE, CNT) VALUES (?, ?, ?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, board.getSeq());
pstmt.setString(2, board.getTitle());
pstmt.setString(3, board.getWriter());
pstmt.setString(4, board.getContent());
pstmt.setDate(5, new java.sql.Date(board.getRegdate().getTime()));
pstmt.setInt(6, board.getCnt());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void updateBoard(BoardVO board) {
String sql = "UPDATE BOARD SET TITLE = ?, CONTENT = ?, CNT = ? WHERE SEQ = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, board.getTitle());
pstmt.setString(2, board.getContent());
pstmt.setInt(3, board.getCnt());
pstmt.setInt(4, board.getSeq());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void deleteBoard(int seq) {
String sql = "DELETE FROM BOARD WHERE SEQ = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, seq);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public BoardVO getBoard(int seq) {
String sql = "SELECT * FROM BOARD WHERE SEQ = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, seq);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
BoardVO board = new BoardVO(
rs.getInt("SEQ"),
rs.getString("TITLE"),
rs.getString("WRITER"),
rs.getString("CONTENT"),
rs.getDate("REGDATE"),
rs.getInt("CNT")
);
return board;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<BoardVO> getBoardList() {
String sql = "SELECT * FROM BOARD";
List<BoardVO> list = new ArrayList<>();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
BoardVO board = new BoardVO(
rs.getInt("SEQ"),
rs.getString("TITLE"),
rs.getString("WRITER"),
rs.getString("CONTENT"),
rs.getDate("REGDATE"),
rs.getInt("CNT")
);
list.add(board);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
4. Service 인터페이스
BoardService.java
import java.util.List;
public interface BoardService {
// 게시글 등록
void addBoard(BoardVO board);
// 게시글 수정
void modifyBoard(BoardVO board);
// 게시글 삭제
void removeBoard(int seq);
// 게시글 조회
BoardVO getBoard(int seq);
// 전체 게시글 목록 조회
List<BoardVO> getBoardList();
}
5. ServiceImpl 클래스
BoardServiceImpl.java
import java.util.List;
public class BoardServiceImpl implements BoardService {
private BoardDAO boardDAO;
public BoardServiceImpl(BoardDAO boardDAO) {
this.boardDAO = boardDAO;
}
@Override
public void addBoard(BoardVO board) {
boardDAO.insertBoard(board);
}
@Override
public void modifyBoard(BoardVO board) {
boardDAO.updateBoard(board);
}
@Override
public void removeBoard(int seq) {
boardDAO.deleteBoard(seq);
}
@Override
public BoardVO getBoard(int seq) {
return boardDAO.getBoard(seq);
}
@Override
public List<BoardVO> getBoardList() {
return boardDAO.getBoardList();
}
}
전체 설명
테이블 구조
- BOARD 테이블은 게시판에서 게시글 정보를 저장하는 테이블입니다. 이 테이블에는 SEQ, TITLE, WRITER, CONTENT, REGDATE, CNT 필드가 포함되어 있으며, 이들은 각각 게시글의 고유 번호, 제목, 작성자, 내용, 작성일자, 조회수를 나타냅니다.
VO (Value Object)
- BoardVO 클래스는 데이터베이스 테이블의 데이터를 객체로 매핑합니다. 데이터를 캡슐화하고 안전하게 접근할 수 있도록 Getter와 Setter를 제공합니다.
DAO (Data Access Object)
- BoardDAO 인터페이스는 데이터베이스 작업을 추상화합니다. 데이터베이스와의 직접적인 상호작용을 DAO에서 처리함으로써 데이터 접근 로직을 분리하고, 유지보수가 쉬워집니다.
DAO 구현체
- BoardDAOImpl 클래스는 SQL 쿼리를 작성하여 실제 데이터베이스와 상호작용하는 구현체입니다. JDBC를 통해 데이터베이스 연결과 쿼리 실행을 처리하며, 데이터 조회, 삽입, 수정, 삭제를 담당합니다.
Service
- BoardService 인터페이스는 비즈니스 로직을 처리하는 계층입니다. DAO를 호출하여 데이터베이스 작업을 수행하며, 필요에 따라 추가적인 데이터 가공 로직을 포함할 수 있습니다.
ServiceImpl
- BoardServiceImpl 클래스는 BoardService 인터페이스를 구현한 클래스입니다. 이 클래스는 DAO를 사용하여 실제 비즈니스 로직을 수행하며, 게시글을 삽입하거나 조회하는 작업을 처리합니다.
이 구조는 객체지향 원칙을 따르며, 각 계층의 역할을 명확히 분리함으로써 유지보수성과 확장성을 높일 수 있습니다.
종합적인 설명
- 흐름
- 사용자가 게시글을 작성하거나 수정하려고 할 때, BoardServiceImpl 클래스에서 해당 로직을 처리합니다.
- BoardServiceImpl은 내부적으로 BoardDAO의 구현체를 사용하여 데이터베이스에 접근합니다.
- BoardDAO는 SQL 쿼리를 통해 실제 데이터베이스에 명령을 수행하고, 그 결과를 VO 객체로 반환합니다.
- 결과적으로, DAO 계층은 데이터베이스 접근만을 담당하고, 서비스 계층은 비즈니스 로직을 담당하며, VO는 데이터를 담는 객체로서의 역할을 수행합니다.
이 구조는 데이터베이스 작업을 객체 지향적으로 추상화하여 유지 보수가 용이하고 테스트하기 쉬운 시스템을 만드는데 중요한 역할을 합니다. DAO를 분리함으로써 데이터베이스 변경이 발생해도 비즈니스 로직에는 영향을 미치지 않으며, 서비스 계층을 통해 비즈니스 로직을 독립적으로 처리할 수 있습니다.