비즈니스 파악(화면 보자!)
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. 비지니스 파악 (그림 살펴보기)
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); } }
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