댓글처리_댓글 DB저장 및 처리결과 리턴
by 볼빵빵오춘기CommentEntity
Board_Table의 자식관계이다.
더보기
1 : N 관계
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "board_id")
- private Board2Entity boardEntity;
@Entity
@Getter
@Setter
@Table(name="comment_table")
public class CommentEntity extends BaseEntity{
@Id // pk 컬럼 지정. 필수
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private Long id;
@Column(length = 20, nullable = false)
private String commentWriter;
@Column
private String commentContents;
/* Board:Comment = 1:N */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id")
private Board2Entity boardEntity;
}
Board2Entity
CommentEntity와 부모-자식 관계 설정한다.
@OneToMany(mappedBy = "boardEntity", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
private List<CommentEntity> commentEntityList = new ArrayList<>();
CommentRepository
public interface CommentRepository extends JpaRepository<CommentEntity, Long> {
}
CommentService
@Service
@RequiredArgsConstructor
public class CommentService {
private final CommentRepository commentRepository;
}
CommentController
private final CommentService commentService;
@PostMapping("/save")
public @ResponseBody String save(@ModelAttribute CommentDTO commentDTO){
System.out.println("commentDTO =" + commentDTO);
commentService.save(commentDTO);
return "요청성공";
}
CommentService
생성자를 만들지않고 클래스 메서드로 사용하는 이유는 되도록이면 Entity클래스는 철저하게 보호하자는 취지가 있다.
더보기
// 생성자를 만들어 접근하지 않는 이유
CommentEntity commentEntity = new CommentEntity();
commentEntity.toSaveEntity(commentDTO);
// 메서드로 접근하는 이유
CommentEntity.toSaveEntity(commentDTO);
⇒ Entity 입장에서 보면 JPA입장에서보면 DB를 다루는 함부로 접근하지 못하도록 보호하자는 취지로 클래스메서드로 할려한다.
public void save(CommentDTO commentDTO) {
CommentEntity commentEntity = CommentEntity.toSaveEntity(commentDTO);
}
CommentEntity
public static CommentEntity toSaveEntity(CommentDTO commentDTO, Board2Entity board2Entity) {
CommentEntity commentEntity = new CommentEntity();
commentEntity.setCommentWriter(commentDTO.getCommentWriter());
commentEntity.setCommentContents(commentDTO.getCommentContents());
commentEntity.setBoardEntity(board2Entity);
return commentEntity;
}
CommentService
// 생략
private final Board2Repository board2Repository;
// 생략
public Long save(CommentDTO commentDTO) {
// 부모 엔티티(Board2Entitiy) 조회
Optional<Board2Entity> optionalBoard2Entity = board2Repository.findById(commentDTO.getBoardId());
if(optionalBoard2Entity.isPresent()){
Board2Entity board2Entity = optionalBoard2Entity.get();
CommentEntity commentEntity = CommentEntity.toSaveEntity(commentDTO, board2Entity);
return commentRepository.save(commentEntity).getId();
}else{
return null;
}
}
CommentController
- save()후 DB에만 값을 넣는게 아니라 기존 댓글 부분에 값을 넘겨줘서 보여줘야한다.
따라서 if문으로 DB값이 null이 아닐경우와 null일경우로 return한다. - 댓글목록 :
⇒ 해당 게시글의 댓글 전체이다.
⇒ 해당게시글의 아이디를 기준으로 댓글 전체를 가져와야한다.
@PostMapping("/save")
public @ResponseBody String save(@ModelAttribute CommentDTO commentDTO){
System.out.println("commentDTO =" + commentDTO);
Long saveResult = commentService.save(commentDTO);
if(saveResult !=null){
// 작성 성공 => 댓글 목록을 가져와서 리턴
// 댓글 목록 : 해당 게시글의 댓글 전체
List<CommentDTO> commentDTOList = commentService.findAll(commentDTO.getBoardId());
return "요청 성공";
}else{
// 작성 실패
return "요청 실패";
}
}
CommentService
public List<CommentDTO> findAll(Long boardId) {
Board2Entity boardEntity = board2Repository.findById(boardId).get();
List<CommentEntity> commentEntityList = commentRepository.findAllByBoardEntityOrderByIdDesc(boardEntity);
}
CommentRepository
매개변수로 Board2Entity인 이유는 Comment_table에서 board_id를 Board2Entity로 정의했기 떄문에 Long이 아닌 Board2Entity로 해야한다.
List<CommentEntity> findAllByBoardEntityOrderByIdDesc(Board2Entity boardEntity);
CommentService
public List<CommentDTO> findAll(Long boardId) {
Board2Entity boardEntity = board2Repository.findById(boardId).get();
List<CommentEntity> commentEntityList = commentRepository.findAllByBoardEntityOrderByIdDesc(boardEntity);
/* EntityList -> DTOList */
List<CommentDTO> commentDTOList = new ArrayList<>();
for (CommentEntity commentEntity: commentEntityList) {
CommentDTO commentDTO = CommentDTO.toCommentDTO(commentEntity, boardId);
commentDTOList.add(commentDTO);
}
return commentDTOList;
}
CommentDTO
public static CommentDTO toCommentDTO(CommentEntity commentEntity, Long boardId) {
CommentDTO commentDTO = new CommentDTO();
commentDTO.setId(commentEntity.getId());
commentDTO.setCommentWriter(commentEntity.getCommentWriter());
commentDTO.setCommentContents(commentEntity.getCommentContents());
commentDTO.setCommentCreatedTime(commentEntity.getCreatedTime());
commentDTO.setBoardId(boardId);
return commentDTO;
}
CommentContorller
반환타입 @ResponseBody String → ResponseEntity 로 변경한다.
더보기
- ResponseEntity 는 body와 head를 다룰 수 있는 객체이다.
- new ResponseEntity<>(commentDTOList, HttpStatus.OK);
- new ResponseEntity<>("해당 게시글이 존재하지 않습니다.", HttpStatus.NOT_FOUND);
- new ResponseEntity<>(보내고자하는값, 상태코드);
@PostMapping("/save")
public ResponseEntity save(@ModelAttribute CommentDTO commentDTO){
System.out.println("commentDTO =" + commentDTO);
Long saveResult = commentService.save(commentDTO);
if(saveResult !=null){
// 작성 성공 => 댓글 목록을 가져와서 리턴
// 댓글 목록 : 해당 게시글의 댓글 전체
List<CommentDTO> commentDTOList = commentService.findAll(commentDTO.getBoardId());
return new ResponseEntity<>(commentDTOList, HttpStatus.OK);
}else{
// 작성 실패
return new ResponseEntity<>("해당 게시글이 존재하지 않습니다.", HttpStatus.NOT_FOUND);
}
}
'강의 따라하기 > member2' 카테고리의 다른 글
댓글처리_게시글 상세조회시 댓글 목록 출력 (0) | 2023.12.30 |
---|---|
댓글처리_작성 후 목록 출력 (0) | 2023.12.30 |
댓글처리_댓글작성 내용 서버로 요청하기 (0) | 2023.12.30 |
댓글처리_댓글 기능 소개 (0) | 2023.12.30 |
파일첨부_다중파일 첨부 및 마무리 (0) | 2023.12.30 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기