본문 바로가기
데이터융합 JAVA 응용 SW개발자 취업과정/JSP

JSP - DAO & DTO

by 호강하는 지해 2023. 10. 5.
728x90

-- DB연동 예제

select * from tab;

select * from member1;

select * from member2;

 

-- DTO와 oracle 연동

create table member1(

   id varchar2(20) primary key,

   passwd varchar2(20) not null,

   name varchar2(20) not null,

   reg_date timestamp not null );

 

-- DAO와 oracle 연동

create table member2(

   id varchar2(12) primary key,

   passwd varchar2(12) not null,

   name varchar2(10) not null,

   jumin1 varchar2(6) not null,

   jumin2 varchar2(7) not null,

   email varchar2(30),

blog varchar2(50),

reg_date date not null);

myoracle.sql

 

더 안전하게 데이터를 관리하기 위해 테이블 생성! (생성이 잘 되었는지 확인하려면 sql developer에서 확인해보기)

 

 

 

// DTO(Data Transfer Object)

 

package register;

 

import java.util.Date;

 

public class LogonDataBean {

 

private String id; // 프로퍼티(property)

private String passwd;

private String name;

private String jumin1;

private String jumin2;

private String email;

private String blog;

private Date reg_date;

 

 

public String getId() {

return id;

}

public String getPasswd() {

return passwd;

}

public String getName() {

return name;

}

public String getJumin1() {

return jumin1;

}

public String getJumin2() {

return jumin2;

}

public String getEmail() {

return email;

}

public String getBlog() {

return blog;

}

public Date getReg_date() {

return reg_date;

}

public void setId(String id) {

this.id = id;

}

public void setPasswd(String passwd) {

this.passwd = passwd;

}

public void setName(String name) {

this.name = name;

}

public void setJumin1(String jumin1) {

this.jumin1 = jumin1;

}

public void setJumin2(String jumin2) {

this.jumin2 = jumin2;

}

public void setEmail(String email) {

this.email = email;

}

public void setBlog(String blog) {

this.blog = blog;

}

public void setReg_date(Date reg_date) {

this.reg_date = reg_date;

}

 

 

}

 

LogonDataBean.java

 

 

DTO class

 

 

 

// DAO(Data Access Object)

 

package register;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import java.util.List;

 

import com.mysql.cj.xdevapi.PreparableStatement;

 

