[SpringBoot] DTO란?

정재현·2024년 1월 22일
0

Spring Boot

목록 보기
19/19
post-thumbnail

DTO(Data Transfer Object)란

데이터 전송 및 이동을 위해 생성되는 객체를 의미

DTO 사용처

  • Client에서 보내오는 데이터를 객체로 처리할 때 사용
  • 서버의 계층간의 이동에도 사용
  • DB와의 소통을 담당하는 Java클래스를 그대로 Client에 반환하는 것이 아니라 DTO로 한번 변환한 후 반환할 때도 사용

DTO 사용 방법

  • Request의 데이터를 처리할 때 사용되는 객체는 RequestDto,
    Response를 할 때 사용되는 객체ResponseDto라는 이름을 붙여 DTO클래스를 만들 수 있다.
    → 절대적인 규칙은 아니기 때문에 조직에 따라 규칙이 다를 수 있다.

DTO를 사용하지 않은 예시

User.java

public class User {
	public Long id;
    public String name;
    public String email;
    public String password;
    public DetailInformation detailInformation; 
    
    //비즈니스 로직, getter, setter 등 생략
}

UserController.java

@GetMapping
public RepositoryEntity<User> showArticle(@PathVariable Long id) {
	User user = userService.findByUd(id);
    return ResponseEntity.ok().body(user);
}

Controller가 클라이언트의 요청에 대한 응답으로 도메인 Model을 User를 넘겨주면서 생기는 문제

  • 도메인 Model의 모든 속성이 외부에 노출된다.
    • UI 화면마다 사용하는 Model의 정보는 다르지만, Model 객체는 UI에서 사용하지 않을 비즈니스 로직 등 User의 민감한 정보 혹은 불필요한 데이터까지 보유하고있어 외부에 노출이 되는 보안 문제가 생긴다.
  • UI 계층에서 Model의 메서드를 호출하거나 상태를 변경시킬 위험이 존재
  • Model과 View가 강하게 경합되어, View의 요구사항 변화가 Model에 영향을 끼치기 쉽다.
    • UseEntity의 속성이 변경되면, View가 전달받을 JSON 및 프론트엔드 JS 코드에도 변경을 유발하기 때문에 상호간 강하게 결합된다.

DTO를 사용한 예시

UserDto.java

public class UserDto {
	public final long id;
    public final String name;
    public final String email;
    
    //생성자 생략
    
    public static UserDto from(User user) {
    	return new UserDto(user.getId(), user.getName(), user.getEmail());
    }
}

Usercontroller.java

@GetMapping
public ResponseEntity<UserDto> showArticle(@PathVariable Long id) {
	User user = userService.findById(id);
    return ResponseEntity.ok().body(UserDto.from(user));
}

DTO의 사용으로 언급된 문제 해결

  • DTO를 사용함으로써 도메인 Model을 캡슐화하고, UI 화면에서 사용하는 데이터만 선택적으로 보낼 수 있으므로 앞서 언급한 문제들을 해결할 수 있다.

정리하기

DTO는 클라이언트 요청에 포함된 데이터를 담아 서버 측에 전달하고, 서버 측의 응답 데이터를 담아 클라이언트에 전달하는 계층간 전달자 역할


profile
공부 기록 보관소

0개의 댓글