글 상세 보기 페이지에서 댓글 달기 버튼을 클릭하면 모달창이 뜨고
ajax를 이용해서 다른 사람이 작성한 글에 댓글을 달 수 있다.
✂️본인 글에서는 수정/삭제만 가능하고 댓글 작성은 할 수 없다.
✂️게시글을 다른 사람이 작성한 경우 댓글을 작성할 수 있다.
비동기 통신 방식으로 특정 부분만 서버랑 통신한다.
댓글 달기나 아이디 중복 체크 등 일부 응답이 필요한 경우에 사용하기 때문에 꼭 필요한 기능이다.
💡pom.xml
에 json 사용을 위해 라이브러리를 추가한다.
<!-- JSON.stringify(문자열 json타입 변경) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
private String replyer;
private String title;
private String replyContent;
private int replyGroup;
private Timestamp replyDate;
replyGroup
은 몇번 게시글에 대한 댓글인지 같은 글 번호를 그룹으로 묶는다.(원글삭제시 참조하는 replyGroup
도 삭제된다.)<body onload="replyData()">
<div id="modal_wrap">
<!-- 모달 추가 -->
<div id="first">
<div style="width: 250px; margin: 0 auto; padding-top: 20px;">
<form id="frm">
<input type="hidden" name="write_num"
value="${detailWriteData.writeNum}"> <b>댓글달기</b>
<hr>
<b>작성자 : ${successUser}</b>
<hr>
<b>제목</b><br> <input type="text" id="title" size="30"
name="title">
<hr>
<b>내용</b><br>
<textarea name="replyContent" id="content" rows="9" cols="30"></textarea>
<hr>
<button type="button"
style="background: white; border-radius: 4px; border-color: white; height: 30px;"
onclick="reply()">댓글달기</button>
<button type="button"
style="background: white; border-radius: 4px; border-color: white; height: 30px;"
onclick="slide_hide()">취소</button>
</form>
</div>
</div>
</div>
name
으로 데이터를 보내며 댓글을 달거나 취소할 수 있는 버튼이 있다.<body>
로 replyData()
함수를 호출한다. onload
를 써야 댓글을 달았을 때 글이 바로 뜬다.@RestController
@RequestMapping("board")
public class boardReplyController implements loginSessionName {
@Autowired boardService bs;
@PostMapping(value="addReply", produces = "application/json; charset=utf-8")
public String addReply(@RequestBody Map<String, Object> map, HttpSession session){
boardReplyDTO dto = new boardReplyDTO();
dto.setReplyer( (String)session.getAttribute(LOGIN) );
dto.setReplyGroup( Integer.parseInt((String)map.get("write_num")) ); //원글에 대한 그룹번호를 원글번호와 맞추자
dto.setTitle((String)map.get("title"));
dto.setReplyContent((String)map.get("replyContent"));
return bs.addReply(dto);
}
@RestController
는 jsp가 아니라 데이터를 리턴으로 돌려준다.requestbody
로 json을 받아주고 map
에 키/값, 세션을 가져온다.public String addReply(boardReplyDTO dto);
public String addReply(boardReplyDTO dto) {
int result = mapper.addReply(dto);//매퍼로 넘기기
String msg= null;
if(result==1) {
msg = "{\"result\" : true}";
}else {
msg = "{\"result\" : false}";
}
return msg;
}
public int addReply(boardReplyDTO dto);
<insert id="addReply">
insert into
talk_board_reply(replyer,title,reply_content,reply_group)
values(#{replyer},#{title},#{replyContent},#{replyGroup})
</insert>
insert
로 쿼리문을 작성한다. <script type="text/javascript">
function replyData(){
$.ajax({
url : "replyData/" + ${detailWriteData.writeNum},
type : "GET",
dataType : "json",
success : function(reply){
let html = "";
reply.forEach(function(data){
let date = new Date(data.replyDate);
let replyDate = date.getFullYear()+"년 "+(date.getMonth()+1)+"월 ";
replyDate += date.getDate()+"일 "+date.getHours()+"시 "
replyDate += date.getMinutes()+"분 "+date.getSeconds()+"초 "
html += "<div align='left'><b>작성자</b> | "+data.replyer+"<br>"
html += "<b>작성일</b> | "+replyDate+"<br>"
html += "<b>제목</b> | "+data.title+"<br>"
html += "<b>내용</b> | "+data.replyContent+"<hr></div>"
})
$("#replyGet").html(html);
},
error : function(){
alert('댓글을 가져올 수 없습니다');
}
})
}
</script>
<body>
로 호출한 코드를 실행하고 db로부터 댓글을 가져온다. $
는 제이쿼리 문법으로 url
는 컨트롤러 경로를 의미하고,type
을 get방식으로 댓글을 가져온다.dataType
은 jsonfunction(reply)
함수를 실행해 작성자, 작성일, 제목, 내용 순으로 forEach
를 사용해 댓글을 추가한다.//댓글 가져오기
@GetMapping(value="replyData/{replyGroup}", produces="application/json;charset=utf-8")
public List<boardReplyDTO> replyData(@PathVariable int replyGroup) {
return bs.getReplyList(replyGroup);
}
list
형식으로 데이터를 글 번호 그룹별로 가져오고 service로 보낸다.public List<boardReplyDTO> getReplyList( int replyGroup);
public List<boardReplyDTO> getReplyList( int replyGroup){
return mapper.getReplyList(replyGroup);
}
public List<boardReplyDTO> getReplyList( int replyGroup);
<resultMap id="replyGet" type="com.care.board.board.dto.boardReplyDTO">
<result property="replyer" column="replyer" />
<result property="title" column="title" />
<result property="replyContent" column="reply_content" />
<result property="replyGroup" column="reply_group" />
<result property="replyDate" column="reply_date" />
</resultMap>
<!-- 댓글 가져오기 -->
<select id="getReplyList" resultMap="replyGet">
select * from talk_board_reply where reply_group=#{replyGroup} order by reply_date desc
</select>
댓글을 가져오기 위해 dto와 sql을 연결하는 매핑 작업을 한다.
댓글 그룹을 작성일을 내림차순으로 가져온다.