Programming/Refactoring

DTO를 Inner static class로 간결하게 관리하기! (+ domain 분리)

JaeHoney 2022. 4. 16. 18:21

DTO 관리

API가 클라이언트(Client)가 보낸 Request Payload를 받을 때 RequestDto를 사용하고, 결과 값을 내려줄 때 ResponseDto를 사용합니다.

 

문제는 API 스펙을 고도화할수록 Dto가 너무 많아진다는 것입니다.

 

End-point 요청에 따라 Request Body가 다르고 Response Body도 다릅니다.

 

그래서 API 스펙을 많이 뽑을 수록 Dto 패키지는 아래 처럼 지저분해집니다. (이미지 길이 보니까 더 길어 보이네요..!)

 

 

Domain 분리

프로젝트가 어느정도 크기가 커지면 로직 안에서 동작하는 클래스들은 domain별로 관리하는 게 좋습니다.

 

domain별로 class를 정리합니다.

 

아까보다는 좋긴 하지만, 더 간결해질 방법이 있습니다.

 

Inner static class

RequestDto와 ResponseDto를 묶어서 관리할 수 있으면 편합니다.

 

Inner static class를 사용하면 깔끔하게 해결할 수 있습니다.

public class ProductDto {
    
    @Getter
    @AllArgsConstructor
    @Builder
    public static class RequestDto {
        private String productNm;
        private Integer price;
        private String largeCatCd;
        private String smallCatCd;
        private Integer totalCount;
    }

    @Getter
    @AllArgsConstructor
    @Builder
    public static class ResponseDto implements Serializable {
        private Long id;
        private String productNm;
        private String titleImg;
        private Integer price;
        private Integer disPrice;
        private Integer salePrice;
    }

    @Getter
    @AllArgsConstructor
    @Builder
    public static class AdminProductResponseDto {
        private Long id;
        private String productNm;
        private String titleImg;
        private Integer price;
        private Integer disPrice;
        private Integer purchaseCount;
        private Integer totalCount;
        private Integer rateAvg;
    }
    
}

 

Static function은 클래스의 객체를 생성하지 않고도 function을 사용할 수 있습니다.

 

Inner static class 역시 상위 클래스의 객체를 생성하지 않고 생성자를 사용할 수 있게 합니다.

 

훨씬 깔끔해진 dto 패키지를 볼 수 있습니다.

 

 

Dto를 Inner static class로 관리하면 응집도가 높아진다는 장점이 있습니다.

 

가령, 상품주문에 문제가 생겼다고 한다면, ProductOrderDto를 한 눈에 찾을 수 있어서 에너지 낭비를 줄일 수 있습니다.

 

감사합니다.