인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

edu5님의 프로필 이미지
edu5

작성한 질문수

실전! Querydsl

프로젝션과 결과 반환 - @QueryProjection

DTO 사용 범위에 대한 질문

작성

·

601

3

강의에서 일반적으로 repository에서 만든 dto를 service와 controller에서 사용한다고 하셨습니다.

그런데 이전 강의에서 tuple은 repository계층에서만 사용하고 service나 controller에서 사용하는건 비추한다고 하셨습니다.

tuple의 경우엔 하부 구현기술에 class이니 앞단에서 알면 좋지 않다.(jpa를 바꾸게 되는 경우 수정할 로직이 많아진다) 라고 이해했는데요.

dto도 비슷하지 않을까 생각이 들었습니다. repository에서 만든 dto를 바꾸게 될 경우 앞단에서 수정할 로직이 많으니까요.

dto와 tuple(resultset 등)은 다르게 보아야 하는걸까요?

repository에서 만든 dto는 repository나 service에서까지만 사용하고 controller에서는 새로운 dto로 매핑하는게 맞을까요? 아니면 repository는 뒷단(안쪽) 영역이니 앞쪽에서 의존성을 가져가도 된다고 생각하는게 맞을까요?

 

답변 2

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. midasin5님

DTO는 특정 구현 기술에 종속적이지 않은 순수한 자바 객체입니다.

반면에 여기서 설명한 Tuple은 특정 데이터 접근 기술에 종속적인 기술입니다. 이후 다른 데이터 접근 기술로 변경하게 되면 해당 Tuple을 사용한 모든 코드도 함께 고쳐야 합니다.

감사합니다.

2

안녕하세요, 저도 같은 고민을 했던 것에 대해 공유하고자 합니다.

첫 번째로, 영한님 말씀대로 Tuple과 DTO는 다르게 보는게 맞습니다.
두 번째로, 그렇다면 "DTO는 어느 계층까지 끌고가는가?"에 대해서는 'DTO의 사용범위'등으로 검색해보시면 많은 정보가 나올텐데요, 이것은 개인적인 취향이나 목적에 따라 결정이 달라질 수 있습니다.

만약에 "완전히 동일한 DTO를 Repository <-> Service <-> Controller에서 두 개씩 만들어서 사용해야하는가?"라고 한다면, 저는 개인적으로 코드 중복을 줄이자는 측면에서 DTO 중복은 불필요하다고 생각합니다. 따라서 제 의견으로는 "최대한 Controller <-> Service에서 사용할 DTO와 Service <-> Repository에서 사용할 DTO를 분리하되, 완전히 동일한 DTO라면 중복해서 사용하자." 정도로 정리할 수 있습니다.

edu5님의 프로필 이미지
edu5
질문자

의견 감사드립니다

edu5님의 프로필 이미지
edu5

작성한 질문수

질문하기