detail.jsp 에서 댓글 작성 부분 수정.
<div class="card">
<form>
<input type="hidden" id="boardId" value="${board.id }">
<div class="card-body">
<textarea id="reply-content" class="form-control" rows="2"></textarea>
</div>
<div class="card-footer">
<button type="button" id="btn-reply-save" class="btn btn-primary">등록</button>
</div>
</form>
</div>
BoardService에 댓글쓰기 메서드 추가
package com.pure.blog.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.pure.blog.model.Board;
import com.pure.blog.model.Reply;
import com.pure.blog.model.User;
import com.pure.blog.repository.BoardRepository;
import com.pure.blog.repository.ReplyRepository;
//component-scan으로 Bean에 등록. (IoC)
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
@Autowired
private ReplyRepository replyRepository;
@Transactional //내부 기능이 모두 정상작동 하면 commit, 하나라도 실패하면 rollback
public void 글쓰기(Board board, User user) {
board.setCount(0);
board.setUser(user);
boardRepository.save(board);
}
@Transactional(readOnly = true)
public Page<Board> 글목록(Pageable pageable) {
return boardRepository.findAll(pageable);
}
@Transactional(readOnly = true)
public Board 글상세보기(int id) {
return boardRepository.findById(id)
.orElseThrow( () -> {
return new IllegalArgumentException("글 상세보기 실패: id를 찾을 수 없습니다.");
});
}
@Transactional
public void 글삭제하기(int id) {
System.out.println("글삭제 id: "+id);
boardRepository.deleteById(id);
}
@Transactional
public void 글수정하기(int id, Board requestBoard) {
Board board = boardRepository.findById(id)
.orElseThrow( () -> {
return new IllegalArgumentException("글 찾기 실패: id를 찾을 수 없습니다.");
}); //영속화 완료
board.setTitle(requestBoard.getTitle());
board.setContent(requestBoard.getContent());
//서비스 종료시 트랜잭션 종료 -> 더티체킹 -> DB flush로 자동 업데이트 됨.
}
@Transactional
public void 댓글쓰기(User user, int boardId, Reply requestReply) {
Board board = boardRepository.findById(boardId).orElseThrow(() -> {
return new IllegalArgumentException("댓글 쓰기 실패: 게시글 아이디를 찾을 수 없습니다.");
});
requestReply.setUser(user);
requestReply.setBoard(board);
replyRepository.save(requestReply);
}
}
board.js에 replySave 함수 추가
let index = {
init: function() {
$("#btn-save").on("click", ()=>{
this.save();
});
$("#btn-update").on("click", ()=>{
this.update();
});
$("#btn-delete").on("click", ()=>{
this.deleteById();
});
$("#btn-reply-save").on("click", ()=>{
this.replySave();
})
},
save: function() {
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
$.ajax({
type: "POST",
url: "/api/boardWrite",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function(resp){
alert("글쓰기가 완료되었습니다.");
location.href="/";
}).fail(function(error){
alert(JSON.stringify(error));
});
},
deleteById: function() {
let id = $("#id").text();
$.ajax({
type: "DELETE",
url: "/api/boardDelete/"+id,
dataType: "json"
}).done(function(resp){
alert("삭제가 완료되었습니다.");
location.href="/";
}).fail(function(error){
alert(JSON.stringify(error));
});
},
update: function() {
let id = $("#id").val();
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
$.ajax({
type: "PUT",
url: "/api/boardUpdate/"+id,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function(resp){
alert("글수정이 완료되었습니다.");
location.href="/";
}).fail(function(error){
alert(JSON.stringify(error));
});
},
replySave: function() {
let data = {
content: $("#reply-content").val(),
boardId: $("#boardId").val()
};
$.ajax({
type: "POST",
url: `/api/board/${data.boardId}/replyWrite`, //백틱은 js 변수를 문자열로 담기 위함.
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function(resp){
alert("댓글 작성이 완료되었습니다.");
location.href=`/board/${data.boardId}`;
}).fail(function(error){
alert(JSON.stringify(error));
});
}
}
index.init();
BoardApiController에 replyWrite 추가
@PostMapping("/api/board/{boardId}/replyWrite")
public ResponseDto<Integer> replyWrite(@PathVariable int boardId, @RequestBody Reply reply, @AuthenticationPrincipal PrincipalDetail principal) {
boardService.댓글쓰기(principal.getUser(), boardId, reply);
return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);
}
'취업 준비 > Spring boot' 카테고리의 다른 글
42. 게시글 삭제가 안되는 문제 해결 (0) | 2022.02.02 |
---|---|
41. 회원가입 시 중복 아이디 거르기 (0) | 2022.02.01 |
39. 댓글 DB에서 가져와서 출력 + 무한참조 방지 (0) | 2022.01.31 |
38. 댓글 화면 디자인 (0) | 2022.01.31 |
37. 카카오 로그인 REST API 방식 (0) | 2022.01.31 |