[작성일: 2023. 05. 14]
2024.08.24 - [WEB/Back-End] - [Spring] 댓글창 목록 구현하기
[Spring] 댓글창 목록 구현하기
[작성일: 2023. 05. 13] Reply 목록 구현기존 게시물 페이징 처리 + 특정 게시물 번호MyBatis는 두 개 이상의 데이터를 파라미터로 전달하기 위해서 별도 객체를 구성하거나, Map을 이용하거나, @Param을
eenzhd.tistory.com
댓글 조회 기능 구현하기
getList, get, modify
- @RequestBody : POST 등 데이터 부분으로 전달되는 내용
- @PathVariable : Path에 들어오는 값을 변수로 사용할 경우
- curl 중 PUT/PATCH
- 외부에서 데이터가 전달될 때 일부분만 전달될 경우를 위해 {"/{rno}, "/{rno}/{replier}"} 와 같이 구분함.
- 원래 JSON 데이터 중 REPLIER가 전달되지 않았을 경우 검증단계 (Validate, Validated, Valid)를 거쳐야 함.
- null인지 아닌지 검사하기 위해 객체 안의 필드를 매개변수로 따로 설정하여 null도 가능하도록 설정함. (required=false)
- modify에 replier가 있거나 없거나 둘 다 처리하기 위한 로직 추가
@RestController
// ViewResolver를 사용하지 않고 리턴 값을 그대로 데이터로 사용
// 내부 메서드는 REST 방식으로만 사용 가능함.
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/replies/*")
public class ReplyController {
private final ReplyService replyService;
... 생략
// 게시글 댓글 전체 조회
@GetMapping("pages/{bno}/{page}")
public List<ReplyVO> getList(@PathVariable("bno") Long bno, @PathVariable("page") int page) {
log.info("getList------------------------------>");
Criteria cri = new Criteria(page,10);
log.info(cri.toString());
return replyService.getList(cri, bno);
}
// 게시글 댓글 조회
@GetMapping("{rno}")
public ReplyVO get(@PathVariable("rno") Long rno) {
log.info("get ------------------------------->" + rno);
return replyService.get(rno);
}
// 댓글 수정
// PUT : 자원의 전체 수정, 자원의 모든 필드를 전송해야 함, 일부만 전송하면 오류
// PATCH : 자원의 일부 수정, 수정할 필드만 전송
// PATCH가 PUT을 포함하므로 전체를 전달받아 수정하거나 부분만 수정하거나 모두 PATCH가 유리함.
@RequestMapping(method= {RequestMethod.PATCH}, value= {"/{rno}", "/{rno}/{replier}"}, consumes="application/json", produces="text/plain; charset=utf-8")
public ResponseEntity<String> modify(
@RequestBody ReplyVO replyVO,
@PathVariable(value = "replier", required = false) String replier,
@PathVariable("rno") Long rno)
throws UnsupportedEncodingException {
replyVO.setRno(rno);
int replyCount = 0;
log.info("modify -----------------------------------> " + rno);
log.info("modify : " + replyVO);
if(replyVO.getReplier() == null) {
replyVO.setReplier(Optional.ofNullable(replier).orElse("anonymous"));
}
replyCount = replyService.modify(replyVO);
if(replyCount == 1) {
return new ResponseEntity<>(new String("댓글 수정 성공".getBytes(), "UTF-8"), HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
modify SQL에 replier부분 수정
- REPLIER = #{replier} 추가
<update id="update">
UPDATE TBL_REPLY
SET REPLY = #{reply}, REPLIER =#{replier}, UPDATEDATE = SYSDATE()
WHERE RNO = #{rno}
</update>
Test(Talend API Tester)
- Method : PATCH
- Scheme : http://localhost:포트번호/replies/4
- Header : Content-Type - application/json
- Body : {"reply" : "Modified Reply"}
댓글 삭제 기능 구현하기
delete 로직 구현
// 댓글 삭제
@DeleteMapping(value="{rno}", produces="text/plain; charset=utf-8")
public String remove(@PathVariable("rno") Long rno) {
log.info("remove -----------------------------------> " + rno);
return replyService.remove(rno) == 1 ? "댓글 삭제 성공" : "댓글 삭제 실패";
}
Test(Talend API Tester)
- Method : DELETE
- Scheme : http://localhost:포트번호/replies/3
Javascript에 기능 추가(reply.js)
reply.js
- template/static/js에 reply.js 생성
- get.html에 <script src="/js/reply.js></script>문 추가
- reply.js에 console log 한 줄 추가
- http://localhost:포트넘버/board/list에서 글 클릭하면 console log에 로그가 출력되는지 확인할 수 있음.
- update, delete, getList, get 등 메서드 구현
- 각 기능을 get.html에서 document readey 시에 구동되도록 하는 방식을 테스트
HTML에서 각 댓글 가져오기
- get.html에서 showList() 함수 구현하기
댓글 등록하기
- get.html의 reply display(UL) 윗 부분에 UI 추가
- remove 구현
- modify 구현(수정, 수정완료 버튼 링크 컨트롤)
- 각 댓글의 링크를 보여줄 때 각 댓글마다 고유한 class 또는 id 부여한 내용으로 같은지를 비교하여 설정
트랜잭션
- 하나의 트랜잭션만 사용한다면 DB에는 별 문제가 없음.
- 여러 개의 트랜잭션 순차 수행 후 문제가 생기면 성공한 트랜잭션은 반영되고 나머지는 실패이므로 다시 복구해야 하는 문제가 발생함.
- ex) A와 B 트랜잭션을 실행한 후, B에서 오류가 발생하면 A를 복구해야 함.
- 이러한 문제를 막기 위해 Spring에서 @Transactional이라는 애노테이션을 사용함.
- 한 개의 트랜잭션 문제 발생 시 콜백을 통해 전체 트랜잭션이 모두 DB에 반영되지 못하게 막음.
🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.