DTO (Data Transfer Object)
- 계층 간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)
- field, getter & setter 메소드, 기본 생성자만 가진 클래스
ex) DB의 GUEST_BOOK 테이블과 Spring의 GuestBookDto 비교
package com.kh.spring09.entity;
public class GuestBookDto {
// 필드
private int no;
private String name;
private String memo;
// 생성자
public GuestBookDto() {
super();
}
// getter & setter
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
}
DAO (Data Access Object)
- DB의 데이터에 접근하기 위해 생성하는 객체
- 인터페이스 형태로 생성하며 이를 구현(implement)하는 클래스(DAOImpl)가 필요하다
- 인터페이스 구현체에서 CRUD 기능을 갖도록 추상 메소드를 오버라이딩한다
- DAO 인터페이스가 아닌 구현 클래스(DAOImpl)에 @Repository라는 어노테이션을 붙인다
(로직을 바꿔야 할 때 단순히 implements 클래스를 바꾸기만 하면 되기 때문)
ex) DB의 GUEST_BOOK 테이블에 접근하는 DAO
DAO 인터페이스 생성
import java.util.List;
import com.kh.spring09.entity.GuestBookDto;
public interface GuestBookDao {
// 등록(insert) 추상 메소드
void insert(GuestBookDto dto);
// 수정(update) 추상 메소드
boolean update(GuestBookDto dto);
// 삭제(delete) 추상 메소드
boolean delete(int no);
// 조회(select) 추상 메소드
List<GuestBookDto> select(); // 목록(전체 조회) 기능
List<GuestBookDto> select(String type, String keyword); // 검색(조건 조회) 기능
// 상세 조회(detail) 추상 메소드
GuestBookDto detail(int no);
}
DAOImpl 클래스 생성 및 DAO 구현(implements)
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.kh.spring09.entity.GuestBookDto;
@Repository // Repository 어노테이션
public class GuestBookDaoImpl implements GuestBookDao {
// JdbcTemplate의 인스턴스 생성
@Autowired
private JdbcTemplate jdbcTemplate;
// 등록(insert) 추상 메소드 구현
@Override
public void insert(GuestBookDto dto) {
String sql = "insert into guest_book(no, name, memo) values(guest_book_seq.nextval, ?, ?)";
Object[] param = new Object[] {dto.getName(), dto.getMemo()};
// DB INSERT
jdbcTemplate.update(sql, param);
}
// 수정(update) 추상 메소드 구현
@Override
public boolean update(GuestBookDto dto) {
// 1. SQL문 작성
String sql = "update guest_book set name = ?, memo = ? where no = ?";
// 2. 입력 변수 배열 생성
Object[] param = {dto.getName(), dto.getMemo(), dto.getNo()};
// 3. SQL문 전송 및 실행 후 결과 반환
int result = jdbcTemplate.update(sql, param);
return result > 0;
}
// 삭제(delete) 추상 메소드 구현
@Override
public boolean delete(int no) {
// 1. SQL문 작성
String sql = "deleete guest_book where no = ?";
// 2. 입력 변수 배열 생성
Object[] param = {no};
// 3. SQL문 전송 및 실행 후 결과 반환
return jdbcTemplate.update(sql, param) > 0;
}
// 조회(select) 기능을 위한 RowMapper 인스턴스 생성
private RowMapper<GuestBookDto> mapper = new RowMapper<GuestBookDto>() {
@Override
public GuestBookDto mapRow(ResultSet rs, int rowNum) throws SQLException {
GuestBookDto dto = new GuestBookDto();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setMemo(rs.getString("memo"));
return dto;
}
};
// 조회 - 목록(전체 조회)
@Override
public List<GuestBookDto> select() {
// 1. SQL문 작성
String sql = "select * from guest_book order by no asc";
// 2. 입력 변수 배열은 전체 조회에서 필요 없다
// 3. SQL문 전송 및 실행 후 결과 반환
return jdbcTemplate.query(sql, mapper);
}
// 조회 - 검색(조건 조회) : 특정 항목(type)에서만 해당 검색어(keyword) 조회
@Override
public List<GuestBookDto> selectList(String type, String keyword) {
// 1. SQL문 작성
// - instr(컬럼명, '문자열')에서 컬럼명은 ?(placeholder)가 들어갈 수 없다
// - Oracle에서 #이라는 문자는 존재하지 않는다
// - SQL문의 #1을 type으로 치환한다
String sql = "select * from guest_book where instr(#1, ?) > 0";
sql = sql.replace("#1", type);
// 2. 입력 변수 배열 생성
Object[] param = new Object[] {keyword};
// 3. SQL문 전송 및 실행 후 결과 반환
return jdbcTemplate.query(sql, mapper, param);
}
// 상세 조회를 위한 ResultSetExtractor 생성
private ResultSetExtractor<GuestBookDto> extractor = new ResultSetExtractor<GuestBookDto>() {
@Override
public GuestBookDto extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()) {
GuestBookDto dto = new GuestBookDto();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setMemo(rs.getString("memo"));
return dto;
}
else {
return null;
}
}
};
// 상세 조회(detail)
@Override
public GuestBookDto detail(int no) {
// 1. SQL문 작성
String sql = "select * from guest_book where no = ?";
// 2. 입력 변수 배열 생성
Object[] param = {no};
// 3. SQL문 전송 및 실행 후 결과 반환
return jdbcTemplate.query(sql, extractor, param);
}
}
'국비교육 > 국비교육' 카테고리의 다른 글
day29 - 0902 (0) | 2022.09.01 |
---|---|
day28 - 0901 (0) | 2022.09.01 |
day26 - 0830 (0) | 2022.08.30 |
day25 - 0829 (0) | 2022.08.30 |
day24 - 0826 (0) | 2022.08.27 |