Entity 를 DTO로 변환하여 사용하는 이유?

헨도·2024년 6월 30일
0

SpringBoot

목록 보기
6/23
post-thumbnail

사내 자바 프로젝트 코드를 분석하는 도중, 책에서 배운 코드는 Service 파일에서 return 시 바로 데이터를 반환했지만 프로젝트 내에서는 Entity를 DTO로 변환해서 return 하는 것이다.

책에서 사용한 코드

public List<Article> index() {
    return articleRepository.findAll();
}

프로젝트에서 사용한 코드

@Transactional
public List<WarehouseDto> getWarehouses() {
    return warehouseRepository.findAll().stream()
        .map(warehouseMapperService::toWarehouseDto)
        .toList();
}
  • 이 코드에서 map 함수를 이용하여 toWarehouseDto 함수를 이용하여 DTO 변환을 하는 것이다.

그럼 왜 변환하여 사용하는지 궁금해서 차장님께 여쭤보았다...

변환하여 사용하는 이유?

1. Entity 를 그대로 사용하면 API 호출 시, 데이터 구조를 알 수 있다.

  • 변환하지 않고 사용하면 return 될 때 필요한 데이터 및 불필요한 데이터를 포함하여 DB 내 데이터들을 반환하므로 사용자 입장에서 의도적으로 데이터 구조를 알 수 있다는 부분이다.

2. DTO 를 사용하면 필요한 필드만 꺼내서 사용할 수 있다.

  • 위의 1번 내용과 비슷하지만, DTO 를 사용하면 필요한 데이터를 가공해서 사용할 수 있기때문에 데이터 구조를 지킬 수도 있으며, return 데이터의 이름도 바꾸어 전달할 수 있기 때문에 더욱 더 안전하게 데이터를 주고받을 수 있다.

3. Entity 에 Validation 적용은 어렵다.

  • Request 데이터가 들어왔을 때, 우리가 원하는 데이터를 추출하기 위해선 여러가지의 데이터를 점검해야한다.
    그렇지만 Request 데이터에는 우리가 원하는 데이터로 추출하기 위해서 걸치는 절차를 추가하기에는 매우 힘들기 때문에 DTO 를 이용하여 쉽게 점검한다.

4. 무한순환 참조가 생길 수 있음을 방지한다.

  • 단일 Entity 를 사용하면 해당되지 않는다.
  • 우리는 DB Table 을 만들 때, Master - Detail 구조로 테이블을 만든다.
    그럼 Master 테이블에는 여러 테이블들의 키를 이용하여 Join 할 수 있는데 이 키들이 맞물려 Join 되면 결국은 멈추지 않고 무한순환이 될 수 있다.
    이를 방지하기 위해 DTO 를 사용하면 무한순환 참조를 막을 수 있다.
profile
Junior Backend Developer

0개의 댓글