public class LogonDBBean {

 

// 싱글톤 : 객체 생성을 한 번만 수행하는 것

 

private LogonDBBean() { // 원래는 생성자도 써야함

 

}

private static LogonDBBean instance = new LogonDBBean();

 

public static LogonDBBean getInstance() { // 정적 메소드

return instance;

}

 

// 회원가입 : 주소값 전달에 의한 메소드 호출방식(Call by Reference 방식)

public int insertMember(LogonDataBean member) {

int result = 0; // 쿼리문이 성공했는지 실패했는지 나타내주는 변수

 

Connection con = null;

PreparedStatement pstmt = null;

 

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

 

try {

// JDBC 방식

Class.forName(driver);

con = DriverManager.getConnection(url, "scott", "tiger");

 

String sql = "insert into member2 values(?,?,?,?,?,?,?,sysdate)";

 

pstmt = con.prepareStatement(sql);

pstmt.setString(1, member.getId()); // getProperty 대신에 이 방식을 씀(더 많이 쓰임)

pstmt.setString(2, member.getPasswd());

pstmt.setString(3, member.getName());

pstmt.setString(4, member.getJumin1());

pstmt.setString(5, member.getJumin2());

pstmt.setString(6, member.getEmail());

pstmt.setString(7, member.getBlog());

 

result = pstmt.executeUpdate(); // insert SQL문 실행

 

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(pstmt != null) pstmt.close();

if(con != null) con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

return result;

}

 

// 전체 회원목록 구하기(두 명 이상일 때는 list사용?)

// 한 명을 구하든 여러명을 구하든 DTO, DAO 다 쓰는 게 좋다 언제 추가될지 모르니

public List<LogonDataBean> selectMember(){

List<LogonDataBean> list = new ArrayList<LogonDataBean>();

 

Connection con = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

 

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

 

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "scott", "tiger");

 

String sql = "select * from member2";

 

pstmt = con.prepareStatement(sql);

rs = pstmt.executeQuery(); // select SQL문 실행

 

// 데이터를 1개씩 가져온다.(true값이 리턴돼서 while 실행 - boolean형으로 돼있음)

while(rs.next()) { // select로 구해온 값을 하나씩!)

LogonDataBean member = new LogonDataBean();

// member.id = "test"; // 접근안됨(private 접근 제어자)

 

member.setId(rs.getString("id"));

member.setPasswd(rs.getString("passwd"));

member.setName(rs.getString("name"));

member.setJumin1(rs.getString("jumin1"));

member.setJumin2(rs.getString("jumin2"));

member.setEmail(rs.getString("email"));

member.setBlog(rs.getString("blog"));

member.setReg_date(rs.getDate("reg_date"));

 

list.add(member);

}

 

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(rs != null) rs.close();

if(pstmt != null) pstmt.close();

if(con != null) con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

 

return list;

}

 

// 회원 수정폼 : 회원 1명 정보 구하기

public LogonDataBean updateForm(String id) {

LogonDataBean member = new LogonDataBean(); // DTO 객체 생성

 

Connection con = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

 

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

 

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "scott", "tiger");

 

String sql="select * from member2 where id=?";

 

pstmt = con.prepareStatement(sql);

pstmt.setString(1, id);

rs = pstmt.executeQuery(); // select SQL문 실행

 

if(rs.next()) {

member.setId(rs.getString("id"));

member.setPasswd(rs.getString("passwd"));

member.setName(rs.getString("name"));

member.setJumin1(rs.getString("jumin1"));

member.setJumin2(rs.getString("jumin2"));

member.setEmail(rs.getString("email"));

member.setBlog(rs.getString("blog"));

member.setReg_date(rs.getDate("reg_date"));

}

 

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(rs != null) rs.close();

if(pstmt != null) pstmt.close();

if(con != null) con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

 

return member;

}

 

// 회원정보 수정

public int update(LogonDataBean member) {

int result = 0;

 

Connection con = null;

PreparedStatement pstmt = null;

 

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

 

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "scott", "tiger");

 

String sql="update member2 set name=?,jumin1=?,jumin2=?,";

sql += "email=?,blog=?,reg_date=sysdate where id=?";

 

pstmt = con.prepareStatement(sql);

pstmt.setString(1, member.getName());

pstmt.setString(2, member.getJumin1());

pstmt.setString(3, member.getJumin2());

pstmt.setString(4, member.getEmail());

pstmt.setString(5, member.getBlog());

pstmt.setString(6, member.getId());

 

result = pstmt.executeUpdate(); // update SQL문 실행

 

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(pstmt != null) pstmt.close();

if(con != null) con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

return result;

}

 

// 회원정보 삭제

public int delete(LogonDataBean member) {

int result = 0;

 

Connection con = null;

PreparedStatement pstmt = null;

 

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

 

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "scott", "tiger");

 

String sql="delete from member2 where id=?";

 

pstmt = con.prepareStatement(sql);

pstmt.setString(1, member.getId());

result = pstmt.executeUpdate(); // delete SQL문 실행

 

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(pstmt != null) pstmt.close();

if(con != null) con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

return result;

}

 

 

 

 

 

 

}

LogonDBBena.java

 

 

DAO class

 

싱글톤을 쓰는 경우는 이런 경우밖에 없음

DAO클래스를 만들 때마다 싱글톤을 만들어야 한다.

메소드의 매개변수를 통해 값과 주소값을 전달해야 한다. (Call by Reference 방식)

 

 

이 그림을 잘 이해하면 DTO와 DAO 형식을 이해하기 쉽다.

---이해해보기---

 

 

 

 

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="register.LogonDataBean" %>

<%@ page import="register.LogonDBBean" %>

<%@ include file="color.jsp" %>

 

<%

request.setCharacterEncoding("utf-8");

 

LogonDataBean regBean1 = new LogonDataBean();

//regBean1.id="test";

%>

 

<jsp:useBean id="regBean" class="register.LogonDataBean" />

