Hello

댓글처리_댓글 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);
    }

}

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기