댓글 등록, 수정시 화면이 젤 위로 올라가지는 문제(?)가 있어서 앵커 기능을 통해
등록, 수정된 댓글 위치로 이동되게끔 해볼 예정이다.
앵커 기능
- 추가, 수정, 삭제 시 이전 자신의 위치로 되돌아가는 기능
/templates/board/detail.html 댓글마다 앵커링 추가
<!-- 댓글 위치 -->
<a th:id="|reply_${reply.rno}|"></a>
- id값으로 댓글 no 값을 지정
/controller/ReplyController.java modify() POST매핑에 return에 앵커링 추가
@PreAuthorize("isAuthenticated()") // 로그인시만 작성가능
@PostMapping("/modify/{rno}")
public String modify(@Valid ReplyForm replyForm,
@PathVariable("rno") Long rno,
BindingResult bindingResult,
Principal principal) {
if(bindingResult.hasErrors()) {
return "reply/modify";
}
Reply reply = this.replyService.getReply(rno);
if(!reply.getWriter().getUsername().equals(principal.getName())){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
this.replyService.modReply(reply, replyForm.getContent());
// 수정이 완료되는 그 댓글로 위치
return String.format("redirect:/board/detail/%s#reply_%s", reply.getBoard().getBno(), reply.getRno());
}
- return url주소에 reply.getRno() 추가
- return String.format("redirect:/board/detail/%s", bno); -> return String.format("redirect:/board/detail/%s#reply_%s", bno, reply.getRno());
/service/ReplyService.java setReply() 메서드 return 타입 변경
public Reply setReply(Board board, String content, Member writer) {
// builder를 사용한 방식
Reply reply = Reply.builder().content(content).createDate(LocalDateTime.now()).board(board).build();
log.info("댓글 객체 생성");
reply.setWriter(writer);
this.replyRepository.save(reply);
log.info("댓글 객체 저장");
return reply;
}
- return 타입: void -> Reply로 변경
/controller/ReplyController.java create() POST 메서드 변경
// Principal 객체 추가하면 로그인한 사용자명(Member 객체)을 알 수 있음(Member 객체를 조회할 수 있다)
@PreAuthorize("isAuthenticated()") // 로그인시만 작성가능
@PostMapping("/create/{bno}")
public String create(Model model, @PathVariable("bno") Long bno,
@Valid ReplyForm replyForm, BindingResult bindingResult,
Principal principal) throws Exception {
Board board = this.boardService.getBoard(bno); // 게시글 정보 가져오기
Member writer = this.memberService.getMember(principal.getName()); // principal.getName() -> 지금 로그인 중인 사람의 ID값
if(bindingResult.hasErrors()) {
model.addAttribute("board", board);
return "board/detail";
}
Reply reply = this.replyService.setReply(board, replyForm.getContent(), writer);
log.info("[ReplyController] 댓글 저장 처리 완료");
return String.format("redirect:/board/detail/%s#reply_%s", bno, reply.getRno()); // 새로 생성된 댓글 위치로
}
- 댓글 생성시 해당 댓글 위치로 이동하도록 return 부분 수정
- return String.format("redirect:/board/detail/%s", bno); -> return String.format("redirect:/board/detail/%s#reply_%s", bno, reply.getRno());
'Spring Boot > STUDY' 카테고리의 다른 글
[Spring Boot] JPA 프로젝트 - @Query를 사용한 검색 기능 구현(2) (0) | 2024.06.25 |
---|---|
[Spring Boot] JPA 프로젝트 - Specification 인터페이스를 사용한 검색 기능 구현(1) (0) | 2024.06.24 |
[Spring Boot] JPA 프로젝트 - 수정 기능 구현 (0) | 2024.06.24 |
[Spring Boot] JPA 프로젝트 - 게시글 등록 시 작성자 추가 (0) | 2024.06.21 |
[Spring Boot] JPA 프로젝트 - 로그인, 로그아웃 기능 구현 (1) | 2024.06.21 |