requestDto, responseDto 에 대한 이해

박영준·2023년 6월 26일
0

Spring

목록 보기
20/58

프로젝트의 구조와 데이터의 흐름을 명확하게 이해하고, 내가 이해한 결과를 기록하기 위해 작성했다.

이해를 쉽게 하기위해 비유를 사용했다.

  • BoardRequestDto = 열쇠
  • BoardResponseDto = 금 Gold
  • Controller, Service 등... 각 계층 = 잠겨있는 방
  • Entity, DB = 금고

[Controller]

Controller 계층을 보면 이런 방식으로 구성돼있다.

// 게시글 작성
@PostMapping("/board")
public BoardResponseDto createBoard(@RequestBody BoardRequestDto requestDto) {
    return boardService.createBoard(requestDto);		// 호출 및 반환
}

// 게시글 전체 조회
@GetMapping("/board")
public List<BoardResponseDto> getBoardList() {
    return boardService.getBoardList();		// 호출 및 반환
}
    
// 게시글 선택 조회
@GetMapping("/board/{id}")
public BoardResponseDto getBoard(@PathVariable Long id) {
    return boardService.getBoard(id);		// 호출 및 반환
}

// 게시글 수정
@PutMapping("/board/{id}")
public BoardResponseDto updateBoard(@PathVariable Long id, @RequestBody BoardRequestDto requestDto) {
    return boardService.updateBoard(id, requestDto);		// 호출 및 반환
}

// 게시글 삭제
@DeleteMapping("/board/{id}/{password}")
public BoardResponseDto deleteBoard(@PathVariable Long id, @PathVariable String password) {
    return boardService.deleteBoard(id, password);		// 호출 및 반환
}
  • Controller, Service 등... 각 계층 = 잠겨있는 방

이를 문법적으로 분석해보면 이런 형태가 나온다

@ API 종류
public 반환타입 메서드명(매개변수타입 매개변수명) {
	return 반환값
}

이 中 게시글 수정을 더 자세히 보면 아래와 같다.

// 게시글 수정
@PutMapping("/board/{id}")
public BoardResponseDto updateBoard(@PathVariable Long id, @RequestBody BoardRequestDto requestDto) {
    BoardResponseDto boardResponseDto = boardService.updateBoard(id, requestDto);		// 호출
    return boardResponseDto;		// 반환
}
  • boardService의 updateBoard메서드에 매개변수를 담아 호출하고
  • 호출한 결과값을 BoardResponseDto객체의 boardResponseDto변수에 담아서
  • boardResponseDto를 Client에게로 반환한다.

BoardRequestDto -->

Controller 에서 각 기능의 '매개변수 타입'은 BoardRequestDto 였다.

@Getter
public class BoardRequestDto {
        private String title;           // 제목
        private String username;        // 작성자명
        private String password;        // 비밀번호
        private String contents;        // 작성 내용
}
  • BoardRequestDto = 열쇠

  • 각 '잠겨있는 방'으로 들어가기 위해서는 사용자가 '열쇠'(사용자가 입력한 정보)가 필요하다

    • title 열쇠, username 열쇠, password 열쇠, contents 열쇠로 잠겨있는 방을 연다.

<-- BoardResponseDto

Controller 에서 각 기능의 '반환 타입'은 BoardResponseDto 였다.

@Getter
public class BoardResponseDto {
    private Long id;        // 게시글 구분을 위한 id 값
    private String title;       // 제목
    private String username;    // 작성자명
    private String contents;    // 작성 내용
    private LocalDateTime createdAt;        // 게시글 생성 날짜
    private LocalDateTime modifiedAt;       // 게시글 수정 날짜

    private String msg;     // 게시글 삭제 시, 삭제 성공 메시지

    public BoardResponseDto(Board board) {
        this.id = board.getId();
        this.title = board.getTitle();
        this.username = board.getUsername();
        this.contents = board.getContents();
        this.createdAt = board.getCreatedAt();
        this.modifiedAt = board.getModifiedAt();
    }

    // 게시글 삭제 시, 삭제 성공 메시지
    public BoardResponseDto(String msg) {
        this.msg = msg;
    }
}
  • BoardResponseDto = 금 Gold

  • 열쇠로 잠겨있는 방들을 열고서 금고에까지 들어간 후, 거기서 금(사용자가 요청한 데이터)을 가지고 나온다.

    • id 금, title 금, username 금, contents 금, createdAt 금, modifiedAt 금을 가지고 나온다.

결론

사용자가 금고(DB)에 접근해서 원하는 황금의 종류(원하는 각각의 데이터) 얻기 위해서는 열쇠(requestDto)가 필요했고,
사용자가 금고에서 가지고 나오는 것은 자신이 원했던 황금(responseDto)이었다.

각 계층(Controller, Service 등...) 열쇠 or 황금에 아무런 영향을 미치지않고,
그저 각 열쇠를 자신이 다룰 수 있는 형태로 변환시켰을 뿐, '열쇠'가 가지는 기능(잠긴 방을 연다) 자체는 변하지 않았다.

profile
개발자로 거듭나기!

1개의 댓글

comment-user-thumbnail
2024년 4월 16일

게시글 삭제할 때 매핑을 @DeleteMapping("/board/{id}/{password}") 이렇게 하는 이유가 뭔가요?

답글 달기