Helmi

게시판 프로젝트 - CRUD 구현 ② 영속 영역 CRUD 구현, INSERT 본문

SpringBoot

게시판 프로젝트 - CRUD 구현 ② 영속 영역 CRUD 구현, INSERT

Helmi 2023. 4. 28. 10:37

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

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

MyBatis는 내부적으로 JDBC의 PreparedStatement 활용하고 필요한 파라미터 처리하는 '?'에 대한 치환 '#{속성}' 이용해 처리

 

1. create(insert) 처리

자동으로 PK값 정해지는 경우 다음과 같은 2가지 방식으로 처리 가능

1) insert만 처리되고 생성된 PK값 알 필요 없는 경우

2) insert문 실행되고 생성된 PK값 알아야 하는 경우

 

com.board.mapper.BoardMapper.java 인터페이스 일부

package com.board.mapper;

import java.util.List;

import com.board.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 ="com.board.mapper.BoardMapper">
	
	<select id ="getList" resultType="com.board.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 (#{bno}, #{title}, #{content}, #{writer})
	</insert>
	
	</mapper>

BoardMapper의 insert()는 단순히 시퀀스의 다음 값 구해서 insert 할 때 사용

insert문은 몇 건의 데이터가 변경되었는지만 알려줌 - 추가된 데이터의 PK값 알 수 없으나 1번의 SQL 처리만으로 작업 완료되는 장점이 있음.

 

insertSelectKey()는 @SelectKey라는 MyBatis의 어노테이션 이용

@SelectKey는 주로 PK값 미리(before) SQL 통해 처리해두고 특정 이름으로 결과 보관하는 방식

@Insert 할 때 SQL문 보면 #{bno} 같이 이미 처리된 결과 이용하는 것 볼 수 있음

 

BoardMapperTests.class 일부

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

테스트 코드의 마지막에 log.info(board) 작성한 이유는 Lombok이 만들어주는 toString() 이용해 bno 멤버 변수(인스턴스 변수) 값 알아보기 위함.

콘솔 - 실행결과

 

@SelectKey 테스트 코드

@Test
	public void testInsertSelectKey() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는 글 select key");
		board.setContent("새로 작성하는 내용 select key");
		board.setWriter("newbie");

		mapper.insertSelectKey(board);
		
		log.info(board);
	}

 

@SelectKey 이용하는 방식은 SQL을 한 번 더 실행하는 부담이 있으나 자동으로 추가되는 PK 값을 확인해야 하는 상황에서는 유용하게 사용 가능

콘솔 - 실행결과