영속 계층은 데이터에 대한 CRUD(Create, Read, Update, Delete) 작업을 진행한다.
이 글에서는 영속 계층의 CRUD에 대해 다룬다.
영속 계층의 작업은 항상 다음과 같은 순서로 진행한다.
1. 테이블의 칼럼 구조를 반영하는 VO(Value Object) 클래스의 생성
2. MyBatis의 Mapper 인터페이스의 작성/XML 처리
3. 작성한 Mapper 인터페이스의 테스트
VO 클래스를 생성하는 작업은 테이블 설계를 기준으로 작성하면 된다.
프로젝트에 domain 패키지를 생성하고, BoardVO 클래스를 정의한다.
@Data
public class BoardVO {
private Long bno;
private String title;
private String content;
private String writer;
private Date regdate;
private Date updateDate;
}
BoardVO 클래스는 Lombok을 이용해서 생성자와 getter/setter, toString() 등을 만들어 내는 방식을 사용한다. (이를 위해 @Data 어노테이션 적용)
Mapper 인터페이스를 작성할 때는 리스트와 등록 작업을 우선해서 작성한다. mapper 패키지를 작성하고, BoardMapper 인터페이스를 추가한다.
public interface BoardMapper {
@Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
}
BoardMapper 인터페이스를 작성할 때는 이미 작성된 BoardVO 클래스를 활용해 필요한 SQL을 어노테이션의 속성값으로 처리할 수 있다.
Mapper XML 파일
테스트가 완료되면 src/main/resources 내에 XML 파일을 작성한다. XML을 작성할 때는 반드시 <mapper>의 namespace 속성값을 Mapper 인터페이스와 동일한 이름을 준다. select 태그의 id 속성값은 메서드의 이름과 일치하게 작성한다. resultType 속성 값은 select 쿼리의 결과를 특정 클래스의 객체로 만들기 위해 설정한다.
현재 bno를 PK 칼럼으로 이용하고, 자동으로 데이터가 추가될 때 번호가 만들어지는 방식을 사용(시퀀스 이용)한다. 자동으로 PK 값이 정해지는 경우 다음과 같은 2가지 방식으로 처리할 수 있다.
selectKey는 번거롭지만 insert 된 번호를 알아올 수가 있다. (insert는 bno의 값을 삽입할 때 nextval을 이용하므로 값을 알 수 없다.)
insert가 된 데이터를 조회하는 작업은 PK를 이용해서 처리하므로 BoardMapper의 파라미터 역시 BoardVO 클래스의 bno 타입 정보를 이용해서 처리한다. (primaryKey만 있으면 된다.)
데이터를 삭제하는 작업 역시 PK 값을 이용해서 처리하므로 조회하는 작업과 유사하게 처리한다.
등록, 삭제 수정과 같은 DML 작업은 '몇 건의 데이터가 수정되었는지'를 반환할 수 있다.
제목, 내용, 작성자를 수정한다고 가정하면 파라미터가 여러 개이므로 DTO, VO 타입을 이용하는게 좋다. delete와 마찬가지로, 몇개의 데이터가 수정되었는지 처리할 수 있으므로 int형으로 작성한다.