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

gto1997님의 프로필 이미지
gto1997

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

프로젝트 구조 설명1 - 기본

DTO 위치

해결된 질문

작성

·

755

4

안녕하세요.
현재 db2 강의 첫 챕터의 프로젝트 구조 설명1 - 기본에서 궁금한 점이 있어서 질문을 남깁니다.
아직 지식이 부족한지 dto 위치 관련된 이전 답변들이 이해하기가 많이 어렵드라고요 ㅠ;;

선생님께서 dto 위치가 최종단이 어디인지에 따라서 위치가 정해진다고 하셨습니다.

그렇게 이해하고 나서 controller의 update, service의 update, repository를 보니 모두 매개변수로 ItemUpdateDto를 가지고 있드라고요.

그래서 고민을 하다가 dto는 결국 역할에 따라 분리된 controller, service, repository에서 필요한 data를 이동시키기 위한 운반체와 같다 생각을 하고

코드에서도 보면 controller, service에서는 ItemUpdateDto를 사용하지 않고 이동만 시키고 실질적으로 dto를 사용하는 단이 repository라는 것을 알게 되었습니다.

이와 같은 과정을 통해서 ItemUpdateDto의 위치가 repository에 위치해야하는 것인지, 이렇게 생각한 것이 맞는지 여쭤보고 싶습니다.

 

그리고 어디에 두기 애매한 dto는 따로 패키지에 둔다고 했는데 이런 애매한 dto는 controller, service, repository에서 각각 쓰이는 애매한 거라 생각이 드는데, 이러면 한방향이 아닌 순회하는 code가 되어서 안좋은것인지 궁금합니다.

답변 1

6

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

안녕하세요. gto1997님

우선 다들 이야기하는 DTO라는 것이 뭔가 복잡한 것이라기 보다는, 계층간에 단순히 데이터를 전달할 목적으로 사용하는 객체라고 보면 됩니다. 객체가 없이 데이터를 int, String 타입을 사용해서 하나하나다 풀어서 전달하면 파라미터에 전달되는 데이터가 너무 많겠지요? 그래서 객체를 만들고 그 안에 이런 데이터를 포함해서 한번에 전달하는 목적으로 사용하는 것이 DTO입니다.

사실 DTO의 위치가 어디에 있어야 하나요? 라는 질문에 대한 답을 본질적으로 이해하려면 계층간에 의존성을 잘 알아야합니다.

일반적인 웹 애플리케이션들은 보통 다음과 같은 계층간 의존성을 가지는데요.

contoller -> service -> repository(여기에 추가로 controller -> repository를 직접 참조하는 것도 허용할 수 있습니다.)

그래서 계층간 의존관계를 다음 둘다 허용한다고 가정하겠습니다.

  • contoller -> service -> repository

  • contoller -> repository

여기에서 만약 repository에서 데이터를 조회하거나 저장할 때 어떤 데이터가 필요하다면 해당 DTO는 repository에서 사용하므로 repository와 같은 곳에 두는 것이 모듈화 관점에서 효과적입니다.

여기서는 controller, service가 모두 repository 계층을 사용하기 때문에 해당 DTO는 자연스럽게 모든 계층에서 사용하게 됩니다.

그리고 이렇게 구성해두면 향후 controller, service 코드가 모두 변경되더라도 repository에 있는 DTO에는 영향을 주지 않습니다.

 

추가로 완전히 다른 스타일의 DTO도 있습니다. 예를 들어서 HTML의 Form 정보를 전달하는 목적으로 사용하는 DTO인데요. 보통 컨트롤러에 ItemForm과 같은 이름으로 전달됩니다.

이런 폼은 고객 UI 데이터와 밀접하기 때문에 controller 계층에 두면 됩니다.

그런데 문제는 service, repository에서 ItemForm을 사용하게 되면 의존관계가 완전히 꼬이게 됩니다.

  • controller(ItemForm) <- service (역방향)

  • controller(ItemForm) <- repository (역방향)

ItemForm을 참조하려다가 계층간 의존관계가 양방향이 되어버린 것이지요.

물론 여기서 더 나가서 DTO를 다른 패키지에 둘 수도 있습니다. 이 경우에도 이런 의존성에 대한 고민이 필요합니다.

정리하자면 전체 계층간 의존관계를 생각하면서 그 위치에 DTO를 두면 됩니다.

도움이 되셨길 바래요^^

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

너무 친절한 답변 감사합니다.

말씀해주신 예시를 보니 한번에 이해가 갔습니다.

여담으로 강사님 덕분에 스프링 학습을 함에 쓸데없는 시행 착오를 적게 겪으면서 체계적으로 지식을 쌓을수 있게 되어서 너무 감사합니다.

덕분에 비전공자 이지만 한단계씩 학습을 해나아가면서 조금씩 개발자란 꿈에 다가갈 수 있게 되는 거 같네요.

강사님의 조언대로 좋은 학습 습관, 체계를 유지하면서 성장을 하여 멋진 개발자가 되어서 기회가 되면 감사인사 전하러 가고 싶네요.

그날이 올때까지 열심히 하겠습니다.

그리고 강사님의 새로운 도전 항상 응원하고, 나중에 보탬이 될 수 있으면 좋겠네요ㅎㅎ 건강 잘챙기시고 힘내시길 바래요 :)

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

got1997님 열심히 공부하시고 원하시는 목표를 꼭! 이루시길 저도 응원합니다!

gto1997님의 프로필 이미지
gto1997

작성한 질문수

질문하기