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
'SQL > database' 카테고리의 다른 글
Transaction 처리, DBCP (2) | 2024.12.11 |
---|---|
XML 설정(Parameter mapping, Result mapping,Complex Type/Collection property mapping) (0) | 2024.12.11 |
XML 설정(Parameter mapping, Result mapping,Complex Type/Collection property mapping) (3) | 2024.12.08 |
Mybatis (3) | 2024.12.04 |
JDBC Programming (3) | 2024.12.03 |