JSP_basic. VO클래스와 DAO

dwanGim·2022년 4월 7일
0

JSP_basic

목록 보기
7/15
post-thumbnail

VO 클래스의 응용

VO클래스는 DB의 한 로우를 저장해주는 클래스입니다.

VO클래스와 연립하여 DAO클래스를 생성하면 DB의 로우들을 원하는 컬럼이나 묶음 단위로

쉽게 불러올 수 있습니다.

DAO클래스는 ?

DAO 클래스는 DB 연동 시 반복적으로 작성하는 코드를

중복 작성하지 않기 위해 사용합니다.

데이터베이스에 접속해서 데이터를 추가해야하거나

삭제, 수정 등의 작업이 필요할 때

DB 접속 시 필요한 변수들을 선언하거나

생성자들을 이용해 쿼리문을 미리 세팅해두기도 합니다.

DAI 클래스는 테이블로부터 데이터를 읽어와 자바 객체로 변환하거나

자바 객체의 값을 테이블에 저장합니다.

따라서 DAO를 구현하면 테이블의 컬럼과 매핑되는 값을 가지는

자바빈 클래스를 항상 작성해야 합니다.

이 자바빈 클래스가 바로 VO 클래스 인 겁니다.

DB의 모든 유저 정보를 불러오는

getAllUserList().jsp를 생성해보면서

VO / DAO클래스를 이용해보겠습니다.

먼저 VO클래스를 만듭니다.

UserVO.java의 전문입니다.

package com.ict.domain;

public class UserVO {

	private String userId;
	private String userPw;
	private String userName;
	private String Email;
	
	
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserPw() {
		return userPw;
	}
	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getEmail() {
		return Email;
	}
	public void setEmail(String email) {
		Email = email;
	}


	@Override
	public String toString() {
		return "UserVO [userId=" + userId + ", userPw=" + userPw + ", userName=" + userName + ", Email=" + Email + "]";
	}
	
}

VO 클래스를 생성할 때

toString도 생성해주면, System.out.println()과 같은 조회구문에서

자료 주소값 대신 실제로 들어있는 데이터를 화면에 보여줍니다.

toString은 자바 우클릭 => source => generateToString() 실행 => 모든 변수 선택 후 생성

으로 쉽게 작성할 수 있습니다.

다음으로 DAO 클래스입니다.

DAO 클래스 생성

DAO 클래스의

핵심로직은 그렇게 길지 않으나.

DAO 클래스에 대해 깊게 이해하기 위해서

sysout을 통해 List<UserVO 안에 어떻게 자료들이 담기는지

확인을 해보았습니다.

그럼 먼저

DB 접속 시 필요한 변수들을 선언합니다.

public class UserDAO {

	private String dbType = "com.mysql.cj.jdbc.Driver";
	private String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
	private String connectId = "root";
	private String connectPw = "mysql";
	

이후에 생성자를 이용해 생성할 때 자동으로 Class.forName()을 세팅하게 만들어주어야 합니다.

어떤 쿼리문을 실행하더라도 위의 DB 접속 변수와 DB종류 지정은 무조건 하기에 생성자로 생성합니다.

