스프링 DTO 클래스 추출 코드 리팩토링

dropKick·2020년 10월 5일
0

개요

  • DTO를 컨트롤러 내부에서 사용
  • DTO가 많아져 별도 패키지로 분리

DTO란?

✅ 클라이언트와 서버 간 데이터를 주고받을 때 사용되는 객체
✅ 엔티티(Entity)와 분리하여 비즈니스 로직과 요청/응답 데이터를 명확히 구분
✅ API에서 Request와 Response를 분리하여 유지보수성을 높일 수 있음

컨트롤러 내부 DTO 초기 구현

@RestController
@RequestMapping("/api")
public class UserApiController {

    @PutMapping("users/{id}")
    public UsersUpdateResponseDto updateUser(@PathVariable("id") Long id,
                                             @RequestBody @Valid UsersUpdateRequestDto request) {
        ...
    }

    //  DTO
    public static class UsersUpdateRequestDto {
        private String name;
        private String email;
    }

    public static class UsersUpdateResponseDto {
        private Long id;
        private String name;
        private String email;
    }
}
  • 처음 구현 시에는 유저 컨트롤러에서 할 일이 적었으나 조회/업데이트/추가/수정 등 계속 늘어났음
  • API별 복잡성을 감소시키기 위해 DTO 분리

DTO 패키지 분리

프로젝트 구조 변경
src/main/java/com/example/project/
 ├── controller/
 │    ├── UserApiController.java
 │    ├── PostApiController.java
 ├── dto/
 │    ├── user/
 │    │    ├── UsersUpdateRequestDto.java
 │    │    ├── UsersUpdateResponseDto.java
 │    ├── post/
 │    │    ├── PostCreateRequestDto.java
 │    │    ├── PostResponseDto.java
 ├── entity/
 │    ├── User.java
 │    ├── Post.java
컨트롤러
@RestController
@RequestMapping("/api")
public class UserApiController {

    @PutMapping("users/{id}") // 사용자 수정
    public UsersUpdateResponseDto updateUser(@PathVariable("id") Long id,
                                             @RequestBody @Valid UsersUpdateRequestDto request) {
        ...
    }
}
DTO
package com.example.project.dto.user;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class UsersUpdateRequestDto {
    private String name;
    private String email;
}
package com.example.project.dto.user;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class UsersUpdateResponseDto {
    private Long id;
    private String name;
    private String email;
}
profile
안아줘요

0개의 댓글

관련 채용 정보