영속 계층의 처리
- 테이블을 반영하는 VO(Value Object) 클래스의 생성
- MyBatis의 Mapper 인터페이스의 작성 / XML 처리
- 작성한 Mapper 인터페이스의 테스트
영속 계층의 구현 준비
VO 클래스의 작성
VO 클래스를 생성하는 작업은 테이블 설계를 기준으로 작성하면 됩니다. 현재 tbl_board 테이블의 구성은 아래와 같습니다.
프로젝트에 org.noel.domain 패키지를 생성하고, BoardVO 클래스를 정의합니다.
▶ BoardVO 클래스
package org.noel.domain;
import java.util.Date;
import lombok.Data;
@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 인터페이스를 작성할 때는 리스트(select)와 등록(insert) 작업을 우선해서 작성합니다. org.noel.mapper 패키지를 작성하고, BoardMapper 인터페이스를 추가합니다.
▶ org.noel.mapper.BoardMapper 인터페이스
package org.noel.mapper;
import java.util.List;
import org.apche.ibatis.annotations.Select;
import org.noel.domain.BoardVO;
public interface BoardMapper {
@Select("select * from tbl_board where bno >0")
List<BoardVO> getList();
}
BoardMapper 인터페이스를 작성할 때는 이미 작성된 BoardVO 클래스를 적극적으로 활용해서 필요한 SQL 어노테이션의 속성값으로 처리할 수 있습니다.(⚠️SQL을 작성할 때는 반드시 ';'이 없도록 작성해야 합니다⚠️) SQL Developer에서 먼저 실행해서 결과를 확인합니다.
SQL Developer에서 먼저 확인하는 이유는 1) SQL이 문제가 없이 실행 가능한지를 확인하기 위한 용도와, 2) 데이터베이스의 commit을 하지 않았다면 나중에 테스트 결과가 달라지기 때문에 이를 먼저 비교할 수 있도록 하기 위함입니다.
작성된 BoardMapper 인터페이스를 테스트 할 수 있게 테스트 환경인 'src/test/java'에 'org.noel.mapper' 패키지를 작성하고 BoardMapperTests 클래스를 추가합니다.
▶ org.noel.mapper.BoardMapperTest 클래스
package org.noel.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardMapperTests {
@Autowired
private BoardMapper boardMapper;
@Test
public void testGetList() {
log.info("---------------------");
boardMapper.getList();
}
}
BoardMapperTests 클래스는 스프링을 이용해서 BoardMapper 인터페이스의 구현체를 주입받아서 동작하게 합니다. Java 설정 시에는 RootConfig 클래스를 이용해서 스프링의 설정을 이용하고 있음을 명시합니다. testGetList()의 결과는 SQL Developer에서 실행된 것과 동일해야만 정상적으로 동작한 것입니다. 실행결과는 아래와 같이 보입니다.
Mapper XML 파일
BoardMapperTests를 이용해서 테스트가 완료되었다면 src/main/resources 내에 패키지와 동일한 org/noel/mapper 단계의 폴더를 생성하고 XML 파일을 작성합니다.(폴더를 한번에 생성하지 말고 하나씩 생성해야 합니다!)
파일의 폴더 구조나 일므은 무방하지만 패키지와 클래스 이름과 동일하게 해주면 나중에 혼란스러운 상황을 피할 수 있습니다. BoardMapper.xml 파일은 다음과 같이 작성합니다.(⚠️폴더를 한 번에 생성하지 말고 하나씩 생성해야 하는 점을주의해야 합니다.⚠️)
▶ BoardMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.noel.mapper.BoardMapper">
<select id="getList" resultType="org.noel.domain.BoardVO">
select * from tbl_board order by bno desc
</select>
</mapper>
XML을 작성할 때는 반드시 <mapper>의 namespace 속성값을 Mapper 인터페이스와 동일한 이름을 주는 것에 주의하고, <select> 태그의 id 속성값은 메서드의 이름과 일치하게 작성합니다. resultType 속성의 값은 select 쿼리의 결과를 특정 클래스의 객체로 만들기 위해서 설정합니다. XML에 사용한 CDATA 부분은 XML에서 부등호를 사용하기 위해서 사용합니다.
XML에 SQL문이 처리되었으니 BoardMapper 인터페이스에 SQL은 제거합니다.
▶ org.noel.mapper.BoardMapper 인터페이스
public interface BoardMapper {
// @Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
}
'Back-end > Spring Web Project' 카테고리의 다른 글
[Spring Web Project] 스프링 MVC 프로젝트의 기본 구성(2) - 테이블 생성 (0) | 2023.11.27 |
---|---|
[Spring] 스프링 MVC 프로젝트의 기본 구성(1) (0) | 2023.11.24 |
[Spring Web Project] 스프링 MVC의 Controller(4) - Controller의 예외 처리 (0) | 2023.11.24 |
[Spring Web Project] 스프링 MVC의 Controller(3) - 파일 업로드 처리 (0) | 2023.11.24 |
[Spring Web Project] 스프링 MVC의 Controller(2) - Controller의 리턴 타입 (1) | 2023.11.21 |