[DB] DAO(Data Access Object), 단위테스트

포키·2023년 6월 1일
0

국비과정

목록 보기
65/73

JDBC - DAO

DAO 사용 순서

  • 드라이버 로드
  • 연결
  • 질의
  • 자원 해제

질의 메서드

  • executeUpdate : INSERT, UPDATE, DELETE => int 리턴
  • executeQuery : SELECT => ResultSet 리턴 (셀렉트문 결과 담는 객체)

ResultSet

  • SELECT문의 결과를 담고있는 객체
    (Statement 객체의 executeQuery()의 리턴값)
  • 사용 후 close() 필수!!!!!!
  • 참고
  • 주요 메서드
    next() : return boolean
    get자료형(String columnLabel) : return 자료형
    get자료형(int columnIndex) : return 자료형
    last() : cursor를 마지막 row로 변경
    beforeFirst() : cursor를 0번째 row(?)로 변경
    getRow() : 현재 커서가 위치한 row 번호를 반환. return int

코드

package kr.ac.green.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import kr.ac.green.Book;

/*
 * JDBC (Java Database Connectivity)
 * 
 * 1. 드라이버 로드 (1번만 수행)
 * 2. 연결
 * 3. 질의
 * 4. 자원해제
 */
public class BookDAO {
	private static final BookDAO INSTANCE = new BookDAO(); 
	private BookDAO() {
		// 1. 드라이버 로드
		try {
			Class.forName("com.mysql.jdbc.Driver");
			// oracle의 드라이버 클래스 위치 : "oracle.jdbc.driver.OracleDriver"
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	public static BookDAO getInstance() {
		return INSTANCE;
	}
	public Connection connect() {
		Connection con = null;
		try {
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "1234");
			// mysql의 url 형식 : "jdbc:mysql://localhost:3306/test";
			// oracle의 url 형식 : "jdbc:oracle:thin:@localhost:1521:orcl"
		} catch(SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	public void disconnect(Connection con) {
		try {
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public int insertBook(Connection con, Book book) {
		int result = 0;
		Statement stmt = null;
		// Statement도 (HttpSevletRequest, HttpServletResponse와 마찬가지로) interface
		// 이전에 WAS가 그랬듯 DBMS에서 만들어줌
		try {
			/*
			 * executeUpdate : INSERT, UPDATE, DELETE => int 리턴
			 * executeQuery : SELECT => ResultSet 리턴
			 */
			stmt = con.createStatement();	// Connection 개체에서 Statement 생성
			
			String sql = "INSERT INTO book (b_title, b_writer, b_password, b_price, b_publisher, b_comment VALUES ('%s', '%s', '%s', '%d', '%s', '%s')";
			sql = String.format(sql, book.getTitle(), book.getWriter(), book.getPassword(), book.getPrice(), book.getPublisher(), book.getComment());
			
			result = stmt.executeUpdate(sql);
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			if(stmt != null) {
				try {
					// 자원해제 (반드시 해주기!!!!!!!!!!!!!!!!!)
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}
}

DAO 단위테스트 (UnitTest)

  • 단위테스트란 앱의 작은 단위(일반적으로 메서드)를 사용하여 코드의 나머지 부분에서 격리하고 예상대로 작동하는지 확인하는 것
  • 이클립스는 단위테스트 프레임워크? 제공 - JUnit
  • 단위 테스트와 TDD(Test-driven Development)
    참고

트랜잭션(Transaction)
참고

  • DAO 나누는 이유
  1. 데이터베이스와의 연결을 CMD에서 결정할 수 있게 하기 위해 - connect, disconnect, sql질의
    연결을 얻고 끊는 것 자체가 DAO 안에서 정해져버리면 외부의 cmd에서는 연결을 컨트롤할 수 없다.
  2. ??? 트랜잭션을 만들기 위해 (autocommit=false 설정) ???
  • 메서드에 커서 올리고 우클릭으로 실행하면 해당 테스트메서드만 실행
  • autocommit = false;
  • test 결과 검증 메서드
    Assert.assertEquals()
    Assert.assertArrayEquals()
    Assert.assertNotEquals()
    Assert.assertNotNull()
    Assert.assertTrue()

rowMapping() : (셀렉트문 결과인) 한 줄을 객체로 반환하는 메서드
spring에서 사용하는 방법

profile
welcome

0개의 댓글