Skip to the content.

REST 방식을 가장 많이 사용하는 형태는 역시 브라우저나 모바일 App 등에서 Ajax를 이용해서 호출하는 것이다.

여기서는 Ajax의 호출을 가정하고 웹페이지에서 사용하는 댓글 기능을 만들어 보겠다.

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

프로젝트의 구성

REST 처리를 위해서는 pom.xml에서 수정된 내용이 대부분이고 src/main/java 폴더 아래 모든 Java 코드를 그대로 복사해서 사용하도록 한다.

srv/main/resources 에서 log4jdbc-log4j2를 이용하기 위해서 log4jdbc.log4j2.properties 파일을 반드시 추가해야 한다.

또한 MyBatis에서 이용할 XML 파일들 역시 추가한다.

프로젝트는 오라클을 이용하므로 프로젝트의 설정을 통해서 JDBC 드라이버가 프로젝트 경로에 포함되도록 설정해 준다.

댓글 처리를 위한 영속 영역

댓글을 처리하기 위해서 댓글 구조에 맞는 테이블을 설계한다.댓글 테이블은 tbl_reply라는 이름의 테이블로 지정해서 생성한다.

create table tbl_reply (
    rno number(10,0),
    bno number(10,0) not null,
    reply varchar2(1000) not null,
    replyer varchar2(50) not null,
    replyDate date default sysdate,
    updateDate date default sysdate
);

create sequence seq_reply;

alter table tbl_reply add constraint pk_reply primary key (rno);

alter table tbl_reply add constraint fk_reply_board
foreign key (bno) references tbl_board (bno);

tbl_reply 테이블은 bno라는 칼럼을 이용해서 해당 댓글이 어떤  게시물의 댓글인지를 명시하도록 한다.

댓글 자체는 단독으로 CRUD가 가능하므로 별도의 pk를 부여하도록 하고 외래키(fk) 설정을 통해서

tbl_board 테이블을 참조하도록 설정한다.

ReplyVO 클래스의 추가

tlb_reply 테이블을 참고해서 con.osk2090.domain 패키지 아래 ReplyVO 클래스를 추가한다.

ReplyVO.class

package com.osk2090.domain;

import lombok.Data;

import java.util.Date;

@Data
public class ReplyVO {
    private Long rno;
    private Long bno;

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

ReplyMapper 클래스와 XML 처리

com.osk2090.mapper 패키지에는 ReplyMapper 인터페이스를 처리하고 XML 파일 역시 생성해 준다.

package com.osk2090.mapper;

public interface ReplyMapper {
    
}

댓글에 대한 처리 역시 화면상에서 페이지 처리가 필요할 수 있으므로 Criteria를 이용해서 처리하도록 한다.

실제 SQL은 src/main/resoureces 폴더 아래 ReplyMapper.xml 파일을 작성해서 처리한다.

XML에서는 tbl_reply 테이블에 필요한 SQL을 작성한다.페이징 처리에서는 조금 더 신경 써야 하는 내용이 있으므로 우선은 특정 게시물 번호(bno)에 해당하는 모든 댓글을 가져오는 형태로 작성한다.

XML을 작성할 때에는 항상 namespace에 주의해서 작성한다.

<?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.osk2090.mapper.ReplyMapper">

</mapper>

CRUD 작업을 테스트하기 전에 tbl_reply 테이블이 tbl_board 테이블과 fk(외래키)의 관계로 처리되어 있다는 점을 기억해야만 한다.

tlb_reply가 tbl_board 테이블의 bno 값과 정확히 일치해야 하므로 테스트를 진행하기 전에 최신 bno 번호 몇 개를 확인해 두도록 한다.

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