[Spring] Simple Board - 구현 3

HOJUN·2024년 6월 15일

Backend - Spring

목록 보기
24/34

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에도 똑같이 적용된다.

0개의 댓글