seong
JPA DTO로 변환 하기 - 예제 Board Save 본문
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);
}
'JPA' 카테고리의 다른 글
JPA - 댓글 작성 및 삭제 기능 (0) | 2022.10.27 |
---|---|
JPQL의 Join문법 - join fetch (0) | 2022.10.27 |
JPA DTO로 변환 하기 - 예제 findAll (0) | 2022.10.26 |
Optional 사용해서 예외처리 하기 - findById예시 (0) | 2022.10.26 |
Dto로 만드는 이유, UserJoin 실습 (0) | 2022.10.26 |