이 토론이 반복적으로 발생한다고 생각하는 이유 중 하나는 필요한 모든 데이터가 포함 된 객체를 가져 와서 동일하거나 거의 동일한 객체로 변환하는 것이 진지한 고통 인 것처럼 보이기 때문입니다. 당신은 전달하고 있습니다.
사실, 그것은 PITA입니다. 그러나 그렇게하는 데는 몇 가지 이유가 있습니다 (위에 열거 된 것 외에).
- 도메인 개체는 매우 무거워 질 수 있으며 통화에 유용한 정보가 많이 포함되어 있습니다. 이 팽창은 전송, 마샬링 / 비 정렬 화 및 구문 분석 된 모든 데이터로 인해 UI 속도가 느려집니다. FE가 웹 서비스를 참조하고 AJAX 또는 다른 멀티 스레드 접근 방식으로 호출되는 수많은 링크가 있다고 생각하면 UI가 빠르게 느려집니다. 이 모든 것이 웹 서비스의 일반적인 확장 성을 얻습니다.
- 너무 많은 데이터를 노출하면 보안이 쉽게 손상 될 수 있습니다. 최소한 DTO 결과에서 사용자를 제거하지 않으면 사용자의 이메일 주소와 전화 번호가 노출 될 수 있습니다.
- 실제 고려 사항 : 하나의 오브젝트가 지속 도메인 오브젝트 및 DTO로 퍼레이드하려면 코드보다 더 많은 주석이 있어야합니다. 레이어를 통과 할 때 개체의 상태를 관리하는 데는 여러 가지 문제가 있습니다. 일반적으로 이것은 도메인 개체에서 DTO로 필드를 간단하게 복사하는 작업을 관리하는 데 훨씬 더 많은 PITA입니다.
그러나 변환 논리를 변환기 클래스 모음으로 캡슐화하면 상당히 효과적으로 관리 할 수 있습니다.
'convert (domainObj, toDto)'를 수행 할 수있는 lambdaJ를 살펴보십시오. 컬렉션에 사용하기 위해 과부하가 있습니다. 다음은이를 사용하는 컨트롤러 방법의 예입니다. 보시다시피 그렇게 나쁘지 않습니다.
@GET
@Path("/{id}/surveys")
public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {
checkDateRange(from, to);
MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);
}