[홈페이지 제작] 홈페이지 댓글 만들기 1 - 댓글 쓰기

Feb 20, 2024
[홈페이지 제작]  홈페이지 댓글 만들기 1 - 댓글 쓰기
 
 

1. 댓글 테이블 만들기

 
댓글에서 필요한 정보는 댓글 내용(comment), 작성자(user_id), 게시글 번호(board_id), 작성시간(created_at) 이 필요하다.
 
데이터를 받기 위해 Reply 클래스를 만든다.
 
reply/Reply
package shop.mtcoding.blog.reply; import jakarta.persistence.*; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; @Data @Entity @Table(name="reply_tb") public class Reply { @Id // PK 설정 @GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment 전략 private int id; private String comment ; private int userId ; private int boardId; @CreationTimestamp private LocalDateTime createdAt; }
 
notion image
 
테이블이 정상적으로 생성된다.

2. View

 
notion image
 
 
클라이언트는 댓글을 작성한다. 작성한 댓글은 DTO를 통해 전달받는다.
 
reply/ReplyRequest
package shop.mtcoding.blog.reply; import lombok.Data; public class ReplyRequest { @Data public static class WriteDTO{ private String comment; private int boardId ; } }
 
userId 는 세션에, boardId 는 boardController의 리퀘스트 객체의 데이터를 전달받는다.
 
user/UserController
session.setAttribute("sessionUser", user);
 
board/BoardController
request.setAttribute("board", responseDTO);
 
detail.mustache
<!-- 댓글등록 --> <div class="card-body"> <form action="/reply/save" method="post"> <input type="hidden" name="boardId" value="{{board.id}}"> <textarea class="form-control" rows="2" name="comment"></textarea> <div class="d-flex justify-content-end"> <button type="submit" class="btn btn-outline-primary mt-1">댓글등록</button> </div> </form> </div>
 
hidden은 인풋 태그를 숨긴다. 클라이언트가 댓글을 작성하면 작성한 댓글과 함께 value="{{board.id}}" 를 통해 게시글 번호가 같이 DTO에 담긴다.
 

3. 컨트롤러

 
@RequiredArgsConstructor @Controller public class ReplyController { private final HttpSession session ; private final ReplyRepository replyRepository; @PostMapping("/reply/save") public String write(ReplyRequest.WriteDTO requestDTO){ // 인증 검사 User sessionUser = (User) session.getAttribute("sessionUser"); if(sessionUser == null){ return "redirect:/loginForm"; } // 유효성 검사 // 레파지토리 replyRepository.save(requestDTO,sessionUser.getId()); return "redirect:/board/"+ requestDTO.getBoardId(); } }
 
클라이언트가 작성한 댓글과 게시글 번호는 DTO 를 통해서 , 작성자 Id 는 세션을 통해 전달한다.
 

4. 레파지토리

 
package shop.mtcoding.blog.reply; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog.board.Board; import shop.mtcoding.blog.board.BoardRequest; import shop.mtcoding.blog.board.BoardResponse; import java.util.List; @RequiredArgsConstructor @Repository public class ReplyRepository { private final EntityManager em; @Transactional public void save(ReplyRequest.WriteDTO requestDTO, int userId) { Query query = em.createNativeQuery("insert into reply_tb(comment, board_id, user_id, created_at) values(?,?,?, now())"); query.setParameter(1, requestDTO.getComment()); query.setParameter(2, requestDTO.getBoardId()); query.setParameter(3, userId); query.executeUpdate(); } }
 
 
notion image
 
4번 게시글에 댓글을 작성한다.
 
notion image
 
DB 를 확인했을 때 4번 게시글에 댓글이 작성된 것을 확인할 수 있다.
 
Share article

{CODE-RYU};