28. BLOG만들기-댓글 쓰기

박선규's avatar
Feb 07, 2024
28. BLOG만들기-댓글 쓰기
 

비즈니스 파악(화면 보자!)

notion image
📌
reply 테이블에 필요한것 boardId:게시물 작성자 (어떤 게시물에 댓글인지 파악하려고 넣음) comment:댓글 쓰기 칸, 내용 userId:댓글 작성자 id:댓글 갯 수 create at :댓글 생성 시
 

1. 테이블 생성

package shop.mtcoding.blog.reply; import jakarta.persistence.*; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; @Table(name="reply_tb") @Data @Entity public class Reply { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String comment; private int userId; private int boardId; private LocalDateTime createdAt; }
board_id를 body로 받기

2. 비지니스 파악 (그림 살펴보기)

notion image
notion image
📌
type="hidden": ◦ <input> 요소의 type 속성은 입력 필드의 유형을 지정합니다. ◦ type="hidden"은 사용자에게 보이지 않는 숨겨진 필드를 생성합니다. ◦ 사용자의 입력을 받지 않고, 서버로 데이터를 전송할 때 유용하게 사용됩니다. name="boardId": ◦ <input> 요소의 name 속성은 입력 필드의 이름을 지정합니다. ◦ 서버로 전송될 데이터의 이름을 나타냅니다. ◦ 이 경우, boardId라는 이름으로 데이터가 전송될 것입니다. value="{{board.id}}": ◦ <input> 요소의 value 속성은 입력 필드의 값을 지정합니다. ◦ 이 값은 서버로 전송되는 데이터의 실제 값입니다. ◦ {{board.id}}는 템플릿 엔진이나 서버 사이드 코드에서 동적으로 해당 값을 채워넣는 부분입니다. ◦ 이 경우, board 객체의 id 속성 값이 해당 필드의 값으로 사용될 것입니다. 결론:어떤 게시물에 댓글이 달릴지 정하기 위해 이 코드가 쓰여짐

3. DTO 만들기

package shop.mtcoding.blog.reply; import lombok.Data; public class ReplyRequest { @Data public static class WriteDTO { private String comment; private int boardId; } }
 
 

4. 컨트롤러 만들기

 

값 제대로 들어오는지 확인

package shop.mtcoding.blog.reply; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @RequiredArgsConstructor @Controller public class ReplyController { private final HttpSession session; @PostMapping("reply/save") public void write(ReplyRequest.WriteDTO requestDTO){ System.out.println(requestDTO); } }
notion image
package shop.mtcoding.blog.reply; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import shop.mtcoding.blog.user.User; // 댓글쓰기, 댓글삭제, 댓글 목록보기 @RequiredArgsConstructor @Controller public class ReplyController { private final HttpSession session; private final ReplyRepository replyRepository; @PostMapping("/reply/save") public String write(ReplyRequest.WriteDTO requestDTO){ System.out.println(requestDTO); User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { return "redirect:/loginForm"; } // 유효성 검사 (님들이 하세요) // 핵심 코드 replyRepository.save(requestDTO, sessionUser.getId()); return "redirect:/board/"+requestDTO.getBoardId(); } }
 

5. 레포지토리 만들기

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(); } }
Share article
RSSPowered by inblog