	public UserDAO() {
		try {
			Class.forName(dbType);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

그 후엔 getAllUserList.jsp의 핵심 로직을

DAO로 옮겨서 작성해보겠습니다.

getAllUserList가 전체 유저 목록을 출력해주고 있기에

DB의 userinfo 테이블의 row를 여러 개 받아올 수 있어야 합니다.

그래서 VO 클래스가 필요한 것이고

리턴 자료형으로 List<UserVO를 리턴할 수 있도록

작성했습니다.

	public List<UserVO> getAllUserList(){

		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; 
		
		List<UserVO> userList = new ArrayList<>();

ResultSet은 실행 쿼리문이 SELECT 구문인 경우 결과값을 받기 위해 필요합니다.

결과로 DB에서 꺼내올 user들의 목록도 미리 선언해두었습니다.

이제 필요한 변수가 모두 선언되었습니다.

그럼 try 블럭 안에 로직을 작성합니다.

		try {
			// getAllUserList.jsp를 참조해 아래 로직을 작성완료해주세요.
			// Connection 생성
			con = DriverManager.getConnection(connectUrl, connectId, connectPw);
			// 쿼리문 저장
			String sql = "SELECT * FROM userinfo";
			// PreparedStaqtement에 쿼리문 입력
			pstmt = con.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				// 유저 한 명의 정보를 담을 수 있는 VO 생성
				UserVO user = new UserVO();
				// 디버깅으로 비어있는 것 확인
				System.out.println("집어넣기 전 : " + user);
				// setter로 다 집어넣기
				user.setUserId(rs.getString(1));
				user.setUserPw(rs.getString(2));
				user.setUserName(rs.getString(3));
				user.setEmail(rs.getString(4));
				// 다 집어넣은 후 디버깅
				System.out.println("집어넣은 후 : " + user);
				userList.add(user);
			}
			System.out.println("리스트에 쌓인 자료 체크 : " + userList);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				con.close();
				pstmt.close();
				rs.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return userList;
		
		
	}



다음과 같이 userinfo 테이블 안의 3개의 컬럼의 로우들이

while 문을 거치며 빈 UserVO 안에 적재되었고

그것을 return하는 형식이라는 것을 알 수 있습니다.

아래의 getAllUserInfo의 전문을 확인하면

얼마나 획기적으로 스크립트를 줄일 수 있는지

알 수 있습니다.

<%@page import="com.ict.domain.UserVO"%>
<%@page import="java.util.List"%>
<%@page import="com.ict.domain.UserDAO"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.ResultSet"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 아래쪽에 원래 작성된 접속 로직 저장되어 있음
	UserDAO dao = new UserDAO();// 생성과 동시에 Class.forName(db타입)
	List<UserVO> userList = dao.getAllUserList(); // DB연결해 전체 목록 가져다 주고 종료.
	out.println("DAO에서 전달받은 자료들 : " + userList);
	
%>

<%	/*
	String dbType = "com.mysql.cj.jdbc.Driver";
	String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?severTimezone=UTC";
	String connectId = "root";
	String connectPw = "mysql";
	
	// try 블럭이 닫히는 순간, 내부에서 최초로 선언된 변수들도 다 사라짐
	// 그래서 body 태그에서 출력해야하는 필수 요소는 try 진입 전 선언해놔야함
	
	ResultSet rs = null;
			
	try {
		Class.forName(dbType);
		
		Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);
		
		
		String sql = "SELECT * FROM userinfo";
		
		PreparedStatement pstmt = con.prepareStatement(sql);
		
		rs = pstmt.executeQuery();
		
	} catch(Exception e) {
		e.printStackTrace();
	}
	*/
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<thead>
			<tr>
				<th>유저 아이디</th>
				<th>패스워드</th>
				<th>유저 이름</th>
				<th>이메일</th>
			</tr>
		</thead>
		<tbody>
			<tr>

			</tr>
		</tbody>
	</table>

</body>
</html>

주석 처리한 부분이 원래의 DB 연동 구문이었지만

이제 DAO 클래스를 이용해 단 2 ~ 3줄의 스크립트로

DB와의 연결에 성공했습니다.

이렇듯

DAO 와 VO를 다루는 데 익숙해지면

앞으로 하나의 패키지나 테이블 마다

이 두가지를 이용해서 쉽게 DB와 연락할 수 있습니다.

잘 다룰 수 있도록 노력해야겠습니다.

아래는 DAO클래스인 UserDAO의 전문입니다.

package com.ict.domain;

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

public class UserDAO {

	private String dbType = "com.mysql.cj.jdbc.Driver";
	private String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
	private String connectId = "root";
	private String connectPw = "mysql";

	
	public UserDAO() {
		try {
			Class.forName(dbType);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	

	public List<UserVO> getAllUserList(){

		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; 
		List<UserVO> userList = new ArrayList<>();
		

		
		try {

			con = DriverManager.getConnection(connectUrl, connectId, connectPw);

			String sql = "SELECT * FROM userinfo";
		
			pstmt = con.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				
				UserVO user = new UserVO();
				
				System.out.println("집어넣기 전 : " + user);
				
				user.setUserId(rs.getString(1));
				user.setUserPw(rs.getString(2));
				user.setUserName(rs.getString(3));
				user.setEmail(rs.getString(4));
				
				System.out.println("집어넣은 후 : " + user);
				userList.add(user);
			}
			System.out.println("리스트에 쌓인 자료 체크 : " + userList);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				con.close();
				pstmt.close();
				rs.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return userList;
		
		
	}
	
	
}

일단은 여기까지 입니다.

profile
배울 게 참 많네요.

0개의 댓글