https://examples.javacodegeeks.com/the-dto-data-transfer-object/
1. DTO 소개
여러 계층이 존재하는 큰 응용 프로그램을 가지고 있다면, 당신은 서로 다른 이런 계층들 간에 데이터를 "전송"해야 합니다. 데이터를 전송하려면 데이터를 보내기 위해서는 당신은 객체(DTO)로 캡슐화해야만 합니다. 이러한 유형의 객체 내부에 어떤 로직은 필요 없을 것이며, 직렬화 또는 역직렬화를 위한 일부 접근자, 변경자 및 파서만 가지고 있으면 될 것입니다.
2. DTO란?
프로그래밍 영역에서 DTO는 기본적으로 데이터를 프로세스 간에(응용 프로그램의 한 시스템에서 다른 시스템으로) 보낼 수 있도록 데이터를 캡슐화하는 객체입니다. 이 유형의 객체는 N 계층 애플리케이션 중 서비스 계층에서 가장 일반적으로 사용되며 해당 계층과 나머지 컨트롤러 계층 간에 데이터를 전송합니다.
DTO는 기본적으로 OOP 디자인 패턴이며 Python, C++ 및 Java와 같은 언어 환경에서 사용됩니다. DTO는 유지 관리 및 업데이트가 쉽습니다.
데이터베이스에서 일부 정보를 전송하고 데이터베이스 모델에 일부 민감한 정보가 포함된 경우 해당 객체를 계층 간에 전송하지 않고 필요한 정보만 전송하는 DTO를 사용하게 될 것입니다.
3. POJO로서의 DTO
POJO라는 것은 EJB(Enterprise Java Beans) 또는 종속성을 처리해야 하는 어떤 객체와는 반대로 일반적인 Java 객체를 설명하기 위한 Plain Old Java Objects의 약어 입니다.
DTO는 이 객체가 계층 또는 하위 시스템 간에 데이터를 전송한다는 점을 생각해 본다면 더 특별해 집니다.
모든 DTO는 POJO 객체이지만 모든 POJO가 DTO가 될 수 있는 것은 아닙니다. DTO가 아닌 POJO의 예로 비즈니스 로직이 있는 클래스를 생각해 볼 수 있습니다.
4. DTO를 사용하는 Java의 예
이 섹션에서는 Java에서 DTO의 예를 볼 수 있습니다.
우리가 데이터베이스에서 사용자에 대한 일부 정보를 반환하는 REST API를 가지고 있다고 가정해 보겠습니다. 데이터베이스 모델에는 REST API를 통해 노출하고 싶지 않은 많은 정보가 포함되어 있습니다. 이를 위해 우리는 사용자에 대한 일부 정보를 반환하는 DTO를 사용 하게 될 것입니다.
이것은 데이터베이스 테이블 필드와 일치하는 데이터베이스 모델인 UserModel입니다.
@Entity
public class UserModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String email;
private String username;
private String password;
private String country;
private String city;
private String address;
private String placeName;
private String accountNumber;
private String socialSecurityNumber;
private String postalCode;
// Getters and Setters
}
REST API를 통해 반환할 UserDTO 객체
public class UserDTO {
private String username;
private String email;
private String place;
private String phone;
// Getters and Setters
}
@RestController
public class UserController {
// create instance of the userService class
@Autowired
private UserService userService;
// create endpoint
@GetMapping("/users")
// when user hit the endpoint, it returns the response body
@ResponseBody
public List<UserDTO> getAllUsers() {
// call getAllUsers() method from the service which we created before
// store the result in a list of UserDTO
List <UserDTO> users = userService.getAllUsers();
// return usersLocation
return users;
}
}
5. 일반적인 실수
이 디자인 패턴이 단순하더라도 이것을 사용할 때 약간의 실수를 할 수 있습니다. 가장 흔한 실수 중 하나는 모든 경우에 이 패턴을 남용하는 것입니다. 그렇게 하면 클래스 수가 늘어나고 이러한 개체를 유지 관리하기가 어려워집니다. 가능한 한 적은 수의 클래스를 유지하고 기존 클래스를 사용하는 것이 좋습니다. 반대로 하나의 클래스를 여러 경우에 사용하지는 마십시오.
이 기사의 시작 부분에서 언급했듯이 DTO 클래스에 비즈니스 로직을 포함하는 것은 그리 권장하지 않습니다.
6. 마치면서
자바의 세계에서 당신이 호출자에게 노출하고 싶지 않은 데이터베이스에서 반환 된 어떤 정보나 혹은 레이어에서 다른 레이어로 초기에 수신 받은 객체들과 정확히 일치하지 않는 다른 매개변수를 보내고 싶거나 또는 여러개의 매개변수를 가지는 메서드 가지고 있을 때 아주 빈번히 이런 종류의 객체들이 사용 됩니다.
이 기사를 통해 DTO가 무엇인지, 왜 필요한지, 언제 사용해야 하는지, 이 디자인 패턴을 남용하는 몇 가지 일반적인 실수에 대해 알아 보았습니다.
이상.
'프로그래밍' 카테고리의 다른 글
Hello World: C, 어셈블리, 오브젝트 파일 그리고 실행파일 (0) | 2022.12.26 |
---|---|
[Java]갑자기~ 자바 네트워크 Sniffer 64비트 용 (0) | 2022.12.25 |
[Java]문자 반복 찾기 없이 가장 긴 하위 문자열 찾기 (0) | 2022.12.21 |
[C] 포인터와 구조체 (0) | 2022.12.18 |
[C#] 네트워크 스니퍼 및 분석기 프로그램 - 2부 (0) | 2022.12.16 |