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;
}

테이블이 정상적으로 생성된다.
2. View

클라이언트는 댓글을 작성한다. 작성한 댓글은 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();
}
}

4번 게시글에 댓글을 작성한다.

DB 를 확인했을 때 4번 게시글에 댓글이 작성된 것을 확인할 수 있다.
Share article