Day55 - [JSP]DAO클래스와 VO클래스

2021. 5. 3. 16:10JSP 공부

Day54 에서 페이지 만든걸 가지고, 클래스로 분할해서 스스로 해보라고 했는데 하셨나요? ㅎㅎㅎ

 

이번에는 DAO클래스와 VO클래스를 알아 봅시다.

 

DAO클래스

Day54 에서 페이지 만든 것에서, jdbc에 연결하는(데이터베이스에 접근하는) 파일이 여러개 였죠?

그래서, jdbc에 대표적으로 연결할 클래스를 하나 만들게 되는데, 그게 바로 DAO 클래스 입니다.

 

DAO 클래스(Data Access Object) - 데이터베이스에 접속해서 데이터의 추가, 삭제, 수정 등의 작업을 하는 클래스입니다.

 

일반적으로 JSP 혹은 Servlet에서 위의 로직을 함께 기술할 수도 있지만, 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용합니다.

 

보통 한 개의 테이블마다 한 개의 DAO 클래스를 작성합니다.

 

DAO 클래스는 테이블로부터 데이터를 읽어와 자바 객체로 변환하거나 자바 객체의 값을 테이블에 저장합니다.

 

DAO 클래스는 단 1개만 생성이 되도록, 싱글톤 패턴으로 만듭니다.

 

VO클래스

DAO클래스를 구현하면 데이터베이스에 연결을 할 때, 데이터베이스 안에 있는 테이블의 속성을 가져오거나, 넣어주게 됩니다. ( select, insert, update )

 

그래서 항상, 데이터베이스 안에 있는 테이블의 컬럼과 같은 값을 갖는 자바빈 클래스를 만드는데, 이게 바로 VO클래스 입니다.

 

VO 클래스(Value Object) / DTO 클래스(Data Transfer Object) 라고 부릅니다.

 

DAO 클래스를 이용하여 데이터베이스에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업할 수도 있지 만, 별도의 VO 클래스를 작성하여 데이터베이스와 관련된 변수들의 모음 역할을 합니다

 

VO 클래스의 변수들은 외부에서 쉽게 접근할 수 없도록 은닉(private) 처리 합니다.

 

DAO 클래스의 예제.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MemberDAO {

	/*
	 * DAO 클래스는 단순히 DB연동만 담당하기 때문에 불필요하게 객체를 여러개 생성 할 필요가 없습니다.
	 * 그래서 싱글톤 패턴을 적용해서 객체를 1개만 생성되도록 만듭니다.
	 */
	
	// 1. 스스로 객체를 1개 생성합니다.
	private static MemberDAO instance = new MemberDAO();
	// 2. 외부에서 생성자를 호출할 수 없도록 생성자에 private제한을 붙임
	private MemberDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch(Exception e) {
			System.out.println("드라이버 호출 에러");
		}
	}
	
	// 3. 외부에서 객체생성을 요구하면 getter메서드를 이용해서 1번의 객체를 반환
	public static MemberDAO getInstance() {
		return instance;
	}
	
	
	////////////////////////////////////////////////////////////////////////////
	// 멤버변수
	private String url = "jdbc:oracle:thin:@localhost:1521/XEPDB1";
	private String uid = "JSP";
	private String upw = "JSP";
	
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;

	// join메서드
	public int join(MemberVO vo) {
		int result = 0;
		
		String sql = "insert into members values(?, ?, ?, ?, ?, ?, ?)";
		
		try {
			// conn 생성
			conn = DriverManager.getConnection(url, uid, upw);
			// pstmt 생성
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getId());
			pstmt.setString(2, vo.getPw());
			pstmt.setString(3, vo.getName());
			pstmt.setString(4, vo.getPhone1());
			pstmt.setString(5, vo.getPhone2());
			pstmt.setString(6, vo.getPhone3());
			pstmt.setString(7, vo.getGender());
			
			// sql 실행
			result = pstmt.executeUpdate(); // 1 or 0
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}

	// login메서드
	public MemberVO login(String id, String pw) {
		MemberVO vo = null;
		
		String sql = "select * from members where id = ? and pw = ?";
		
		try {
			// conn 생성
			conn = DriverManager.getConnection(url, uid, upw);
			// pstmt 생성
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			// sql실행
			rs = pstmt.executeQuery();
			
			if(rs.next()) { // 로그인 성공
				vo = new MemberVO();
				
				vo.setId(rs.getString("id"));
				vo.setName(rs.getString("name"));
			} 
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try{
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
				if(rs != null) rs.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return vo;
	}

	// 회원정보를 조회하는 메서드
	public MemberVO getInfo(String id) {
		MemberVO vo = null;
		
		String sql = "select * from members where id = ?";
		
		try {
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				vo = new MemberVO();
				
				vo.setId(id);
				vo.setName(rs.getString("name"));
				vo.setPhone1(rs.getString("phone1"));
				vo.setPhone2(rs.getString("phone2"));
				vo.setPhone3(rs.getString("phone3"));
				vo.setGender(rs.getString("gender"));
			}
		} catch(Exception e) {
			
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
				if(rs != null) rs.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return vo;
	}

	// update메서드
	public int update(MemberVO vo) {
		int result = 0;
		
		String sql = "update members set pw = ?, name = ?, phone1 = ?, phone2 = ?,"
				   + "phone3 = ?, gender = ? where id = ?";
		
		try {
			conn = DriverManager.getConnection(url, uid, upw);
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getPw());
			pstmt.setString(2, vo.getName());
			pstmt.setString(3, vo.getPhone1());
			pstmt.setString(4, vo.getPhone2());
			pstmt.setString(5, vo.getPhone3());
			pstmt.setString(6, vo.getGender());
			pstmt.setString(7, vo.getId());
			
			result = pstmt.executeUpdate(); // 성공시 1반환, 실패시 0반환
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}

	// delete메서드
	public int delete(String id) {
		int result = 0;
		
		String sql = "delete from members where id = ?";
		
		try {
			conn = DriverManager.getConnection(url, uid, upw);
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			result = pstmt.executeUpdate();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}
}

VO 클래스의 예제

public class MemberVO {

	/*
	 * VO클래스는 DB컬럼들을 자바 변수로 선언합니다.
	 * DB컬럼과 form태그의 name과 매칭되는 변수를 모두 선언합니다.
	 */
	private String id;
	private String pw;
	private String name;
	private String phone1;
	private String phone2;
	private String phone3;
	private String gender;
	
	// VO클래스는 기본생성자와 모든 멤버변수를 초기화하는 생성자를 선언.
	public MemberVO() {
	}

	public MemberVO(String id, String pw, String name, String phone1, String phone2, String phone3, String gender) {
		super();
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.phone1 = phone1;
		this.phone2 = phone2;
		this.phone3 = phone3;
		this.gender = gender;
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone1() {
		return phone1;
	}
	public void setPhone1(String phone1) {
		this.phone1 = phone1;
	}
	public String getPhone2() {
		return phone2;
	}
	public void setPhone2(String phone2) {
		this.phone2 = phone2;
	}
	public String getPhone3() {
		return phone3;
	}
	public void setPhone3(String phone3) {
		this.phone3 = phone3;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}