<jsp:setProperty name="regBean" property="*" />

 

<%

// regBean.id="test";

%>

 

<%

LogonDBBean manager = LogonDBBean.getInstance();

int result=manager.insertMember(regBean);

 

if(result==1){

%>

<script>

   alert("회원가입 성공");

   location.href="list.jsp";

</script>

 

<% }else{%>

 

<script>

   alert("회원가입 실패");

   history.go(-1);

</script>

 

<% } %>

 

registerPro.jsp

 

 

LogonDataBean regBean1 = new LogonDataBean();

객체 생성이 됨 그렇지만 (heap메모리 상에 새로운 공간을 만듦)

useBean 액션태그랑 같은 역할(<jsp:useBean id="regBean" class="register.LogonDataBean" />)

 

 

regBean1.id="test";

private으로 설정되어 있어서 이렇게는 쓸 수 없고 getter setter로 가져와서 jsp:setProperty로 써야함 

 

 

LogonDBBean manager = LogonDBBean.getInstance();

int result=manager.insertMember(regBean);

<이부분 너무너무 중요함>

DAO 클래스(LogonDBBean)는 하나의 객체를 공유하기 위해 싱글톤으로 작성되었다.

그래서 DAO 변수명 = new DAO(); 로 객체를 생성하지 않고, DAO 클래스 내에 있는 getInstance() 메소드를 사용하여 객체를 가져온다.

DAO 클래스(LogonDBBean)에 원래 있던 객체를 반환해주는 getInstance()메소드를 사용하여 객체를 manager라는 변수에 저장한다.

그러므로 manager.을 사용하여 DAO 클래스 안에 있는 insertMember라는 메소드를 쓴 것이다. (참조변수.메소드)

DAO 클래스 내에서 insertMember 메소드는 LogonDataBean 타입의 매개변수로 받도록 설정되어 있다. (regBean은 LogonDataBean 타입!)

 

 

DTO : 속성값들 모여있음
DAO : DB에 접근할 수 있는 메소드들 모여있음
우리는 데이터를 저장해줘야되는데 저장하려면  DB에 접근할 수 있게 해주는 메소드들이 있는 DAO 객체를 만들어야한다.
왜냐? DAO객체를 만들어야 DAO안에 있는 데이터를 저장해줄수있는 메소드들을 쓸 수 있으니까

 

select만 반환값이 다르다. select는 조회를 목적으로 함으로 결과값을 ResultSet으로 반환받는다.

다른 delete나 insert, update는 반환값을 int형이나 void(반환값을 안 받아도 되는)로 받을 수도 있다.

 

 

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

<%@ page import="register.LogonDBBean" %>

<%@ page import="register.LogonDataBean" %>

<%@ page import="java.util.*" %>

 

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>회원 목록</title>

</head>

<body>

<a href="registerForm.jsp">회원가입</a>

 

 

<table align=center width=1000 border=1>

<tr><td>ID</td>

<td>비밀번호</td>

<td> 이름 </td>

<td> 주민번호 </td>

<td> 이메일 </td>

<td> BLOG </td>

<td> 가입일 </td>

<td>수정</td>

<td>삭제</td>

</tr>

 

<%

LogonDBBean manager = LogonDBBean.getInstance(); // DAO 객체를 manager라는 이름으로 불러옴

List<LogonDataBean> li = manager.selectMember();

 

 

for(int i = 0; i < li.size(); i++) {

// Object get(int index)

LogonDataBean db = (LogonDataBean)li.get(i); // 애초에 li안에 들어있는 객체의 타입이 LogonDataBean만 있는데 왜 ()해줌?

%>

 

<tr><td><%=db.getId()%></td>

<td><%=db.getPasswd()%></td>

<td><%=db.getName()%></td>

<td><%=db.getJumin1()%> - <%=db.getJumin2()%> </td>

<td><%=db.getEmail()%></td>

<td><%=db.getBlog()%></td>

<td><%=db.getReg_date()%></td>

<td><a href="updateForm.jsp?id=<%=db.getId()%>">수정</a></td>

<td><a href="deleteForm.jsp?id=<%=db.getId()%>">삭제</a></td>

</tr>

<%

}

%>

 

