Post

DTO를 각 요청마다 분리해야하는 이유

DTO에 대해 처음 공부했을 때 각 요청마다 DTO를 분리하는 이유가 단순히 로직 수행에 필요없는 데이터가 dto 객체에 같이 돌아다니기 때문이라고 생각했다.

하지만 시간이 지나 @Validated와 BindingResult 등 검증에 대해 공부하다보니 , 위와 같은 이유도 분명히 있지만 왜 각 요청마다 DTO를 분리해야하는지 깨닫게 되었다.

Item이라는 객체가 있고, 그 item을 저장하는 요청과 업데이트하는 로직이 있다고 가정하고 각 케이스에 대해 알아보자.

DTO 분리 전

1
2
3
4
5
6
7
@Data
public class Item {
    private Long id;
    private String itemName;
	private Integer price;
    private Integer quantity;
}

위와 같은 Item 객체가 있다고 했을 때

저장하는 로직에 사용되는 필드 변수들은 itemName, price, quantity이고, 수정에 필요한 필드는 id, itemName, price, quantity라고 가정하자. (저장할 때는 sequence로 id 지정)

그리고 상품 저장 시 다음과 같은 요구사항을 적용시키자.

  • 상품 가격은 1000원 이상
  • 상품 수량은 9999개 이하

그럼 다음과 같이 Bean Validation를 적용시킬 수 있을 것이다.

1
2
3
4
5
6
7
8
9
@Data
public class Item {
    private Long id;
    private String itemName;
	@Min(1000)
    private Integer price;
    @Max(9999)
    private Integer quantity;
}

근데 여기서 다음과 같은 요구사항이 추가되었다.

  • 수정 시 수량을 무제한으로 풀기

이때 문제가 발생한다.

상품 저장과 수정 모두에 Item 객체를 사용하고 있기 때문에 요구사항이 변경되면서 두 요청의 검증 조건이 서로 달라 Item 객체를 그대로 사용할 수 없다.

이런 문제를 해결하기 위해 DTO를 분리해야한다.

DTO 분리

1
2
3
4
5
6
7
8
@Data
public class ItemSaveDto {
    private String itemName;
	@Min(1000)
    private Integer price;
    @Max(9999)
    private Integer quantity;
}
1
2
3
4
5
6
7
8
@Data
public class ItemUpdateDto {
    private Long id;
    private String itemName;
	@Min(1000)
    private Integer price;
    private Integer quantity;
}

이런 문제를 해결하기 위해 위 코드와 같이 ItemSaveDto와 ItemUpdateDto로 각 요청에 알맞는 DTO를 생성해주면 된다.

이로써 Save시 필요한 데이터와 검증 조건을 적절히 설정할 수 있고, Update시 수량의 검증 조건을 빼 요구사항을 잘 충족시킬 수 있다.

This post is licensed under CC BY 4.0 by the author.