기억보다 기록을

[Spring] 웹 프로젝트 구현(4) 테이블 생성,더미데이터 추가,영속계층 crud 구현 본문

Development/Spring

[Spring] 웹 프로젝트 구현(4) 테이블 생성,더미데이터 추가,영속계층 crud 구현

juyeong 2022. 2. 24. 12:30
반응형

기본적인 게시판 테이블 sql을 적어주시고요, 더미데이터 추가해줍니다. 

(오라클 커밋 잊지마세요)

create sequence seq_board;

create table tbl_board (
bno number(10,0),
title VARCHAR2(200) not null,
content VARCHAR2(2000) not null,
writer VARCHAR2(50) not null,
regdate DATE default sysdate,
updatedate date default sysdate
);

alter table tbl_board add constraint pk_board
primary key(bno);

insert into tbl_board(bno,title,content,writer) VALUES (seq_board.nextval, '제목 테스트', '내용 테스트','user00');

잘 들어왔는지 select 해봅니다.

 

그럼 sts로 넘어와서 myBatis 를 이용하여 테스트해볼게요

인터페이스 하나 생성해주시고, List로 값을 가져올게요

package com.sample.mapper;

import java.util.List;

import com.sample.domain.BoardVO;

public interface BoardMapper {
	
	List<BoardVO> getList();

}

xml 작성해주세요. resultType은 Alias로 간단하게 적을 수 있지만 여기서는 풀패키지 경로를 적어주었습니다.

  <mapper namespace="com.sample.mapper.BoardMapper">
  <select id="getList" resultType="com.sample.domain.BoardVO">
  select * from tbl_board order by bno desc
  </select>

junit 돌려볼게요. 잘 됩니다. 

 

이제 crud를 간단하게 구현해 볼게요

 

create 입니다.

insert를 할 때 select와 selectkey중 선택할 수 있는데,

selectkey의 경우 생성된 pk값을 알아야할 때 좋습니다.

다만 키를 가져오고 그 다음에 sql이 한번 더 실행되기 때문에

두번 동작하는 꼴이고, 한번만 동작하는 select에 비해서 

성능은 느립니다. 코드로 비교하면 다음과 같습니다.

 

package com.sample.mapper;

import java.util.List;

import com.sample.domain.BoardVO;

public interface BoardMapper {
	
	List<BoardVO> getList();

	void insert(BoardVO board);
	
	void insertSelectKey(BoardVO board);
	
}

위에서 말한 두번 동작한다는게 요 xml보면 아시겠쥬 

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


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

 

테스트 돌려서 잘 인서트 됐는지 확인해주세요

	@Test
	public void testInsert() {
		BoardVO vo= new BoardVO();
		vo.setTitle("title 테스트");
		vo.setContent("content 테스트");
		vo.setWriter("writer 테스트");
		
		boardMapper.insert(vo);
		
	}
	
	@Test
	public void insertSelectKey() {
		
		BoardVO vo= new BoardVO();
		vo.setTitle("selectkey title 테스트");
		vo.setContent("selectkey content 테스트");
		vo.setWriter("selectkey writer 테스트");
		
		boardMapper.insertSelectKey(vo);
	}

 

read는 pk값을 가지고 불러오면 되겠쥬

리턴타입을 select에서는 void로 줬지만

여기선 boardVO 타입으로 주면 되겠습니다.

파리미터에는 pk값을 적어주시고요

xml은 select로 적어주세요.

마찬가지로 테스트합니다.

 

package com.sample.mapper;

import java.util.List;

import com.sample.domain.BoardVO;

public interface BoardMapper {
	
	List<BoardVO> getList();

	void insert(BoardVO board);
	
	void insertSelectKey(BoardVO board);
	
	BoardVO read(Long bno); 
}
	<select id="read" resultType="com.sample.domain.BoardVO">
		select * from tbl_board where bno=#{bno}
	</select>
	@Test
	public void testRead() {
		BoardVO vo = boardMapper.read(11L);
		log.info(vo);
	}

 

db의 11번 데이터를 테스트했습니다.

 

이제 delete, update 해볼게요. 둘 다 int 타입으로 리턴받는게 좋습니다.

몇번을 삭제했고 수정했는지 개발자가 알고싶은 경우가 많기 때문입니다. update의 경우 여러개를 던져야하기 때문에 파라미터는 boardVO로 써주겠습니다.

	int delete(Long bno);

	int update(BoardVO board);
	<delete id="delete">
		delete from tbl_board where bno=#{bno}
	</delete>

	<update id="update">
	update tbl_board
	set title=#{title},
	content=#{content},
	writer=#{writer},
	updatedate = sysdate
	where bno= #{bno}
	</update>
	@Test
	public void testDelete() {
		int count = boardMapper.delete(1L);
		log.info("count:::"+count);
		
	}
	
	@Test
	public void testUpdate() {
		BoardVO vo= new BoardVO();
		vo.setBno(11L);
		vo.setTitle("title Update 테스트");
		vo.setContent("content Update 테스트");
		vo.setWriter(" writer Update 테스트");
		
		log.info("Count: "+boardMapper.update(vo));
	}
}

아까 insert한 11번 데이터를 update해주었습니다. 

잘 되었습니다.

 

이렇게 persistence 계층의 crud를 진행해봤고요, 다음 5편에서는 

서비스 계층을 구현할게요!

반응형