1. View
댓글의 삭제버튼은 휴지통 모형으로 되어있다. 댓글 작성자만 삭제 버튼이 활성화되도록 만들어본다.
2. 컨트롤러
@GetMapping("/board/{id}") public String detail(@PathVariable int id, HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); // 1. 모델 진입 - 상세보기 데이터 가져오기 BoardResponse.DetailDTO boardDTO = boardRepository.findByIdWithUser(id); // 2. 페이지 주인 여부 체크 (board의 userId와 sessionUser의 id를 비교) boardDTO.isBoardOwner(sessionUser); List<BoardResponse.ReplyDTO> replyDTOList = replyRepository.findByBoardId(id,sessionUser); request.setAttribute("replyList",replyDTOList); request.setAttribute("board", boardDTO); return "board/detail"; } }
boardDTO.isBoardOwner(sessionUser);
기존 게시글 작성자 확인 코드를 DTO에서 처리하기 위해 작성한 코드
확인된 게시글 작성자 여부는 boardDTO, 댓글 작성자 여부는 replyDTOList 에 담겨 mustache 로 전달된다.
3. DTO
package com.example.springblog.board; import com.example.springblog.user.User; import lombok.AllArgsConstructor; import lombok.Data; import java.sql.Timestamp; public class BoardResponse { //조인문으로 받은 데이터를 받는 클래스 @Data public static class DetailDTO{ private Integer id ; private String title; private String content ; private Integer userId ; private String username; private Boolean boardOwner ; //게시글 작성자 확인 public void isBoardOwner(User sessionUser) { if(sessionUser==null){ boardOwner = false ; }else { boardOwner = (sessionUser.getId()==userId?true:false); } } } @Data public static class ReplyDTO{ private Integer id ; private Integer userId ; private String username ; private String comment; private Boolean replyOwner ; public ReplyDTO(Object[] ob, User sessionUser){ this.id = (Integer) ob[0]; this.userId = (Integer) ob[1]; this.comment = (String) ob[2]; this.username = (String) ob[3]; //댓글 작성자 확인 if(sessionUser==null){ replyOwner = false; }else { replyOwner = (sessionUser.getId()==userId?true:false); } } } }
BoardResponse 에서 게시글 작성자와 댓글 작성자의 책임을 넘긴다.
BoardResponse 클래스의 DetailDTO 에 boardOwner , replyOwner 변수를 추가한다.
로그인을 하지 않았다면 false, 로그인한 id 와 글을 작성한 id가 같다면 true이다.
4. 레파지토리
public BoardResponse.DetailDTO findByIdWithUser(int idx) { Query query = em.createNativeQuery("select b.id, b.title, b.content,b.user_id, u.username from board_tb b inner join user_tb u on b.user_id = u.id where b.id = ?"); query.setParameter(1,idx); Object[] row = (Object[]) query.getSingleResult(); Integer id = (Integer) row[0]; String title = (String) row[1]; String content = (String) row[2]; int userId = (Integer) row[3]; String username = (String) row[4]; BoardResponse.DetailDTO responseDTO = new BoardResponse.DetailDTO(); responseDTO.setId(id); responseDTO.setTitle(title); responseDTO.setContent(content); responseDTO.setUserId(userId); responseDTO.setUsername(username); return responseDTO; }
라이브러리를 사용하지 않고 하나씩 파싱한다.
5. Mustache
<!-- 수정삭제버튼 --> {{#boardOwner}} <div class="d-flex justify-content-end"> <a href="/board/{{board.id}}/updateForm" class="btn btn-warning me-1">수정</a> <form action="/board/{{board.id}}/delete" method="post"> <button class="btn btn-danger">삭제</button> </form> </div> {{/boardOwner}} <!-- 댓글아이템 --> {{#replyList}} <div class="list-group-item d-flex justify-content-between align-items-center"> <div class="d-flex"> <div class="px-1 me-1 bg-primary text-white rounded">{{username}}</div> <div>{{comment}}</div> </div> {{#replyOwner}} <form action="/reply/1/delete" method="post"> <button class="btn">🗑</button> </form> {{/replyOwner}} </div> {{/replyList}}
리퀘스트 객체에 담아온 boardOwner 와 replyOwner 를 각 삭제버튼에 감싼다.
로그인이 되어있지 않다면 휴지통은 비활성화된다.
로그인을 하면 휴지통이 활성된다.
Share article