본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch08 영속/비즈니스 계층의 CRUD 구현 2(create, read, update, delete)

728x90
반응형

https://bobo12.tistory.com/297

 

2. 영속 영역의 CRUD 구현

   ▷ 웹 프로젝트 구조에서 마지막 영역이 영속 영역이지만, 실제로 구현을 가장 먼저 할 수 있는 영역도 영속 영역

   ▷ 기본적으로 CRUD 작업 하기 때문에 테이블과 VO(DTO) 등 약간의 준비만으로도 비즈니스 로직과 무관하게 CRUD 작업 가능

 

(1) Create(insert) 처리

   ▷ tbl_board 테이블은 PK 칼럼으로 bno 이용, 시퀀스를 이용해 자동 데이터 추가시 번호가 만들어지는 방식 사용

   ▷ 자동으로 데이터가 추가될 때 번호가 만들어지는 방식 사용

      ▶ insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우

      ▶ insert문이 실행되고 생성된 PK 값을 알아야 하는 경우

 

 

◎ BoardMapper 인터페이스에 메서드 추가

package org.codehows.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;
import org.codehows.domain.BoardVO;

public interface BoardMapper {
	// @Select("select * from tbl_board where bno > 0")
	public List<BoardVO> getList();
	
	public void insert(BoardVO board);
	
	public void insertSelectKey(BoardVO board);
}

 

◎ 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.codehows.mapper.BoardMapper">

<select id="getList" resultType="org.codehows.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>

<!-- 내용 추가 -->

<insert id="insert">
	insert into tbl_board(bno, title, content, writer)
	values (seq_board.nextval, #{title}, #{content}, #{writer})
</insert>

<insert id="insertSelectKey">
	<selectKey keyProperty="bno" order="BEFORE" resultType="long">
		select seq_board.nextval from dual
	</selectKey>
	
	insert into tbl_board(bno, title, content, writer)
	values (seq_board.nextval, #{title}, #{content}, #{writer})
</insert>

</mapper>


insertSelectKey()는 @SelectKey 라는 MyBatis의 어노테이션 이용
@SelectKey는 주로 PK 값을 미리 SQL을 통해 처리해 두고 특정한 이름으로 결과를 보관하는 방식

 

◎ BoardMapperTests 클래스에 내용 추가

...(생략)...
	@Test
	public void testInsert() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는 글");
		board.setContent("새로 작성하는 내용");
		board.setWriter("newbie");
		
		mapper.insert(board);
		
		log.info(board);
	}
}

 


실행해보면 select문이 먼저 실행되고 생성된 결과를 이용해 bno으로 값을 처리합니다.

 

 

(2) read(select) 처리

   ▷ insert가 된 데이터를 조회하는 작업은 PK를 이용해 처리하므로 BoardMapper의 파라미터 역시 BoardVO 클래스 bno 타입 정보를 이용해서 처리

 

◎ BoardMapper 인터페이스에 내용 추가

...(생략)...
	public BoardVO read(Long bno);
}

 

◎ BoardMapper.xml에 select문 추가

...(생략)...
<select id="read" resultType="org.codehows.domain.BoardVO">
	select * from tbl_board where bno = #{bno}
</select>
</mapper>


MyBatis는 Mapper 인터페이스의 리턴 타입에 맞게 select의 결과를 처리함

bno 칼럼이 존재하면 인스턴스 'setBno()' 호출

MyBatis 모든 파라미터와 리턴 타입의 처리는 get 파라미터명(), set 칼럼명()의 규칙으로 호출 됨

위와 같이 속성이 한 개만 존재한는 경우에는 별도의 get 파라미터명() 사용하지 않고 처리 됨

 

 

◎ BoardMapperTests 클래스 내용 추가

...(생략)...
	@Test
	public void testRead() {
		// 존재하는 게시물 번호로 테스트
		BoardVO board = mapper.read(5L);
		
		log.info(board);
	}
}


테스트 코드의 결과는 아래와 같이 나타납니다.

 

 

(3) delete 처리

   ▷ 특정한 데이터를 삭제하는 작업 역시 PK 값을 이용해서 처리하므로 조회하는 작업과 유사하게 처리

   ▷ 등록, 삭제, 수정 같은 DML은 '몇 건의 데이터가 삭제(혹은 수정)되었는지' 반환할 수 있음

 

◎ BoardMapper 인터페이스 내용 추가

...(생략)...
	public int delete(Long bno);
}

 

◎ BoardMapper.xml 내용 추가

...(생략)...
<delete id="delete">
	delete from tbl_board where bno = #{bno}
</delete>
</mapper>

 

 

◎ BoardMapperTests 클래스 내용 추가

...(생략)...
	@Test
	public void testDelete() {
		log.info("DELETE COUNT: " + mapper.delete(3L));
	}
}


testDelete()의 경우 3번 데이터가 존재했다면 아래와 같은 로그가 기록됩니다.


 

 

(4) update 처리

   ▷ 테이블의 내용 수정

 

◎ BoardMapper 인터페이스 내용 수정

...(생략)...
	public int update(BoardVO board);
}

 

◎ BoardMapper.xml 내용 수정

...(생략)...
<update id="update">
	update tbl_board
	set title=#{title},
	content=#{content},
	writer=#{writer},
	updateDate=sysdate
	where bno = #{bno}
</update>
</mapper>

 

◎ BoardMapperTests 클래스 내용 수정

...(생략)...
	@Test
	public void testUpdate() {
		BoardVO board = new BoardVO();
		// 실행 전 존재하는 번호인지 확인할 것
		board.setBno(5L);
		board.setTitle("수정된 제목");
		board.setContent("수정된 내용");
		board.setWriter("user00");
		
		int count = mapper.update(board);
		log.info("UPDATE COUNT: " + count);
	}
}


5번 글이 존재하면 아래와 같은 로그들이 출력됩니다.

 

데이터베이스를 이용한 CRUD를 클래스와 인터페이스에 코드를 추가하면서 예제를 실행해보았습니다. 

 

인터페이스를 통해 메소드를 생성하고 xml 파일에 SQL 구문을 넣고 Test 클래스를 통해 내용을 수정하거나 값들을 콘솔창에 출력합니다.!

 

insert, read, update, delete를 이때까지와는 조금 다른 방법으로 사용하네요!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형