Spring Boot/STUDY

[Spring Boot] JPA 프로젝트 - 앵커 기능 구현

코맹 2024. 6. 24. 14:54

 

댓글 등록, 수정시 화면이 젤 위로 올라가지는 문제(?)가 있어서 앵커 기능을 통해

등록, 수정된 댓글 위치로 이동되게끔 해볼 예정이다.

 

앵커 기능
- 추가, 수정, 삭제 시 이전 자신의 위치로 되돌아가는 기능

 

 

/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());