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