부트캠프 기록/Section3

[Spring MVC] API 계층_DTO(Data Transfer Object)

bbangduck 2022. 10. 29. 17:25

✅ 학습 목표

  • DTO(Data Transfer Object)
    • DTO가 무엇인지 이해할 수 있다.
    • DTO를 Controller 클래스에 적용할 수 있다.
    • DTO Validation이 무엇인지 이해할 수 있다.
//DTO 예시
public class MemberPostDto {
    private String email;
    private String name;
    private String phone;

    public String getEmail() {
        return email;
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }
}

 

DTO 정의

클라이언트에서 서버 쪽으로 전송하는 요청 데이터, 서버에서 클라이언트 쪽으로 전송하는 응답 데이터의 형식

 

DTO 필요성

-1. 코드의 간결성

요청 데이터가 많아지면 @RequestParam의 개수가 계속 늘어남

DTO 클래스가 바로 요청 데이터를 하나의 객체로 전달 받는 역할

 

- 2. 데이터 유효성(Validation) 검증의 단순화

유효성 검증: 서버 쪽에서 유효한 데이터를 전달 받기 위해 데이터를 검증하는 것

 if (!email.matches("^[a-zA-Z0-9_!#$%&'\\*+/=?{|}~^.-]+@[a-zA-Z0-9.-]+$")) {
            throw new InvalidParameterException();
        }

핸들러 메서드 내에 유효성 검증 로직이 직접 포함된다면 유효성 검증 로직들이 많아지면서 코드의 복잡도↑

HTTP 요청을 전달 받는 핸들러 메서드는 요청을 전달 받는 것이 주 목적이기 때문에 최대한 간결하게 작성되는 것이 좋음

DTO 클래스를 사용하면 유효성 검증 로직을 DTO 클래스로 빼내어 핸들러 메서드의 간결함을 유지

 

- 3. 비용이 많이 드는 작업인 HTTP 요청 수 감소

 

 

 

DTO 객체로 변환하기 위해 쓰이는 애너테이션

1. @RequstBody 애너테이션

클라이언트에게 전달받은 JSON 형식의 Request Body를 Dto 클래스의 객체로 변환을 시켜주는 역할

2. @ResponseBody 애너테이션

JSON 형식의 Response Body를 클라이언트에게 전달하기 위해 DTO 클래스의 객체를 Response Body로 변환하는 역할

 

Spring MVC에서는 핸들러 메서드에 @ResponseBody 애너테이션이 붙거나 핸들러 메서드의 리턴 값이 ResponseEntity일 경우, 내부적으로 HttpMessageConverter가 동작하게 되어 응답 객체(여기서는 DTO 클래스의 객체)를 JSON 형식으로 바꿔줌