seong

JPA DTO로 변환 하기 - 예제 Board Save 본문

JPA

JPA DTO로 변환 하기 - 예제 Board Save

hyeonseong 2022. 10. 26. 12:40

Save할때 필요한것

- RequestDto (요청에 대한 Dto) : title, content, user

- ResponseDto (응답에 대한 Dto) : id, title, content, user

순서 

1. Dto 생성 (요청, 응답)

2. Service 수정

3. Controller 수정

 

0. Dto 생성 전 Builder 선언

엔티티 아래 생성자를 만들어준다.

Builder는 순서에 신경쓰지않고, 필요한 정보만 넣을 수 있는 생성자 라고 생각하면 된다.

 @Builder
  public Board(Long id, String title, String content, User user) {
    this.id = id;
    this.title = title;
    this.content = content;
    this.user = user;
  }

1. Dto 생성

- RequestDto

글 작성할 경우 - Dto(클라이언트의 요청) -> Entity  -> Dto(응답을 위한 Dto)

Builder를 써서 필요한 정보만 Dto를 엔티티화 시켜준다. 

public class BoardReqDto {

  @Getter
  @Setter
  public static class BoardSaveReqDto {
    private String title;
    private String content;

    private SessionUser sessionUser;// 서비스 로직

    public Board toEntity() {
      return Board.builder()
          .title(title)
          .content(content)
          .user(sessionUser.toEntity())
          .build();
    }
  }
}

- ResponseDto

User는 다른 엔티티이다. 유저도 응답할때 필요한 정보만 보여준다.

public class BoardRespDto {

  @Getter
  @Setter
  public static class BoardSaveRespDto {
    private Long id;
    private String title;
    private String content;
    private UserDto user;

    @Getter
    @Setter
    public static class UserDto {
      private Long id;
      private String username;

      public UserDto(User user) {
        this.id = user.getId();
        this.username = user.getUsername();
      }
    }

    public BoardSaveRespDto(Board board) {
      this.id = board.getId();
      this.title = board.getTitle();
      this.content = board.getContent();
      this.user = new UserDto(board.getUser());
    }

  }
}

Service

  @Transactional
  public BoardSaveRespDto save(BoardSaveReqDto boardSaveReqDto) {
   	// 클라이언트에게 Dto로 받음 -> toEntity해서 insert
    Board boardPS = boardRepository.save(boardSaveReqDto.toEntity()); 
    // insert후 Entity를 응답 위해 -> Dto로 다시 변경
    BoardSaveRespDto boardSaveRespDto = new BoardSaveRespDto(boardPS);
    return boardSaveRespDto;
  }

Controller

SessionUser(User에 대한 Dto이다) : 로그인 후 세션에 저장되어 있는 유저의 정보를 가져오는 역할.

boardSaveReqDto.setSessionUser - 글을 쓸때 누가썻는지 알아야 하므로 세션 값을 넣어준다.

  @PostMapping("/board")
  public ResponseDto<?> save(@RequestBody BoardSaveReqDto boardSaveReqDto) {
    SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
    boardSaveReqDto.setSessionUser(sessionUser);
    BoardSaveRespDto boardSaveRespDto = boardService.save(boardSaveReqDto); // 서비스에는 단 하나의 객체만 전달한다.
    return new ResponseDto<>(1, "성공", boardSaveRespDto);
  }