스프링 부트(Spring boot) 댓글.1
Comment (댓글처리)
오늘은 댓글 기능을 구현해볼 예정이다.....
참조관계 설정이 중요한데.
Entity에서 상속을 받아 처리하는 방식으로 구현 을 한다.
- CommentEntity
@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; }
- 즉, 게시글:댓글의 경우 1:N 으로
일단 댓글번호,작성자,내용,원글이 필요하며
해당 게시글 table의 pk 컬럼을 참조하고 해당 테이블을 관리하는
Entity를 참조한다.
추가로 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();
- BoardEntity를 넣어야 하기 때문에 Entity를 가져와야한다.
<< 위에 보드 리파지토리를 사용하는 이유!
toSaveEntity (Entity 객체로 만들어서 리턴해준거다.)
commentSaveDTO와 boardEntity 두개의 변수를 넘겨줘야한다(댓글정보 + 원글 entity)
Repository
public interface CommentRepository extends JpaRepository<CommentEntity, Long> { }
CommentEntity를 상속받는다 : 타입은 Long
TestCode
이제 댓글 작성이 잘 되는지 테스트 코드로 작성해보자.
조건을 먼저 부여할건데.... 먼저 게시판(게시글) 을 등록하고
그 게시글의 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 값이 잘 들어간것을 확인할 수 있다.
Author And Source
이 문제에 관하여(스프링 부트(Spring boot) 댓글.1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sw6464/스프링-부트Spring-boot-댓글.1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)