스프링 부트(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 값이 잘 들어간것을 확인할 수 있다.

좋은 웹페이지 즐겨찾기