Controller에서 Entity를 참조하는 것이 바람직하지 않다는 것을 이전 포스팅에서 말한 바 있다.
그래서 DTO를 통해 Converter로만 데이터를 조작할 수 있도록 만들었다.
public class BoardController {
private final BoardService boardService;
@PostMapping("")
public BoardDTO create(
@Valid
@RequestBody
BoardRequest boardRequest
){
return boardService.create(boardRequest);
}
@GetMapping("/id/{id}")
public BoardDTO view(
@PathVariable Long id
){
return boardService.view(id);
}
}
Controller에서 BoardEntity를 내리는게 아니라 BoardDTO를 내리는 것이 더 바람직하다.
public class BoardService {
private final BoardRepository boardRepository;
private final BoardConverter boardConverter;
public BoardDTO create(
BoardRequest boardRequest
) {
var entity = BoardEntity.builder()
.boardName(boardRequest.getBoardName())
.status("REGISTERED").build();
var saveEntity = boardRepository.save(entity);
return boardConverter.toDTO(saveEntity);
}
public BoardDTO view(Long id) {
var entity = boardRepository.findById(id).get();
return boardConverter.toDTO(entity);
}
}
그렇게 되면 Service 레이어에서 BoardDTO를 통해 Entity를 보내는데 이 단계에서 Converter가 DTO를 통제한다.
Repository에서 가져온 Entity를 Converter가 DTO로 변환된 데이터를 Controller부에 전달하는 것이다.
PostEntity또한 같다.
@ManyToOne
@JsonIgnore
@ToString.Exclude
private BoardEntity board;
@OneToMany(
mappedBy = "post"
)
@Where(clause = "status = 'REGISTERED'")
@Builder.Default
private List<ReplyEntity> replyList = List.of();
@OneToMany는 Post테이블 또한 reply를 리스트로 관리하기 때문에 ReplyEntity의 필드인 post와 매핑해야한다.
앞서 발생한 loop가 여기서 또 한 번 발생하기 때문에 replyList - 1, post - N 관계를 형성시킨다.
지금까지는 데이터베이스갱신 시 UNREGISTERED상태인 데이터도 응답을 한다.
@Where 어노테이션에서 status가 REGISTERED인 데이터만 내리게 할 수 있다.
물론 BoardEntity의 postList에도 똑같이 적용된다.