ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring_댓글등록_댓글리스트조회
    Spring 2022. 6. 14. 02:31

    <댓글등록>

     

    1)boardDetailView.jsp

    <head>
    <style>
    	.replyTable{margin:auto; width: 500px;}
    </style>
    </head>
    <body>
    	<table class="replyTable">
        	<tr>
            	<td><textarea row="3" cols="55" id="replyContent"></textarea></td>
                <td><button id="rSubmit">등록하기</button></td>
            </tr>
        </table>
        
        <table class="replyTable" id="rtb">
        	<thead>
            	<tr>
                	<td colspan="2"><b id="rCount"></b></td>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
        
        <script>
        	//댓글등록
        	$('#rSubmit').click(function(){
            	var rContent = $('#replyContent').val();
                var refBId = ${board.boardId};
                
                $.ajax({
                	url: 'addReply.bo',
                    data: {replyContent:rContent, refBoardId:refBId},
                    success: function(data){
                    	console.log(data);
                        if(data == 'success'){
                        	$('#replyContent').val('');//데이터 전송 후 입력창은 비워준다.
                        }
                	},
                    error: function(data){
                    	console.log(data);
                    }
                });
            });
        	//리스트조회
        	function getReplyList(){
            	$.ajax({
                	url: 'rList.bo',
                	data: {bId:${board.boardId}},
                	success: function(data){
                    	console.log(data);
                        
                        $tableBody = $('#rtb tbody');
                        $tableBody.html('');
                        
                        var $tr;
                        var $writer;
                        var $content;
                        var $date;
                        
                        $('#rCount').text('댓글('+ data.length + ')');
                        
                        if(data.length > 0){
                        	for(var i in data){
                            	$tr = $('<tr>')
                            	$writer = $('<td>').css('width', '100px').text(data[i].nickName)
                            	$content = $('<td>').text(data[i].replyContent);
                            	$date = $('<td width="100px">').text(data[i].replyCreateDate);
                                
                                $tr.append($writer);
                                $tr.append($content);
                                $tr.append($date);
                                $tableBody.append($tr);
                            }
                        } else {
                        	$tr = $('<tr>');
                            $content = $('<td colspan="3">').text('등록된 댓글이 없습니다.');
                            
                            $tr.append($content);
                            $tableBody.append($tr);
                        }
                    },
                    error: function(data){
                    	console.log(data);
                    }
                });
            }
            //다른 사용자가 댓글을 쓸 수 있어서 5000(5초)
            $(function(){
            	getReplyList();
                
                setInterval(function(){
                	getReplyList();
                }, 5000);
            });
        </script>
    </body>

    setInterval()를 사용하여 일정한 시간간격(5000(5초))을 두고 펑션함수를 실행시킨다.

     

    2) BoardControllelr(댓글 insert)

    @RequestMapping("addReply.bo")
    @ResponseBody
    public String addReply(@ModelAttribute Reply r, HttpSession session) {
    	//Model 또는 session을 통해 댓글을 누가 썼는지 알아야하기때문에 id도 알아야한다.
        String id = ((Member)session.getAttribute("logUser")).getId();
        r.setReplyWriter(id);
        
        int result = bService.insertReply(r);
        
        if(result > 0){
        	return "success";
        } else {
        	throw new BoardException("댓글 등록에 실패하였습니다.");
        }
    }

    댓글 저장에 성공했으면 "success" 반환, 실패했으면 에러 발생 : 댓글 등록에 실패하였습니다.

    view에서 success를 반환받으면 댓글 등록 창에 적은 댓글은 지우기

     

    **반환을 String으로 success로 보내기때문에 뷰리졸버가 success라는 jsp에 넘길 수 있으니 @ResponseBody를 추가해서 데이터를 넘기고 있다고 알려준다.

     

    3) BoardService(interFace)

    public interface BoardService {
    	int insertReply(Reply r);
    }

     

    4) BoardServiceImpl

    @Service("bService")
    public class BoardServiceImpl implements BoardService{
    	@Override
        public int insertReply(Reply r) {
        	return bDAO.insertReply(sqlSession, r);
        }
    }

     

    5) BoardDAO

    @Repository("bDAO")
    public class BoardDAO {
    	public int insertReply(SqlSessionTemplate sqlSession, Reply r) {
        	return sqlSession.update("boardMapper.insertReply", r);
        }
    }

     

    6) board-mapper

    <mapper namespace="boardMapper">
    	<insert id="insertReply">
        	insert into reply
            values(seq_rid.nextval, #{replyContent}, #{refBoardId}, #{replyWriter}, sysdate, sysdate, default)
        </insert>
    </mapper>

    댓글 등록쿼리를 작성한다.


    <댓글리스트조회>

     

    1) 위와 동일

     

    2-방법1) BoardControllelr-gson사용

    @RequestMapping("rList.bo")
    public void getReplyList(@RequestParam("bId") int bId, HttpServletResponse response) {
    	ArrayList<Reply> list = bService.selectReplyList(bId);
    	
        response.setContentType("application/json; charset=UTF-8");
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create
        try{
        	gson.toJson(list, response.getWriter());
        } catch (IOException e){
        	e.printStackTrace();
        }
    }

    setContentType를 통해 인코딩을 진행한다.

    gson.toJson을 통해 list를 넘겨준다. + setDateFormat("yyyy-MM-dd")를 사용하여 날짜 세팅 지정!

     

    2-방법2) BoardControllelr-JSON사용

    @RequestMapping(value="rList.bo", produces="application/json; charset=UTF-8")
    @ResponseBody
    public String getReplyList(@RequestParam("bId") int bId) {
    	JSONArry jArr = new JSONArray();
        for(Reply r : list) {
        	JSONObject job = new JSONObject();
            job.put("replyId", r.getRefBoardId());
            job.put("replyContent", r.getReplyContent());
            job.put("replyWriter", r.getReplyWriter());
            job.put("nickName", r.getNickName());
            job.put("refBoardId", r.getRefBoardId());
            job.put("replyCreateDate", r.getReplyCreateDate());
            job.put("replyModifyDate", r.getReplyModifyDate());
            job.put("replyStatus", r.getReplyStatus());
            
            jArr.put(job);
        }
        
        return jArr.toString();
    }

    @ResponseBody : View Resolver에게 뷰에 대한 경로를 넘기지 않고 데이터로 담아서 보낼 수 있다.

    -->리턴이 스트링이기 때문에 @ResponseBody를 사용해준다.

    value="rList.bo", produces="application/json; charset=UTF-8"

    JSONObject() : 댓글 담기

    JSONArray() : JSONObject();를 담을 수 있다.-->여러개를 가져올거기 때문에 JSONArray를 사용한다.

    제이슨 사용시 라이브러리 추가해줘야한다.(pom.xml파일에)

     

    3) BoardService(interface)

    public interface BoardService {
    	ArrayList<Reply> selectReplyList(int bId);
    }

     

    4) BoardServiceImpl

    @Service("bService")
    public class BoardServiceImpl implements BoardService{
    	
        @Override
        public ArrayList<Reply> selectReplyList(int bId) {
        	return bDAO.selectReplyList(sqlSession, bId);
        }
    }

     

    5) BoardDAO

    @Repository("bDAO")
    public class BoardDAO {
    	
        public ArrayList<Reply> selectReplyList(sqlSessionTemplate sqlSession, int bId) {
        	return (ArrayList)sqlSession.selectList("boardMapper.selectReplyList", bId);
    	}
    }

     

    6) board-mapper

    <select id="selectReplyList" resultMap="replyResultSet">
    	select *
        from reply
        	join member on (reply_writer = id)
        where ref_board_id=#{bId} and reply_status = 'Y'
        order by reply_id desc
    </select>
     <resultMap type="Reply" id="replyResultSet">
          <id property="replyId" column="REPLY_ID"/>
          <result property="replyContent" column="REPLY_CONTENT"/>
          <result property="refBoardId" column="REF_BOARD_ID"/>
          <result property="replyWriter" column="REPLY_WRITER"/>
          <result property="nickName" column="NICKNAME"/>
          <result property="replyCreateDate" column="REPLY_CREATE_DATE"/>
          <result property="replyModifyDate" column="REPLY_MODIFY_DATE"/>
          <result property="replyStatus" column="REPLY_STATUS"/>
    </resultMap>

    닉네임을 가져와야하기때문에 member와 조인해준다!

     

    7) mybatis-config.xml

    <typeAliases>
    		<typeAlias type="com.ioi.spring.board.model.vo.Reply" alias="Reply"/>
    </typeAliases>

    mapper에서 resultMap에 type="Reply"를 사용하려면 mtbatis-config에서 선언해줘야한다.

Designed by Tistory.