벌써 일주일이나 포스팅을 하지 못했다.
개발중인 서비스 런칭일이 한달도 남지않아서 UnitTest랑 QA랑 협업업체 대응 하느라 정신이없다...
한달전에 내가 개발한 코드를 보면 왜 이렇게 짰나 어질어질하다.
그만큼 가파르게 성장하고 있다는 반증인 것 같아서 내심 뿌듯하기도 하다 ^__^
본론으로 돌아와서 프로젝트를 하면서 자주 사용하지만 그 차이점을 제대로 모르고 사용했던게 있다.
바로 DTO 와 Interface 이다.
두개가 비슷하다고 생각해서 이 케이스에서는 둘중에 뭘 쓰는게 맞는거지? 하고 고민했던적이 많았다.
오늘 두개의 비슷한 점과 명확히 다른점에 대해 알아보고 제대로 이해를 해 볼 것이다.
DTO란?
말그대로 Data Transfer Object, 계층간 데이터 교환을 위해 사용하는 객체이다.
= 데이터를 담아서 전달하는 바구니
계층은 Repository패턴에서는 Controller, Service, Repository,
MVC패턴에서는 Model, View Controller 를 뜻한다.
계층간 데이터를 주고 받을때 어떤모양의 데이터 객체로 주고 받을지를 결정하게 되므로 설계 시 우선순위다.
엔티티는 절때로 요청이나 응답값을 전달하는 클래스로 사용하면 안되므로,
다른 클래스들에게 영향을 끼치지 않고 자유롭게 변경할 수 있는 DTO를 사용해야만 한다.
쉽게 말해서 데이터를 주고받을 객체의 타입을 체크해주기 위한 구조라고 하면 될 것이다.
이는 데이터 무결성을 유지하고 보안 취약성을 방지하는 데 크게 도움이 된다.
Interface란?
상호간에 정의한 데이터의 약속 혹은 규칙을 말한다.
TypeScript에서 변수, 함수, 클래스의 타입 체크를 위해 사용된다.
클래스와 유사하지만 인스턴스 생성이 불가능하고 모든 메소드는 추상 메소드로 이루어져 있다.
하지만 ES6에서 지원하지 않고 Typescript에서만 지원한다.
좀 더 자세히 알아보기 위해서 NestJS공식문서를 흝어보았는데,
타입체크를 위해서 DTO 사용을 안내하고 있다.
왜 하필 DTO로 안내를 하고 있는걸까?
아...!
방금 인터페이스 특징을 알아볼때 왜 NestJS에서 DTO사용을 안내하는지 나왔었다.
인터페이스는 ES6에서 지원하지 않아서, Javascript에서는 컴파일 도중 인터페이스가 제거된다.
따라서 NestJS의 런타임에 인터페이스를 참조할 수 없게 된다.
반면 DTO는 Class로 작성되기에 ES6표준이므로 참조 및 데이터타입을 지속적으로 추적이 가능하다.
이제 두개의 차이점에 대해서 더 알아보자.
DTO는 클라이언트와 서버 간에 전송되는 데이터에 중점을 두는 반면,
인터페이스는 개체의 구조와 응용 프로그램 내에서 예상되는 동작을 정의한다.
이렇게 서로 타입을 지정해주는 유사성이 있지만, 서로 관점이 다르다고 생각하면 되겠다.
코드로 한번보자.
해당 DTO는 응답값의 데이터 타입을 정의하는데에 사용되었다.
앞서 정리 했던대로 계층간의 데이터를 주고받을때 어떤 모양의 데이터 객체로 주고 받을지 정했다고 보면 된다.
뉴스컨트롤러부와, 투표컨트롤러부에서 같은방식으로 랭킹을 구하기 위해서
랭킹서비스부로 넘어가게 되는데 이때 RankingInterface로 어떠한 데이터를 넘길지 약속을 해주는 의미로
인터페이스를 사용하고 있다.
한마디로 DTO 및 인터페이스는
데이터의 모양을 정의하고 애플리케이션의 여러 부분이 특정 조건을 준수하도록 하여,
깨끗하고 일관된 코드를 유지하는데 도움이 된다.
마지막으로 내가 왜 비슷하다고 느꼈는지에 대해서 정리해보자면
1. 추상화
DTO와 인터페이스 모두 소프트웨어 시스템에서 추상화를 촉진(?)한다.
DTO는 여러 데이터 조각을 단일 개체로 캡슐화하여 데이터의 추상 표현을 제공하는 반면,
인터페이스는 특정 동작을 구현하는 클래스에 대한 추상 계약을 정의한다.
2. 모듈성
두 개념 모두 소프트웨어 설계의 모듈성에 기여한다.
DTO는 구성 요소의 내부 작업을 노출하지 않고 서로 다른 계층 또는 구성 요소 간에 데이터를 전달한다.
인터페이스는 구현할 클래스에 대한 계약을 정의하여 모듈식 설계를 가능하게 한다.
3. 유지 관리성 향상
DTO와 인터페이스는 모두 코드를 보다 유지 관리하기 쉽게 한다.
DTO는 계층 또는 구성 요소 간의 데이터 전송을 단순화하여 코드를 쉽게 리팩토링하거나 업데이트할 수 있도록 한다.
인터페이스는 공통 계약을 정의함으로써 우려사항을 명확하게 분리하고 코드 재사용성을 촉진하여,
시스템의 특정 부분을 쉽게 업데이트하거나 교체할 수 있다.
'Web > NestJS' 카테고리의 다른 글
[Nest.JS] Slack에 다양한 통계데이터 알림 자동화 (0) | 2023.07.02 |
---|---|
[Nest.JS] TypeOrm에서 페이지네이션 구현 (last_id, size) (0) | 2023.05.05 |
[Nest.JS] Axios, Http 비동기 통신 라이브러리 (0) | 2023.04.15 |
[Nest.JS] DTO 객체의 키 이름 변경 @Transform (0) | 2023.04.06 |
[NestJS] DB커넥션을 최소화하고 Service부에 부하를 줘야하는 이유. (0) | 2023.03.27 |