우당탕탕 개발일지
18일차_게시판 프로젝트(11) 본문
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
'개발 프로젝트 > 게시물 프로젝트' 카테고리의 다른 글
부족한 부분들 채워나가기... (0) | 2024.06.17 |
---|---|
19일차_게시판 프로젝트(12) (0) | 2024.03.28 |
17일차_게시판 프로젝트(10) (0) | 2024.03.26 |
16일차_게시판 프로젝트(9) (0) | 2024.03.26 |
15일차_게시판 프로젝트(8) (0) | 2024.03.22 |