오늘은 댓글 기능을 구현해볼 예정이다.....
참조관계 설정이 중요한데.
Entity에서 상속을 받아 처리하는 방식으로 구현 을 한다.
@Entity @Getter @Setter @Table(name = "comment_table") public class CommentEntity extends BaseEntity{ // 댓글번호, 작성자, 내용, 원글 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="comment_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") // 부모테이블(참조하고자 하는 테이블)의 pk 컬럼 이름을 작성한다. private BoardEntity boardEntity; // 참조하고자 하는 테이블을 관리하는 Entity @Column private String commentWriter; @Column private String commentContents; }
추가로 BoardEntity에
// 댓글 연관관계 @OneToMany(mappedBy = "boardEntity", fetch = FetchType.LAZY) private List<CommentEntity> commentEntityList = new ArrayList<>();
를 작성해서
CommentEntity를 List로 선언해준다.
@ManyToOne = 1:N
@OneToMany = N:1
Diegarm
comment_table >|--------||board_table
테이블이 jpa 문법에 의해서 연관관계가 설정됨.
이제 댓글 작성을 해보자.
findById에서 댓글을 볼 예정이고
ajax로 댓글 기능을 구현해 본다.
<div id="comment-write"> <input type="text" id="commentWriter" placeholder="작성자"><br> <input type="text" id="commentContents" placeholder="내용"><br> <button id="comment-write-btn">댓글 등록</button> </div> <div id="comment-area"> <table> <thead> <tr> <th>댓글번호</th> <th>작성자</th> <th>내용</th> <<th>작성시간</th> </tr> </thead> <tbody> </tbody> </table> </div>
<script src="https://code.jquery.com/jquery-3.6.0.js"></script> //제이쿼리를 추가하고.
<script> $("#comment-write-btn").click(function (){ console.log('댓글 등록 버튼 클릭'); const commentWriter = $("#commentWriter").val(); const commentContents = $("#commentContents").val(); const boardId = '[[${board.boardId}]]'; $.ajax({ type: 'post', url: 'comment/save', data: { 'commentWriter': commentWriter, 'commentContents': commentContents, 'boardId': boardId }, data_type: 'json', success: function (result) { console.log(result); }, error: function (){ alert('땡!!!') } }); }); </script>
ajax 로 댓글 등록 기능을 구현한다.
..이제 controller,service,repository,dto 등을 만들어보자^^;;
controller (댓글 등록).save
@PostMapping("/save") public @ResponseBody List<CommentDetailDTO> save(@ModelAttribute CommentSaveDTO commentSaveDTO){ cs.save(commentSaveDTO); return null; }
serviceImpl
@Service @RequiredArgsConstructor public class CommentServiceImpl implements CommentService{ private final CommentRepository cr; private final BoardRepository br; @Override public Long save(CommentSaveDTO commentSaveDTO) { BoardEntity boardEntity = br.findById(commentSaveDTO.getBoardId()).get(); CommentEntity commentEntity = CommentEntity.toSaveEntity(commentSaveDTO, boardEntity); return cr.save(commentEntity).getId();
Repository
public interface CommentRepository extends JpaRepository<CommentEntity, Long> { }
CommentEntity를 상속받는다 : 타입은 Long
이제 댓글 작성이 잘 되는지 테스트 코드로 작성해보자.
조건을 먼저 부여할건데.... 먼저 게시판(게시글) 을 등록하고
그 게시글의 ID(boardId)를 참조해서 해당 id값이 포함된 댓글이
잘 작성되는지..까지 테스트코드를 짜보자.@Test @DisplayName("댓글 작성 테스트") @Transactional public void commentTest() {
먼저 Test , DisplayName , Transactional 을 임포트 한다.
Transactional을 사용하는 이유: 연관관계에 있는 Entity를 함께 조회할 수 있다.
Long boardId = bs.save(new BoardSaveDTO("글작성자1","글비밀번호1", "글제목1","글내용1", LocalDateTime.now()));
게시글을 생성하고 해당 게시글을 boardId 라는 변수에 넣어준다.
cs.save(new CommentSaveDTO(boardId,"댓글작성자","댓글내용"));
해당 boardId를 참조키로 작성자와 내용을 넣어주고 댓글을 생성해준다.
해당 board_id 값이 잘 들어간것을 확인할 수 있다.
안녕하세요, 혹시 컨트롤러의 cs.save(commentSaveDTO); 에서 cs는 무엇일까요?