우당탕탕 개발일지

18일차_게시판 프로젝트(11) 본문

개발 프로젝트/게시물 프로젝트

18일차_게시판 프로젝트(11)

ujin302 2024. 3. 27. 20:14
반응형

1. 댓글 DB에 저장하기

저번 시간에는 Controller가 댓글 요청을 잘 받는지 확인만 하였다. 

이번에는 댓글 DB에 저장, 댓글 목록 반환 까지 구현한다. 

 

저번 시간 참고 : 2024.03.26 - [취준] - 17일차_게시판 프로젝트(10)

 

1-1. Controller

CommentController.java

1.  댓글 DB에 저장 

>> commentService.save 메소드 

>> 1-3 참고

 

2. 댓글 목록 반환 

>> commentService.findAll 메소드

>> 1 번이 성공할 경우에만 수행 

>> 1-4 참고

 

3. 반환값 

>> ResponseEntity 사용

>> 1-5 참고

 

 

 

1-2. DTO, Entity 설정

CommentDTO.java

1. 저징하는 Data

  • id
  • commmetWriter
  • commentContents
  • boardId
  • commentCreatedTime

2. toCommentDTO

  • 객체 변환 : CommentEntity -> CommentDTO
  • boardId : CommentEntity 부모 객체인 BoardEntity에서 id 값 가져옴 
  • commentCreatedTime : CommentEntity가 상속받은 BaseEntity의 생성 시간 가져옴 
package com.example.board.dto;


import com.example.board.entity.CommentEntity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;

@Getter
@Setter
@ToString
public class CommentDTO {
    private Long id;
    private String commentWriter;
    private String commentContents;
    private Long boardId;
    private LocalDateTime commentCreatedTime;

    public static CommentDTO toCommentDTO(CommentEntity commentEntity) {
        CommentDTO commentDTO = new CommentDTO();
        commentDTO.setId(commentEntity.getId());
        commentDTO.setCommentWriter(commentEntity.getCommentWriter());
        commentDTO.setCommentContents(commentEntity.getCommentContents());
        commentDTO.setBoardId(commentEntity.getBoardEntity().getId()); // >> Service 메서드에 @Transactional 필수
        commentDTO.setCommentCreatedTime(commentEntity.getCreatedTime());
        return commentDTO;
    }
}

 

 

CommentEntity.java

1. BaseEntity 상속 

  • created_Time 사용하기 위함

2. 컬럼 생성

  • id
  • commmetWriter
  • commentContents
  • board_id (PK >> BaordEntity 참조)

3. toSaveEntity

  • 객체 변환 : CommentDTO -> CommentEntity 
package com.example.board.entity;

import com.example.board.dto.CommentDTO;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.Optional;

@Entity
@Getter
@Setter
@Table(name = "tb_Board_comment")
public class CommentEntity extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 20, nullable = false)
    private String commentWriter;

    @Column
    private String commentContents;

    // Board 의 자식
    // Board : Comment = 1 : n
    @ManyToOne(fetch = FetchType.LAZY) // 부모가 삭제되면 자식도 삭제
    @JoinColumn(name = "board_id")
    private BoardEntity boardEntity;

    public static CommentEntity toSaveEntity(CommentDTO commentDTO, BoardEntity boardEntity) {
        CommentEntity commentEntity = new CommentEntity();
        commentEntity.setCommentWriter(commentDTO.getCommentWriter());
        commentEntity.setCommentContents(commentDTO.getCommentContents());
        commentEntity.setBoardEntity(boardEntity);

        return commentEntity;
    }
}

 

 

1-3. 댓글 DB에 저장

CommentService.java

>> save 메소드 

1. 매개변수 

  • commentDTO : 댓글 관련 정보 가지고 있음

2. 부모 BoardEntity 가져오기

  • boardRepository 클래스 사용
  • 매개변수 commentDTO에서 boardId 사용
  • Null로 인한 오류 방지를 위해 Optional 타입 사용 

3. 부모 BoardEntity 존재 유무 판단

* 3번의 반환 값이 Null 이 아닌 경우에만 Controller에서 1-4 작업 수행

3-1. 값 존재 O

  • 타입 변경 : Optional -> BoardEntity 
  • 객체 변환 : CommentEntity.toSaveEntity
  • 반환 : tb_board_comment 테이블에 저장(DB 저장) & 댓글 Id 값 

3-2. 값 존재 X

  • 반환 : Null

 

 

1-4. 댓글 목록 반환 

CommentService.java

>> findAll 메소드 