</table>

</body>

</html>

list.jsp

 

 

 

<%

LogonDBBean manager = LogonDBBean.getInstance(); // DAO 객체를 manager라는 이름으로 불러옴

List<LogonDataBean> li = manager.selectMember();

 

 

for(int i = 0; i < li.size(); i++) {

// Object get(int index)

LogonDataBean db = (LogonDataBean)li.get(i); // 애초에 li안에 들어있는 객체의 타입이 LogonDataBean만 있는데 왜 ()해줌?

%>

여기에서 애초에 li안에 들어있는 객체의 타입이 LogonDataBean만 있는데 왜 () 해주는 건지?

- list는 Object형으로 반환을 하기 때문에 LogonDataBean으로 형변환을 해줘야 합니다.

 

 

 

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="register.LogonDBBean" %>

<%@ page import="register.LogonDataBean" %>

<%@ include file="color.jsp" %>

 

<%

String id = request.getParameter("id");

 

LogonDBBean manager = LogonDBBean.getInstance();

LogonDataBean db = manager.updateForm(id);

%>

 

<html>

<head>

<title>회원수정</title>

<link rel="stylesheet" type="text/css" href="style.css">

<script src="script.js"></script>

</head>

 

<body bgcolor="<%=bodyback_c%>">

<form name="regForm" method="post" action="updatePro.jsp" onsubmit="return inputCheck()">

<input type=hidden name=id value="<%=db.getId() %>">

<table width="500" border="0" cellspacing="0" cellpadding="2" align="center">

<tr height="39" align="center" bgcolor="<%=title_c%>">

<td colspan="3"><b>회원 수정</b></font></td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">아이디</td>

<td width="200" bgcolor="<%=value_c%>">

<%=db.getId() %>

<!-- <input type="text" name="id" size="20"> --> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">비밀번호</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="password" name="passwd" size="20"> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">비밀번호 확인</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="password" name="repasswd" size="20"> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">이름</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="text" name="name" size="20" value="<%=db.getName()%>"> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">주민번호</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="text" name="jumin1" size="6" maxlength=6 value="<%=db.getJumin1()%>">-

<input type="text" name="jumin2" size="7" maxlength=7 value="<%=db.getJumin2()%>"> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">이메일</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="text" name="email" size="30" value="<%=db.getEmail()%>"> </td>

</tr>

<tr>

<td width="100" bgcolor="<%=title_c%>">블로그</td>

<td width="200" bgcolor="<%=value_c%>">

<input type="text" name="blog" size="20" value="<%=db.getBlog()%>"> </td>

</tr>

<tr>

<td colspan="2" align="center" bgcolor="<%=title_c%>">

<input type="submit" value="회원수정" >

&nbsp; &nbsp; &nbsp; &nbsp;

<input type="reset" value="다시작성">

</td>

</tr>

</form>

</table>

</body>

</html>

updateForm.jsp

 

(밑에 updatePro.jsp에 있는)old랑 db가 같은 건데 이름만 다른 거임

 

 

 

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="register.LogonDataBean" %>

<%@ page import="register.LogonDBBean" %>

<%@ include file="color.jsp" %>

 

<%

request.setCharacterEncoding("utf-8");

 

LogonDataBean regBean1 = new LogonDataBean();

// regBean1.id="test";

%>

 

<jsp:useBean id="regBean" class="register.LogonDataBean" />

<jsp:setProperty name="regBean" property="*" />

 

<%

LogonDBBean manager = LogonDBBean.getInstance();

 

LogonDataBean old = manager.updateForm(regBean.getId());

 

if(old.getPasswd().equals(regBean.getPasswd())){ // 비번 일치시

manager.update(regBean); // update SQL문 실행

// 매개변수를 regBean으로 받도록 설정(regBean은 insert할 데이터)

// Call by value 방식(주소값을 가진 regBean을 전달)

%>

<script>

alert("회원수정 성공");

location.href="list.jsp";

</script>

 

<% }else{ // 비번 불일치 %>

 

<script>

alert("비밀번호가 일치하지 않습니다.");

history.go(-1);

</script>

 

<% } %>

 

 

 

updatePro.jsp

 

 

 

728x90