DTO(Data Transfer Object)
- 소프트웨어 시스템에서 데이터를 전송하거나 교환하는데 사용되는 객체
- 비즈니스 계층과 프레젠테이션 계층 사이에서 데이터 전달을 위해 사용
DTO는 "Data Transfer Object"의 약어로, 데이터 전송 객체를 의미합니다.
DTO는 소프트웨어 시스템에서 데이터를 전송하거나 교환하는 데 사용되는 객체입니다.
또한, DTO를 사용하지 않아 깊은 곳에 있는 엔티티가 프레젠테이션까지 나가버리면, 엔티티의 내용이 변경 되는 위험도 수반합니다
DTO는 주로 다음과 같은 상황에서 사용됩니다:
- 서로 다른 서비스나 애플리케이션 간에 데이터를 전송할 때
- 데이터베이스와 애플리케이션 사이에 데이터를 전송할 때
- 프레젠테이션 레이어와 비즈니스 레이어 간에 데이터를 전송할 때
DTO 장점
Loose Coupling
- 각 계층이 DTO를 통해 데이터를 교환함으로써, 각 계층간의 결합도를 낮추는데 도움이 됩니다.
- 이로 인해 각 계층은 독립적으로 변경하거나 업데이트할 수 있게 됩니다.
캡슐화
- DTO는 데이터와 그 데이터에 대한 연산을 한데 묶는 역할을 합니다.
- 이는 데이터의 무결성을 보장하며, 데이터에 대한 접근을 제어합니다.
Network Efficiency
- DTO는 네트워크를 통해 전송되는 데이터의 양을 최소화하는 데 도움이 됩니다.
- 이는 네트워크 효율성을 높이며, 성능을 향상시킵니다.
예시
아래 코드에서 MemberDto
는 DTO(Data Transfer Object)로 사용되고 있습니다.
DTO는 계층간 데이터 교환을 위한 객체로, 주로 비즈니스 로직을 처리하는 서비스 계층과 사용자에게 결과를 보여주는 뷰 계층 사이에서 데이터를 주고 받는데 사용됩니다.
MemberDto
는 다음과 같이 정의되어 있습니다:
public record MemberDto(Long id, String nickname, String email, LocalDate birthDay) {}
이 MemberDto
는 Member
엔티티의 데이터를 서비스 계층에서 뷰 계층으로 전달하기 위해 사용되는 객체입니다.
MemberDto
는 Member
엔티티의 필드 중 id
, nickname
, email
, birthday
만을 가지고 있습니다.
Dto 선언에 사용 된 record 타입은 java16부터 지원하는 데이터의 불변성을 보장하는 타입입니다…!
Dto는 record 타입을 사용함으로써 데이터 전송에 온전히 집중 할 수 있게 되죠
만들어진 Dto는 컨트롤러에서 아래와 같이 사용 됩니다
@Operation(summary = "회원정보 등록")
@PostMapping("")
public MemberDto register(@RequestBody RegisterMemberCommand command) {
var member = memberWriteService.create(command);
return memberReadService.toDto(member);
}
Typscript Interface와 DTO의 차이
뭔가, TS의 인터페이스와 DTO가 비슷하다는 인상을 받았습니다.
하지만, DTO(Data Transfer Object)와 TypeScript의 인터페이스는 비슷한 점이 있지만, 목적과 사용 방식에는 차이가 있습니다.
DTO는 서로 다른 계층이나 시스템 간에 데이터를 전송하는 객체입니다.
예를 들어, 웹 애플리케이션에서 클라이언트와 서버 간에 데이터를 주고받는 데 사용되며, 이를 위해 특정 구조를 가지고 있습니다.
일반적으로 DTO는 순수한 데이터를 가지며, 비즈니스 로직이나 동작을 포함하지 않습니다.
반면에 TypeScript의 인터페이스는 객체의 구조를 정의하는 역할을 합니다.
이는 클래스가 특정 조건을 충족하도록 강제하거나, 함수의 매개변수 또는 반환 값의 형태를 정의하는 데 사용됩니다.
이러한 인터페이스는 컴파일 타임에만 존재하며, 런타임에는 제거됩니다.
그래서 DTO와 TypeScript 인터페이스는 모두 특정 데이터 구조를 정의하는데 사용되지만,
이들의 주요 목적과 사용 방식은 다릅니다.
하지만, TypeScript를 사용하여 DTO를 정의하는 a것이 가능하며, 이 경우 인터페이스를 사용하여 DTO의 구조를 정의할 수 있습니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Backend' 카테고리의 다른 글
페이지네이션 (0) | 2023.06.09 |
---|---|
조회 최적화를 위한 인덱스 (2) | 2023.06.02 |
정규화 (0) | 2023.06.01 |
소프트 파싱과 하드 파싱 (0) | 2023.06.01 |
MySQL 아키텍처 (0) | 2023.06.01 |