1. 매개변수 

  • boardID : 댓글의 게시물 번호 

2. 댓글 목록 DB에서 추출 

  • boardEntity:  boardRepository에서 boardId에 해당하는 BoardEntity 추출 
  • commentEntityList : tb_board_comment(DB Table)에서 boardId에 해당하는 모든 댓글 Row Data 추출 & 내림차순 정렬 
  • findAllByBoardEntityOrderByIdDesc : 1- 참고

3. 댓글 목록 반환  

  • commentDTOList : 댓글 목록 담을 변수 
  • 반복문 : 2에서 추출한 commentEntityList 의 원소 모두 CommentDTO 객체로 변환 
  • 댓글 목록 설정 : List에 CommentDTO 객체 추가 
  • 반환 값 : commentDTOList  

 

 

1-4. ResponseEntity

 

 

https://thalals.tistory.com/268

 

ResponseEntity란 - 개념, 구조, 사용법, 사용하는 이유

이거 옜날에 적은건데,, 꾸준히 블로그로 유입되시는 분들이 계셔서 부끄러운 마음에 내용을 조금 더 추가해 보았습니다..ㅎㅎ 앞으로도 계속 변경되거나, 알게된 내용 추가할 예정이고, 틀린부

thalals.tistory.com

 

 

1-5. CommentRepository

findAllByBoardEntityOrderByIdDesc 

JPA에서 쿼리 메소드를 날릴 수 있다. 

 

쿼리를 사용하여 tb_board_comment에서 board_id가 boardEntity 의 id와 동일한 값 데이터만 추출하여야 한다. 

SQL문 : select * from tb_board_comment where board_id = ? order by id desc;

 

[ SQL문을 사용하여 Data 추출 ]

 

 

해당 SQL문이 findAllByBoardEntityOrderByIdDesc와 같은 의미이다. 

JPA 쿼리 메소드 SQL문  의미
findAllByBoardEntity select *
from tb_board_comment
where board_id = {게시물 id}
'tb_board_comment' 테이블에서
board_id 값과 게시물 id 데이터가 동일한 Row 추출 
OrderByIdDesc order by id desc 내림차순 정렬 

 

JPA 쿼리 메소드의 자세한 설명은 아래 첨부 URL 확인! 

 

CommentRepository.java

 

[ 쿼리이 ]

findAllByBoardEntityOrderByIdDesc

해당 쿼리 메소드에서 BoardEntity는 게시물 Data 관리 Entity 클래스명이다. 

만약 Entity 명을 변경하거나 다르게 작성한다면 찾지 못하고 오류가 발생한다. 

 

 

[ 매개변수 ]

쿼리 메소드의 매개변수로 BoardEntity 를 설정하였다. 

?에 해당하는 id 값의 형식인 Long이 아니라 BoardEntity 형식으로 전달해야하 한다. 

 

package com.example.board.repository;

import com.example.board.entity.BoardEntity;
import com.example.board.entity.CommentEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface CommentRepository extends JpaRepository<CommentEntity, Long> {
    /*
            select * from tb_board_comment where board_id = ? order by id desc;
            findAllByBoardEntity : select * from tb_board_comment where board_id = ?
            OrderByIdDesc : order by id desc;
            
            대소문자가 정말  중요함! 
            대소문자가 맞지 않는 경우, 쿼리문 오류 발생
         */
    List<CommentEntity> findAllByBoardEntityOrderByIdDesc(BoardEntity boardEntity);
}

 

 

[ 참고 JPA 쿼리 ]

https://kihwan95.tistory.com/5

 

Spring Data JPA(쿼리 메소드)

Spring Data JPA로 쿼리를 생성하는 방법들을 알아보겠습니다. • 메소드 이름으로 쿼리 생성 쿼리 메소드는 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메소드를 작성하면 원하는 쿼리를

kihwan95.tistory.com

 

1-6. 결과화면

[ View ]

 

 

 

[ DB >> tb_board_comment ]

 

 

 

1-7. 유튜브 영상

https://www.youtube.com/watch?v=N-9vzi2gmnQ&list=PLV9zd3otBRt7jmXvwCkmvJ8dH5tR_20c0&index=23

 

 

1-8. 상속( 참고 )

https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4

 

자바 extends, implements 차이

상속이란 (Inheritance) 상속을 말하기 전에 먼저 OOP가 무엇인지 알면 좋을거 같다.OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란? OOP의 특징으로 1. 상속과 인터페이스 (계층성) 2. 다형성, 사

velog.io

 

반응형