본문 바로가기

웹 개발/Spring

[Web_Spring] 16

실습(댓글)

- [Web_Spring] 15 이어서

1. src/main/java/com.example.board/domain/vo/ReplyVO.java​

package com.example.board.domain.vo;

import lombok.Data;
import org.springframework.stereotype.Component;

@Component
@Data
public class ReplyVO {
    private Long replyNumber;
    private Long boardNumber;
    private String replyContent;
    private String replyWriter;
    private String replyRegisterDate;
    private String replyUpdateDate;
}

 

2. src/main/java/com.example.board/mapper/ReplyMapper.java​

package com.example.board.mapper;

import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ReplyMapper {
    //    댓글 등록
    public void insert(ReplyVO replyVO);
    //    댓글 1개 조회
    public ReplyVO select(Long replyNumber);
    //    댓글 삭제
    public void delete(Long replyNumber);
    //    댓글 수정
    public void update(ReplyVO replyVO);
    //    댓글 목록
    public List<ReplyVO> getList(@Param("criteria") Criteria criteria, @Param("boardNumber") Long boardNumber);
    //    댓글 개수
    public int getTotal(Long boardNumber);
}

 

3. src/main/java/com.example.board/domain/dao/ReplyDAO.java​

package com.example.board.domain.dao;

import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import com.example.board.mapper.ReplyMapper;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class ReplyDAO {

    private final ReplyMapper replyMapper;

    //    댓글 등록
    public void register(ReplyVO replyVO){
        replyMapper.insert(replyVO);
    }
    //    댓글 1개 조회
    public ReplyVO read(Long replyNumber){
        return replyMapper.select(replyNumber);
    }
    //    댓글 삭제
    public void remove(Long replyNumber){
        replyMapper.delete(replyNumber);
    }
    //    댓글 수정
    public void modify(ReplyVO replyVO){
        replyMapper.update(replyVO); 
    }
    //    댓글 목록
    public List<ReplyVO> getList(Criteria criteria, Long boardNumber){
        return replyMapper.getList(criteria, boardNumber);
    }
    //    댓글 개수
    public int getTotal(Long boardNumber){
        return replyMapper.getTotal(boardNumber);
    }
}

 

4. src/main/java/com.example.board/domain/vo/Criteria.java​

package com.example.board.domain.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;

@Component
@Data 
//@RequiredArgsConstructor //기본 생성자보다 우선순위가 낮다.
@AllArgsConstructor
public class Criteria {
    private Integer pageNum;
    private Integer amount;
    private String type;
    private String keyword;

    public Criteria() {
        this(1, 10);
    }

    public Criteria(Integer pageNum, Integer amount) {
        this.pageNum = pageNum;
        this.amount = amount;
    }

    public String[] getTypes(){
        return type == null ? new String[]{} : type.split("");
    }

    public String getListLink() {
        UriComponentsBuilder builder = UriComponentsBuilder.fromPath("")
                .queryParam("pageNum", this.pageNum)
                .queryParam("amount", this.amount)
                .queryParam("keyword", this.keyword)
                .queryParam("type", type);

        return builder.toUriString();
    }
}

 

 

5. src/main/java/com.example.board/service/ReplyService.java​

package com.example.board.service;

import com.example.board.domain.dao.ReplyDAO;
import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
 
@Service
@RequiredArgsConstructor
public class ReplyService {

    private final ReplyDAO replyDAO;

    //    댓글 등록
    public void register(ReplyVO replyVO){
        replyDAO.register(replyVO);
    }
    //    댓글 1개 조회
    public ReplyVO read(Long replyNumber){
        return replyDAO.read(replyNumber);
    }
    //    댓글 삭제
    public void remove(Long replyNumber){
        replyDAO.remove(replyNumber);
    }
    //    댓글 수정
    public void modify(ReplyVO replyVO){
        replyDAO.modify(replyVO);
    }
    //    댓글 목록
    public List<ReplyVO> getList(Criteria criteria, Long boardNumber){
        return replyDAO.getList(criteria, boardNumber);
    }
    //    댓글 개수
    public int getTotal(Long boardNumber){
        return replyDAO.getTotal(boardNumber);
    }
}

 

 

 

6. src/main/resource/mapper/ReplyMapper.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.example.board.mapper.ReplyMapper">
    <insert id="insert">
        INSERT INTO TBL_REPLY (REPLY_NUMBER, BOARD_NUMBER, REPLY_CONTENT, REPLY_WRITER)
        VALUES(SEQ_REPLY.NEXTVAL, #{boardNumber}, #{replyContent}, #{replyWriter})
    </insert>

    <select id="select" resultType="replyVO">
        SELECT REPLY_NUMBER, BOARD_NUMBER, REPLY_CONTENT, REPLY_WRITER, REPLY_REGISTER_DATE, REPLY_UPDATE_DATE
        FROM TBL_REPLY WHERE REPLY_NUMBER = #{replyNumber}
    </select> 

    <delete id="delete">
        DELETE FROM TBL_REPLY WHERE REPLY_NUMBER = #{replyNumber}
    </delete>

    <update id="update">
        UPDATE TBL_REPLY
        SET REPLY_CONTENT = #{replyContent}, REPLY_UPDATE_DATE = SYSDATE
        WHERE REPLY_NUMBER = #{replyNumber}
    </update>

    <select id="getList" resultType="replyVO">
        <![CDATA[
        SELECT REPLY_NUMBER, BOARD_NUMBER, REPLY_CONTENT, REPLY_WRITER, REPLY_REGISTER_DATE, REPLY_UPDATE_DATE
        FROM
        (
            SELECT /*+ INDEX_DESC(TBL_REPLY PK_REPLY) */
            ROWNUM RN, REPLY_NUMBER, BOARD_NUMBER, REPLY_CONTENT, REPLY_WRITER, REPLY_REGISTER_DATE, REPLY_UPDATE_DATE
            FROM TBL_REPLY WHERE BOARD_NUMBER = #{boardNumber} AND ROWNUM <= #{criteria.pageNum} * #{criteria.amount}
        )
        WHERE RN > (#{criteria.pageNum} - 1) * #{criteria.amount}
        ]]>
    </select>

    <select id="getTotal" resultType="_int">
        SELECT COUNT(REPLY_NUMBER) FROM TBL_REPLY WHERE BOARD_NUMBER = #{boardNumber}
    </select>
</mapper>

 

 

 

 

'웹 개발 > Spring' 카테고리의 다른 글

[Web_Spring] 18  (0) 2022.06.30
[Web_Spring] 17  (0) 2022.06.29
[Web_Spring] 15  (0) 2022.06.27
[Web_Spring] 14  (0) 2022.06.26
[Web_Spring] 13  (0) 2022.06.25