DTO를 도메인의 이너 클래스로 관리해, DTO 관리 편의성을 높여봅니다.
너무 많은 DTO 클래스가 생겨 관리가 힘들어질 수 있습니다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Member(final String name) {
this.name = name;
}
}
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class MemberCreateRequest {
private String name;
}
@Getter
@AllArgsConstructor
public class MemberCreateResponse {
private Long id;
private String name;
}
MemberCreateRequest
, MemberCreateResponse
벌써 두개의 DTO 클래스가 필요해집니다.MemberxxxRequest
이런 DTO 클래스가 점점 늘어나게 되어 DTO를 선별하고 구분하는데 인적 리소스가 소모되게 될것입니다.과거 진행한 프로젝트의 수많은 DTO 클래스들...
DTO를 관리하는 (인적)비용이 줄어듭니다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Member(final String name) {
this.name = name;
}
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class Request {
private String name;
}
@Getter
@AllArgsConstructor
public static class Response {
private Long id;
private String name;
}
}
@RestController
@RequestMapping("/api/member")
public class MemberController {
@GetMapping("/{id}")
public ResponseEntity<Member.Response> getMember(@PathVariable final Long id) {
return ResponseEntity.ok(new Member.Response(id, "unluckyjung"));
}
@PostMapping
public ResponseEntity<Member.Response> create(@RequestBody final Member.Request request) {
//...저장 로직
return ResponseEntity.created(URI.create(String.format("/api/member/%d", 1L)))
.body(new Member.Response(1L, request.getName()));
}
}
도메인이 DTO의 형태를 알고 있게 되는건 아닐까? 둘의 결합도가 높아지는건 아닐까?
결론적으로는 위의 예시와같은 형태는 괜찮다라고 생각합니다.
도메인 <-> DTO
끼리 연관이 생긴다는것보다는, 해당 도메인과 관련된 DTO를 같이 묶어두기 위한 정도인거죠.응집도가 높아지는 효과가 있습니다.
DTO를 inner class로 관리하기
(https://unluckyjung.github.io/dev/2022/02/20/Dto-InnerClass/)