본문 바로가기
Spring공부/1-REST

REST방식(6)-Ajax댓글처리

by 으노으뇨 2021. 10. 7.
728x90
반응형
SMALL

Ajax호출을 가정하고 웹페이지에서 사용하는 댓글 기능을 작성해 보겠다.

DB 상에서 댓글은 전형적인 1:N 관계로 구성하고있다. 하나의 게시물에 여러 개의 댓글을 추가하는 형태로 구성하고, 화면은 조회 화면상에서 별도의 화면 이동 없이 처리해야 하기때문에 Ajax를 이용해서 호출하겠다.

댓글을 추가하기 위해서 댓글 주고에 맞는 테이블을 설계해야 한다. 댓글 테이블은   tbl_reply라는 이름으 ㅣ테이블로 지정해서 생성한다.

댓글 자체는 단독으로 CRUD가 가능하므로, 별도의 pk를 부여고 외래키FK설정을 통해 tbl_board 테이블을 참조하도록 해야한다.

댓글을 위한 RelyVO 클래스의 추가

tbl_reply 테이블을 참고해서 org.study.domain 패키지 아래 RelyVO 클래스를 추가한다.

package org.study.domain;

import java.util.Date;

import lombok.Data;

@Data
public class ReplyVO {

	private Long rno;
	private Long bno;

	private String reply;
	private String replyer;
	private Date replyDate;
	private Date updateDate;

}

ReplyMapper 클래스와 XML처리

org.study.mapper패키지에는 ReplyMapper 인터페이스를 처리하고, XML 파일 역시 생성한다.

ReplyMapper 인터페이스 생성

 

ReplyMapper.xml 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"httpL//mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.study.mapper.ReplyMapper">

</mapper>

그리고 CRUD 작업을 테스트 하기 전에 테이블이 외래키의 관계로 처리되어 있다는 점을 기억해야한다.

댓글과 게시글 테이블이 bno값과 정확히 일치해야 하므로 테스트 진행하기 전에 최신 bno 몇개를 예제러 확인해보자.

select * from tbl_board where rownum <10 order by bno desc;

정상적으로 나타는것을 볼 수 있다.

ReplyMapper 테스트

우선 ReplMapper를 사용가능한지에 대한 테스트 작업을 진행한다. 테스트를 위해 ReplyMapperTests클래스를 생성하고 작성한다.

package org.study.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.SpringRunner;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class ReplyMapperTests {

	@Setter(onMethod_ = @Autowired)
	private ReplyMapper mapper;

	@Test
	public void testMapper() {
		log.info(mapper);
	}
}

testMapper()를 통해 ReplyMapper타입의 객체가 정상적으로 사용이 가능한지 확인한다.


CRUD작업

ReplyMapper를 이용한 CRUD 작업은 단일 테이블에 대한 작업과 유사하므로 등록, 수정, 삭제, 조회 작업을 처리할 수 있다.

ReplyMapper인터페이스를 작성한다.

package org.study.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.study.domain.Criteria;
import org.study.domain.ReplyVO;

public interface ReplyMapper {

	public int insert(ReplyVO vo);

	public ReplyVO read(Long bno);

	public int delete(Long bno);

	public int update(ReplyVO reply);
}

등록, 조회, 삭제, 수정 기능을 추가하였다.

댓글기능을 수행하는  ReplyMapper.xml 파일에 CRUD 수행문을 추가한다.

	<insert id="insert">

		insert into tbl_reply (rno, bno, reply, replyer)
		values (seq_reply.nextval, #{bno}, #{reply}, #{replyer})

	</insert>

	<select id="read" resultType="org.study.domain.ReplyVO">

		select * from tbl_reply where rno =
		#{rno}

	</select>


	<delete id="delete">

		delete from tbl_reply where rno = #{rno}

	</delete>

	<update id="update">

		update tbl_reply set reply = #{reply},updatedate =
		sysdate
		where rno = #{rno}

	</update>

마지막 JUnit로 테스트 하기위해 Test문을 입혁한다.

package org.study.mapper;

import java.util.List;
import java.util.stream.IntStream;

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.SpringRunner;
import org.study.domain.Criteria;
import org.study.domain.ReplyVO;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class ReplyMapperTests {

	// 테스트 전에 해당 번호의 게시물이 존재하는지 반드시 확인할 것
	private Long[] bnoArr = { 1L, 2L, 3L, 4L, 5L };

	@Setter(onMethod_ = @Autowired)
	private ReplyMapper mapper;

	@Test
	public void testCreate() {

		IntStream.rangeClosed(1, 10).forEach(i -> {

			ReplyVO vo = new ReplyVO();

			// 게시물의 번호
			vo.setBno(bnoArr[i % 5]);
			vo.setReply("댓글 테스트 " + i);
			vo.setReplyer("replyer" + i);
			mapper.insert(vo);
		});
	}

	@Test
	public void testRead() {
		Long targetRno = 5L;
		ReplyVO vo = mapper.read(targetRno);
		log.info(vo);
	}

	@Test
	public void testMapper() {
		log.info(mapper);
	}

	@Test
	public void testDelete() {
		Long targetRno = 1L;
		mapper.delete(targetRno);
	}

	@Test
	public void testUpdate() {
		Long targetRno = 10L;
		ReplyVO vo = mapper.read(targetRno);
		vo.setReply("Update Reply ");
		int count = mapper.update(vo);
		log.info("UPDATE COUNT: " + count);
	}
}

등록

등록테스트는 1~5게시판번호중(실제로 있어야함) 람다식을 이용해서 (보통  For문을 이용해도 된다.) 총 10개의 댓글( 2개씩 5개의 글) 을 남기는 테스트를 하였다.  

결과는 성공적으로 나타나고

오라클에서도 확인해 볼 수가 있다.


조회

테스트코드는 tbl_reply에 있는 번호 중에서 하나를 이용해서 확인하는 식으로 한다.

select * from tbl_reply where rno = 5
select * from tbl_reply where rno = #{rno}


삭제

특정 댓글의 삭제는 댓글의 번호만으로 처리가 가능하도록 하였다.

delete from tbl_reply where rno = 1
delete from tbl_reply where rno = #{rno}

맨위 RNO = 3이 삭제가 된걸 알수가있다.


수정

댓글의 수정은 현재의 tbl_reply 테이블의 구조에서는 댓글의 내용과 최종 수정시간을 수정하도록 하였다.

update tbl_reply set reply = #{reply},updatedate = sysdate where rno = 4
update tbl_reply set reply = #{reply},updatedate = sysdate where rno = #{rno}

RNO 4번이 댓글테스트에서 Update Reply 로 바뀌어있음을 알 수 있다.

테스트를 통해 replymapping 쪽에서 문제가없고 DB와도 연동이 잘되는것을 알 수 있따.

728x90
반응형
LIST

'Spring공부 > 1-REST' 카테고리의 다른 글

REST방식(8)-Ajax  (0) 2021.10.08
REST방식(7)-Ajax댓글처리  (2) 2021.10.07
REST방식(5)  (0) 2021.10.07
REST방식(4)  (0) 2021.10.06
REST방식(3)  (0) 2021.10.06

댓글