programing

컨트롤러, 서비스 및 저장소 패턴에서의 DTO 사용 방법

goodsources 2023. 2. 25. 20:57
반응형

컨트롤러, 서비스 및 저장소 패턴에서의 DTO 사용 방법

컨트롤러, 서비스 및 저장소 패턴을 따르고 있는데, DTO가 여기에 어떤 영향을 미치는지 궁금할 뿐입니다.

컨트롤러는 DTO만 수신해야 합니까?제가 알기론, 당신은 그 기본 도메인 모델에 대해 외부세계가 알기를 원하지 않는군요?

도메인 모델에서 DTO로 변환하는 것은 컨트롤러 또는 서비스 계층 중 어느 쪽입니까?

오늘날 Spring MVC와 인터랙티브 UI를 사용한 프로그래밍에서는 웹 애플리케이션에는 실제로 4개의 계층이 있습니다.

  • UI 계층(웹 브라우저, JavaScript)

  • MVC가 을 단 스프링 )@Controller

  • 레이어,즉(스프링 컴포넌트)에을 달았다.@Service

  • 레이어,즉(스프링 컴포넌트)에을 달았다.@Repository

이러한 계층 중 하나가 기본 계층과 상호 작용할 때마다 계층 간에 데이터를 전송하기 위해 일반적으로 POJO인 데이터를 송수신해야 합니다.이러한 POJO는 데이터 전송 객체라고도 불리는 DTO입니다.

레이어 간에는 DTO만 사용해야 하며 반드시 동일할 필요는 없습니다.예를 들어 서비스 레이어는 데이터 액세스레이어로부터 수신한 DTO에 비즈니스 로직을 적용할 수 있기 때문에 서비스 레이어 API의 DTO는 데이터 액세스레이어 API와는 다릅니다.마찬가지로 컨트롤러는 프레젠테이션용으로 데이터를 재배치할 수 있습니다(그룹화, 요약 등).따라서 웹 브라우저로 전송되는 데이터는 서비스 계층에서 수신되는 데이터와 다릅니다.

완전한 추상화에서는 데이터 액세스 레이어의 API에 데이터 액세스의 테크놀로지(JDBC, JPA, NoSQL, 웹 서비스 또는 기타 데이터 저장/검색 수단 사용 여부)가 반영되지 않아야 합니다.즉, 엔티티 클래스가 데이터 액세스 계층 외부에 있으면 안 됩니다.

대부분의 프로젝트에서는 이러한 수준의 추상화가 필요하지 않으므로 일반적으로 DTO는 엔티티 클래스가 되어 데이터 액세스 계층에서 컨트롤러로 흘러갑니다. 컨트롤러는 뷰에서 사용하거나 웹 브라우저로 전송되며 JSON으로 인코딩됩니다.

프로젝트의 규모와 복잡성에 따라 다릅니다.프로젝트의 규모가 커질수록 각 레이어를 가능한 한 추상화/독립형으로 만드는 것이 중요합니다.

조직마다 다른 패턴이 있습니다.그것은 당신이 어떤 패턴을 따르느냐에 달려있다.제 개인적인 경험상, 저는 아래의 아키텍처 다이어그램을 따릅니다.

여기에 이미지 설명 입력

위 그림과 같이 DTO에서 엔티티 컨버세이션으로, 그 반대도 서비스 레이어 내에만 존재합니다.

간단한 답변은 다음과 같습니다.DTO(필요한 경우 아래 참조)는 특정 정보를 다른 곳으로 전송할 수 있는 것입니다.이것은 컨트롤러/어댑터/리포지토리/무엇이라고 부르든 상관없습니다.서비스 로직이 외부(시스템 경계 밖)에서 정보를 가져와 각각의 도메인 모델로 변환하여 사용할 수 있도록 하는 것이 어댑터의 작업입니다.

그리고 제 관점에서 이것은 Repository에도 적용됩니다.저장소는 외부 시스템(예: 데이터베이스 또는 다른 REST 서비스)에 데이터를 보관하고 요청 시 데이터를 가져옵니다.그러기 위해서는 도메인 모델을 심플한 DTO로 변환하여 타깃 시스템에서 유지할 수 있어야 합니다.

어댑터의 개념은 비즈니스 로직이 REST/SOAP/MySQL/... 프로토콜을 통해 표현되거나 전송되는 개체를 변환하는 방법을 알 필요가 없다는 것입니다.이것은 어댑터의 작업입니다.따라서, 필요에 따라서, DTO 는 어댑터에 보관해 주세요.

정말로 DTO가 필요합니까?

DTO는 시스템 내부의 또 다른 데이터 추상화입니다.당신은 그것들이 정말로 필요한지도 생각해야 한다.정보를 사용하여 수행할 작업에 따라 수행할 수도 있고 그렇지 않을 수도 있습니다.쿼리를 직접 작성하는 데이터베이스를 사용하여 데이터를 유지하는 경우(즉, ORM 매퍼를 사용하지 않음) 도메인 모델에서 관련 정보를 직접 추출할 수 있으므로 DTO가 전혀 필요하지 않을 수 있습니다.

한편, 오브젝트에 역직렬화(JSON용 잭슨 등)를 사용하는 경우, 이러한 툴에 데이터를 오브젝트로 시리얼화 및 역직렬화하려면 몇 가지 특별한 요건이 필요할 수 있습니다.여기서 DTO를 도메인 개체로 변환하거나 그 반대로 변환하려면 먼저 DTO를 사용해야 할 수 있습니다.


덧붙여서: 이 질문은 softwareengineering.stackexchange.com에서도 매우 좋은 답변입니다.

올바른 방법은 컨트롤러 -> 서비스 -> 구현 -> 저장소입니다.

저장소 계층은 기본 모델을 반환할 수 있으며, 구현 계층이 이를 수신하면 DTO로 변환할 수 있습니다.

언급URL : https://stackoverflow.com/questions/61303236/how-to-use-dtos-in-the-controller-service-and-repository-pattern

반응형