[JPA/Thymeleaf] 게시글 작성자만 수정하게 하기(2)
본문 바로가기

Web 개발/게시판 만들기

[JPA/Thymeleaf] 게시글 작성자만 수정하게 하기(2)

728x90
반응형

💡 이전 내용

지난 글에서 게시글 작성시, 사용자 정보를 저장하였습니다.

이번 글에서는 게시글 조회 시,

작성자 정보를 가져와서 작성자에게만 수정/삭제 버튼이 보이도록 하겠습니다.

 

💻 구현

1. 게시글 내용 조회

BoardController.java

@GetMapping("/{id}")
public String detail(@PathVariable("id") Long id, Model model, @CurrentUser Account user){
    // 게시글
    BoardDto boardDto = boardService.getPost(id);
    model.addAttribute("boardDto", boardDto);

    ...

    return "board/detail";
}

BoardService.java

@Transactional
public BoardDto getPost(Long id){
    Optional<Board> optBoard = boardRepository.findById(id);
    if(optBoard.isPresent()){
        Board board = optBoard.get();
        BoardDto boardDto = BoardDto.builder()
                .id(board.getId())
                .title(board.getTitle())
                .content(board.getContent())
                .username(board.getCreatedBy() == null ? "" : board.getCreatedBy())
                .build();
        return boardDto;
    }

    return null;
}

BoardDto.java

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BoardDto {
    private Long id;
    private String title;
    private String content;
    private String username;
    
}

 

Entity를 그대로 보여주지 않고, Dto로 변환하여 보여줬기 때문에

Dto에 username(작성자정보)를 추가합니다.

지난글에서 추가한 칼럼 createdBy를 가져옵니다.

이전에 만든 글에는 사용자 정보가 없기 때문에 null 체크를 해줬습니다.

 

2. 작성자만 수정, 삭제 버튼 보이기

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{board2/layouts/default_layout}">

<div layout:fragment="content">
    <div th:object="${boardDto}">
        <div>
            <input id="boardId" type="hidden" th:field="*{id}"/>
            <h2 th:text="*{title}"></h2>
            <p th:text="*{content}"></p>
        </div>

        <!-- 작성자만 수정 or 삭제 -->
        <div th:if="${#authentication.principal.username} == ${boardDto.username}" id="btnBox" class="row row-cols-lg-auto g-3 align-items-center">
            <a th:href="@{'/board2'}" class="btn btn-info btn-sm">
                <i class="bi bi-arrow-return-left"></i>목록
            </a>
            <a th:href="@{'/board2/write/' + ${boardDto.id}}" class="btn btn-warning btn-sm">
                <i class="bi bi-pencil-square"></i>수정
            </a>
            <form th:action="@{'/board2/delete'}" method="post">
                <input type="hidden" name="id" th:value="${boardDto.id}"/>
                <button type="submit" class="btn btn-danger btn-sm">
                    <i class="bi bi-trash"></i>삭제
                </button>
            </form>
        </div>
    </div>
    
    ...
    
</div>
</html>

 

boardDto에서 가져온 작성자 정보와 현재 로그인한 사용자 정보를 비교하여 같으면

btnBox가 보이도록 하였습니다.

 

728x90
반응형