오봉이와 함께하는 개발 블로그

DAO & DTO 본문

DB

DAO & DTO

오봉봉이 2021. 11. 25. 16:48
728x90

SQLday_6 정리 (2021.11.25 목요일)

Statement vs PreparedStatement

  • 쿼리문 전송을 위한 객체를 생성
  • Statement
    • 문자열로 구성된 SQL문을 DBMS로 전송하면 내부적으로 SQL문을 JDBC 드라이버가 읽을 수 있는 형식으로 전처리 수행
    • SQL문이 수행될 때 마다 매번 전처리 수행
      • 반복적 작업으로 인해 성능 저하 발생할 수 있음
    • 쿼리문에 값이 다 입력되어 있어야하기 때문에 SQL문이 복잡해짐
  • PreparedStatement
    • Statement 인터페이스의 하위 인터페이스
    • SQL이 실행될 때 마다 매번 전처리하지 않고 라이브러리 캐시에서 읽어와서 처리하기 때문에 성능이 좋다.
    • SQL문 구조는 같지만 조건이 수시로 변할 때 조건의 변수 처리를 '?'(PlaceHolder)로 지정할 수 있다
      • 바인딩 변수라고 함
    • 동일한 SQL문을 특정 값만 바꾸어서 여러 번 실행해야 할 때 또는, 인수가 많아서 SQL문이 복잡할 때 관리
    • 실무에서는 주로 PreparedStatement 사용
    • 바인딩 변수의 순서는 ?의 순서에 따라 결정됨.
    • 시작번호는 1부터 시작.
    • 바인딩 변수에 값을 저장하기 위해 set'자료형'() 메소드 사용
    • 바인딩 변수는 반드시 열의 값 자리에 위치한다.
      • values(?,?,?,?,?,?,?);

DTO

  • Data Transfer Object
    • 데이터 저장용 클래스(멤버 변수에 데이터 저장)
    • 데이터베이스에 데이터를 저장하거나 데이터베이스로부터 데이터를 조회할 때 데이터를 담아서 전달하기 위해 사용
    • 데이터 입력 -> DTO -> DAO(insert()로 전달) -> DB
    • 데이터 조회 -> DB -> DAO(select()로 데이터 읽어옴) -> 출력(또는 DTO에 담아서 출력 담당에게 전달)
DTO 예제 코드
package db4;

public class ProductDTO {
    private String prdNo;
    private String prdName;
    private int prdPrice;
    private String prdMaker;
    private String prdColor;
    private String ctgNo;

    public ProductDTO(String prdNo, String prdName, int prdPrice, String prdMaker, String prdColor, String ctgNo) {
        this.prdNo = prdNo;
        this.prdName = prdName;
        this.prdPrice = prdPrice;
        this.prdMaker = prdMaker;
        this.prdColor = prdColor;
        this.ctgNo = ctgNo;
    }
    public String getPrdNo() {
        return prdNo;
    }

    public void setPrdNo(String prdNo) {
        this.prdNo = prdNo;
    }

    public String getPrdName() {
        return prdName;
    }

    public void setPrdName(String prdName) {
        this.prdName = prdName;
    }

    public int getPrdPrice() {
        return prdPrice;
    }

    public void setPrdPrice(int prdPrice) {
        this.prdPrice = prdPrice;
    }

    public String getPrdMaker() {
        return prdMaker;
    }

    public void setPrdMaker(String prdMaker) {
        this.prdMaker = prdMaker;
    }

    public String getPrdColor() {
        return prdColor;
    }

    public void setPrdColor(String prdColor) {
        this.prdColor = prdColor;
    }

    public String getCtgNo() {
        return ctgNo;
    }

    public void setCtgNo(String ctgNo) {
        this.ctgNo = ctgNo;
    }
}

DAO

  • Data Access Object
    • 데이터를 액세스 하는 클래스
    • 데이터베이스에 데이터를 저장하거나 데이터베이스에서 데이터를 가져올 때 사용
    • insert() / select() / update() / delete() 기능의 메소드 포함
    • DB 연결 (생성자)
DAO 예제 코드
package db4;

import java.sql.*;

public class ProductDAO {
    Connection connection;
    PreparedStatement preparedStatement;
    ResultSet resultset;


    // DB연결 생성자
    public ProductDAO() {
        try {
            String url = "jdbc:mysql://localhost:3306/sqldb6?serverTimezone=UTC";
            String user = "root";
            String pwd = "";

            connection = DriverManager.getConnection(url, user, pwd);

            if(connection != null) {
                System.out.println("연결 성공");
            }
        } catch (Exception e) {
            System.out.println("연결 오류 발생!");
            e.printStackTrace();
        }
    }
    public void selectProduct()  {
        try {
            String sql = "select * from product order by prdNo";
            preparedStatement = connection.prepareStatement(sql);
            resultset = preparedStatement.executeQuery(sql);

            while (resultset.next()) {
                String prdNo = resultset.getString(1);
                String prdName = resultset.getString(2);
                int prdPrice = resultset.getInt(3);
                String prdMaker = resultset.getString(4);
                String prdColor = resultset.getString(5);
                String ctgNo = resultset.getString(6);
                System.out.format("%-10s \t %-10s\t %-4d\t %-20s\t %13s\t %s  \n",
                        prdNo, prdName, prdPrice, prdMaker, prdColor, ctgNo);
            }
        } catch(Exception e) {
            System.out.println("select 오류 발생!");
            e.printStackTrace();
        }
    }
    // insert Method
    public void insertProduct(ProductDTO productDTO) {
        try{
            String sql = "insert into product values(?, ?, ?, ?, ?, ?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, productDTO.getPrdNo());
            preparedStatement.setString(2, productDTO.getPrdName());
            preparedStatement.setInt(3, productDTO.getPrdPrice());
            preparedStatement.setString(4, productDTO.getPrdMaker());
            preparedStatement.setString(5, productDTO.getPrdColor());
            preparedStatement.setString(6, productDTO.getCtgNo());
            int result = preparedStatement.executeUpdate();
            if(result > 0) {
                System.out.println("성공");
            }
        }catch (Exception e) {
            System.out.println("insert 오류 발생!");
            e.printStackTrace();
        }
    }
}
728x90

'DB' 카테고리의 다른 글

데이터 모델링  (0) 2022.02.04
DAO 메소드를 클래스로 실행  (0) 2021.11.26
내장함수 & 파일로드 & JDBC  (0) 2021.11.24
DML - Join, SubQuery, Table CP  (0) 2021.11.23
DML - SELECT문 기초  (0) 2021.11.22
Comments