본문 바로가기

SQL/database

DAO, DTO

 


DAO Pattern : 데이터 저장소에 대한 접근 및 이용 방법 추상화 및 캡슐화

- 영속성 계층(Persistence Layer)

  • 데이터 저장소(Data Soure) 이용
  • 비즈니스 계층에서 영속성 계층에 접근하기 위해 이용할 수 있는 구성요소 필요
    • 공통의 API 제공, 데이터 저장소에 독립적인 애플리케이션 개발 가능

-  Data Access Object (DAO)

  • 데이터 저장소를 공통의 인터페이스를 통해 이용할 수 있도록 해주는 구성요소

DTO Pattern : 전송할 데이터 저장하는 객체 ,DTO로 묶어 데이터 전송

- Business Layer와 Persistenece Layer 사이의 데이터 전송 뿐 아니라 , Presentaion 과 Business간의 데이터 전송도 가능

- JavaBeans/POJO(Plain Old Jova Object)로 구현

  • getter/setter method 정의
  • business method는 일반적으로 포함하지 않음
  • 네트워크 전송이나 파일 시스템 저장 -> 직렬화 가능하도록 java.io.Serializable interface구현

import java.util.List;

public class StudentServiceImpl implements StudentService {
	private StudentDao dao = null;
    
    public StudentServiceImple() {
    	DAOFactory factory = new DAOFactory(); // StudentDAOImpl 객체 반환
        dao = factory.getStudentDAO();
    }
    
    public List<StudentDTO> ListingStudentds() {
    	return dao.getStudentList();
    }
    
    public StudentDTO getStudent(String StuNo) throws ..{
    	StudentDTO student = dao.getStudentByNo(stuNo);
        if (student == null)
        	throw new UserNotFoundException(stuNo + "는 존재하지 않는 학번");
         return student;
    }
}
public class StudentDTO {
	private String deptName = null;
    private String profName = null;
    
    pubilc String getProfName() { // getter
    	return profName;
    }
    
    public void setProfName(String profName) { // setter
    	this.profName = profName;
    }
}
import persistence.dao.*;
import persistence.dao.impl.*; 

public class DAOFactory {
	public StudentDAO getStudentDAO() {
    	return new StudentDAOImpl();
    }
    
    public DeptDAO getDeptDAO() {return new DeptDAOImpl()}
    public ProfDAO getProfDAO() {return new ProfDAOImpl()}
}
import java.util.List;
import service.dto.StudentDTO;

public interface StudentDAO {
	public List<StudentDTO> getStudentList();
    public StudentDTO getStudentByNo(String stuNo);
    public List<StudentDTO> getStudentsByName(String name);
    public int insertStudent(StudentDTO stu);
    public int updateStudent(StudentDTO stu);
    public int deleteStudent(String stuNo);
}
import java.util.List;
import java.util.ArrayList;
import service.dto.*;
import persistence.DAOFactory;
import persistence.dao.*;
import persistence.util.JDBCUtil;

public class StudentDAOImpl implements StudentDAO {
	private JDBCUtil jdbcUtill = null; // JDBCUtill 객체 참조 변수 선언
    
    public StudentDAOImpl() { // 생성자
    	jdbcUtil = new JDBCUtill();
    }
    
    // 학생 기본 정보를 포함하는 SELECT 절
    private static String query = "SELECT STUDENT.STU_NO," + "STUDENT.STU_NAME ...";
    
    public List<StudentDTO> getStudentList() {
    	String allQuery = query + "," + "STUDENT.P_NO" + "FROM STUDENT ORDER BY STU_NO";
        
        jdbcUtill.setSqlAndParameter(allQuery,null); // JDBCUtill 객체에 질의문 설정
        try {
        	ResultSet rs = jdbcUtil.executeQuery; // 질의 실행
            List<StudentDTO> list = new ArrayList<StudentDTO>(); // DTO들을 담기 위한 리스트 생성
            while(rs.next()) {
            	StudentDTO dto = new StudentDTO(); // StudentDTO 객체 생성 후 검색
                dto.setStuNo(rs.getString("STU_NO"));
                dto.setStuName(rs.getString("STU_NAME"));
                
                list.add(dto);
            }
            return list; // 학생정보를 저장한 DTO 객체들의 리스트를 반환
        }
	} catch (Exception ex) {
    	ex.printStackTrace(); 
    } finally {
    	jdbcUtill.close(); // ResultSet,PreparedStatement,Connection 객체 반환
    } return null
    
}
public StudentDTO getStudentsByNo(String stuNo) {
	String searchQuery = query + "," + "PROFESSOR_NAME," + ".." + "FROM STUDENT,PROFESSOR,DEPT" 
    			+ "WHERE STUDENT.STU_NO = ? AND" + "STUDENT.P_NO = PROFESSOR.P_NO AND" + "STUDENT.D_NO = DEPT.D_NO";
                
    Object[] param = new Object[]{stuNo};
    jdbcUtil.setSqlAndParameters(searchQuery,param); // JDBCUtill에 질의 및 매개변수 설정
    try {
    	ResultSet rs = jdbcUtil.executeQuery(); // 질의 실행
        StudentDTO stu = null;
        if(rs.next()) { // 질의 결과 존재
        	stu = new StudentDTO(); // StudentDTO 객체를 생성하여 학생 정보 저장
            stu.setStuNo(rs.getString("STU_NO");
            stu.setStuNAME(rs.getString("STU_NAME"):
            ,,,
            stu.setProfName(rs.getString("PROF_NAME"));
            stu.setDept(rs.getString("DEPT_NAME"));
        }
        return stu;
    } catch (Exception ex) { ...
    } finally { jdbcUtil.close(); } return null;
}
public int insertStudent(StudentDTO stu) {
	int result = 0;
    String insert = "INSERT INTO STUDENT(STU_NO,STU_NAME,PASSWORD," + "..)" 
    	VALUES (?,?,?,?,?,?,?)";
        
    DAOFactory factory = new DAOFactory();
    ProfDAO profDAO = fatory.getProfDAO(); // factory를 통해 ProfDAO 객체 획득득
    ProfDTO profDTO = profDAO.getProfByName(stu.getProfName());
    String profNo = profDTO.getProfNo();
    if (profNo == null ) { System.out.println("해당 교수가 없습니다."); return 0; }
    
    DeptDAO deptDAO = factory.getDeptDAO();
    DeptDTO deptDTO = deptDAO.getDeptByName(stu.getDept());
    String deptNo = deptDTO.getDeptNo();
    if ( deptNo == null ) { System.out.println("해당 학과가 없습니다."); return 0; }
    
    Object[] param = new Ojbect[] {stu.getStuNo(),stu.getStuName() ...};
    
    jdbcUtil.setSqlAndParameters(insert,param);
    try {
    	result = jdbcUtil.executeUpdate(); // insert문 실행
    } catch (Exception ex) { jdbcUtil.rollback(); ex.printStackTrace(); } // rollback 실행
    finally {
    	jdbcUtil.commit(); // commit 실행
        jdbcUtil.close(); // ResultSet,PreparedStatement 등 자원 반환
        return result;
    }
}

JDBCUtill

 : JDBC API 사용 시 코드의 중복성과 복잡성 제거하기 위한 utility class