DAO (Data Access Object)
데이터베이스(DB)에 접근하기 위한 객체로, 쿼리를 사용하여 데이터를 조회하거나 조작하는 작업을 수행한다.
하나의 게시판에서 목록읽을 때, 글 상세보기할 때 등.. 작업마다 Connection이 필요하다.
전체 단위에서는 엄청나게 많은 커넥션이 일어나기 때문에 ConnectionPool를 효율적으로 하기 위해
DB에 접속하는 전용객체를 만들고 DB와의 연결을 하도록 하는 것이 DAO 객체이다.
Connection객체로 DB에 접속하고 Statement객체로 쿼리를 준비하여 ResultSet 혹은 정수형 변수에 리턴을 담는다.
게시판프로젝트 - DAO
- 게시판 글 목록을 읽어오는 selectList
- 게시글 1개를 읽는 selectOne
- 게시글 업로드하는 insert
- 게시글을 수정하는 update
- 게시글을 삭제하는 delete
위의 5개의 경우에 관한 데이터베이스로의 접근이 필요하여, MyboardDao 클래스에서는 5개의 메소드를 생성했다.
package com.dao;
import common.JDBCTemplate;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.dto.MyboardDto;
public class MyboardDao {
JDBCTemplate jdbc = new JDBCTemplate();
public List<MyboardDto> selectList() {
Connection con = jdbc.getConnection();
PreparedStatement pstm = null;
ResultSet rs = null;
List<MyboardDto> temp = new ArrayList<MyboardDto>();
String sql = " SELECT * FROM MYBOARD ORDER BY MYNO ";
try {
pstm = con.prepareStatement(sql);
System.out.println("03. query 준비");
rs = pstm.executeQuery();
System.out.println("04. query 실행 및 리턴");
while (rs.next()) {
MyboardDto dto = new MyboardDto();
dto.setMyno(rs.getInt(1));
dto.setMyname(rs.getString(2));
dto.setMytitle(rs.getString(3));
dto.setMycontent(rs.getString(4));
dto.setMydate(rs.getDate(5));
temp.add(dto);
}
} catch (SQLException e) {
System.out.println("03/04 query 준비 및 실행리턴 실패.. ");
e.printStackTrace();
} finally {
try {
rs.close();
pstm.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return temp;
}
public MyboardDto selectOne(int myno) {
Connection con = jdbc.getConnection();
PreparedStatement pstm = null;
ResultSet rs = null;
String sql = " SELECT * FROM MYBOARD WHERE MYNO = " + myno + " ";
MyboardDto temp = new MyboardDto();
try {
pstm = con.prepareStatement(sql);
System.out.println("03. query 준비 ");
rs = pstm.executeQuery();
System.out.println("04. query 실행 및 리턴 ");
while (rs.next()) {
temp.setMyno(rs.getInt(1));
temp.setMyname(rs.getString(2));
temp.setMytitle(rs.getString(3));
temp.setMycontent(rs.getString(4));
temp.setMydate(rs.getDate(5));
}
} catch (SQLException e) {
System.out.println("03/04. query 준비 및 실행리턴 실패 ");
e.printStackTrace();
} finally {
try {
rs.close();
pstm.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return temp;
}
public int insert(MyboardDto dto) {
Connection con = jdbc.getConnection();
PreparedStatement pstm = null;
int rs = 0;
String sql = " INSERT INTO MYBOARD VALUES(MYSEQ.NEXTVAL, ?, ?, ?, SYSDATE) ";
try {
pstm = con.prepareStatement(sql);
pstm.setString(1, dto.getMyname());
pstm.setString(2, dto.getMytitle());
pstm.setString(3, dto.getMycontent());
rs = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public int update(MyboardDto dto) {
Connection con = jdbc.getConnection();
PreparedStatement pstm = null;
int rs = 0;
String sql = " UPDATE MYBOARD SET MYTITLE = ?, MYCONTENT=?, MYDATE= SYSDATE WHERE MYNO = ? ";
try {
pstm = con.prepareStatement(sql);
pstm.setString(1, dto.getMytitle());
pstm.setString(2, dto.getMycontent());
pstm.setInt(3, dto.getMyno());
rs = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public int delete(int myno) {
Connection con = jdbc.getConnection();
PreparedStatement pstm = null;
int rs = 0;
String sql = " DELETE FROM MYBOARD WHERE MYNO = " + myno + " ";
try {
pstm = con.prepareStatement(sql);
rs = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}// class end
DTO (Data Transfer Object)
데이터를 오브젝트로 변환하는 객체, 계층간의 데이터 교환을 위해 사용한다.
DTO는 로직을 갖지 않는 데이터 객체로, 속성을 읽고 쓰는 Getter와 Setter를 사용할 수 있다. (이 부분이 VO(Value Object) 값 객체와의 차이점이다. Value Object (VO)는 값을 읽어오기만 할 수 있다.)
게시판프로젝트 - DTO 설계
게시판의 글번호(MYNO), 작성자(MY AME), 글제목(MYTITLE), 글내용(MYCONTENT), 작성일(MYDATE)를
속성으로 하는 데이터베이스의 DTO는 아래와 같이 생성자와 getter/setter로 구현했다.
package com.dto;
import java.sql.Date;
public class MyboardDto {
private int myno;
private String myname;
private String mytitle;
private String mycontent;
private Date mydate;
public MyboardDto() {
}
public MyboardDto(int myno, String myname, String mytitle, String mycontent, Date mydate) {
super();
this.myno = myno;
this.myname = myname;
this.mytitle = mytitle;
this.mycontent = mycontent;
this.mydate = mydate;
}
public int getMyno() {
return myno;
}
public void setMyno(int myno) {
this.myno = myno;
}
public String getMyname() {
return myname;
}
public void setMyname(String myname) {
this.myname = myname;
}
public String getMytitle() {
return mytitle;
}
public void setMytitle(String mytitle) {
this.mytitle = mytitle;
}
public String getMycontent() {
return mycontent;
}
public void setMycontent(String mycontent) {
this.mycontent = mycontent;
}
public Date getMydate() {
return mydate;
}
public void setMydate(Date mydate) {
this.mydate = mydate;
}
}
'Java' 카테고리의 다른 글
[Java8] Stream(스트림) - map/filter/sort/distinct (0) | 2021.11.24 |
---|---|
[Java] Servlet(서블릿)과 JSP 기초 (0) | 2019.05.16 |
[Java] MVC패턴 이해하기 (0) | 2019.04.20 |
[Java]자바 주사위 게임 (2인플레이) (0) | 2019.03.05 |
[Java] 베르나르 베르베르의 "개미수열" 만들기 (0) | 2019.03.02 |