API계층_DTO

김예인·2023년 6월 14일

백엔드 공부일지

목록 보기
37/43
post-thumbnail

DTO(Data Transfer Object)

서로 다른 계층 간 데이터 전송 용도로 데이터를 담고있는 객체
요청 데이터를 하나의 객체로 전달받는 역할

  • 멤버 변수와 그에 대한 Getter/Setter 메서드로 구성
  • 필요한 데이터만 딱 담아 전송/저장 목적의 간결한 객체이기에 비즈니스 로직을 처리 X

🛎 여기서 말하는 서로 다른 계층은 무슨 계층을 의미하는거지?
웹 애플리케이션의 3단계 계층!

  • 프레젠테이션 계층
  • 애플리케이션 계층
  • 데이터 엑세스 계층

1. DTO 클래스 생성

Controller 에서 정보를 받고 넣으니 코드가 간결하지 않다.
데이터를 받고 넣는 MemberDto 클래스를 만들어 대신하게 하자!

(* ⌘N 을 통해 Getter/Setter 쉽게 생성)

controller 클래스의 코드가 간결해졌다!

  • @RequestBody : JSON 형식의 Request Body를 MemberPostDto 클래스의 객체로 변환을 시켜주는 역할
  • @ResponseBody : DTO 클래스의 객체를 Response Body로 변환하는 역할
    - 핸들러 메서드의 리턴 값이 ResponseEntity일 경우, 내부적으로 HttpMessageConverter가 동작하게 되어 응답 객체(여기서는 DTO 클래스의 객체)를 JSON 형식으로 바꿔줌

데이터 유효성(Validation) 검증

클라이언트의 요청 데이터가 서버가 기대하는 형식에 부합하는지 검증하는 것

핸들러 메서드가 HTTP 요청을 전달받는것에 집중할 수 있도록,
데이터 유효성 검사 로직도 DTO 클래스를 사용


2. DTO로 데이터 유효성 검증하기

  1. 핸들러 메서드 내 유효성 검증

다른 입력값에 대한 유효성 검증도 추가된다면, 핸들러 메서드 내 코드의 복잡도가 증가하겠지?

HTTP 요청을 전달받는 핸들러 메서드는 요청을 전달받는 것이 주목적!
최대한 간결하게 작성하자!


2. DTO로 데이터 유효성 검증하기

(1) 유효성 검증을 위한 의존 라이브러리 추가

build.gradle 파일 > dependencies 항목 > Spring Boot에서 지원하는 Starter 추가

(2)


그래서 DTO 왜 써?

  • Entity 객체에 노출하면 안되는 정보는 빼고 필요한 정보만 전송 가능
  • HTTP 요청의 수를 줄여 비용을 절감하기 위해
  • 도메인 객체와의 분리

🛎 HTTP 요청이 뭘까?

  • 네트워크를 통해 클라이언트와 서버 간 데이터를 전송하는 작업

🛎 HTTP 요청은 왜 비용이 많이 들까?

  • 네트워크 비용 : HTTP 요청은 데이터 전송을 위해 네트워크 대역폭을 사용하는데, 많은 요청이 동시에 발생하면 제한 자원인 대역폭 부족
  • 시간 비용 : 네트워크의 물리적 거리, 혼잡도 등에 따른 응답 시간 소요
  • 서버 자원 비용 : 서버는 HTTP 요청 처리를 위해 하드웨어 자원을 사용하기에 많은 요청 시 서버 부하

🛎 그럼, DTO 를 쓰면 왜 HTTP 요청 수가 줄어?

  • DTO를 사용하면 데이터 일괄 한번에 전송 가능
  • DTO 객체에 필요한 데이터 필드만 포함시켜, 불필요한 데이터 전송 방지

단점도 있어!

  • 각 Controller 클래스에 해당하는 DTO 클래스를 직접 추가 작성 해야해 번거로움

JSON 직렬화(Serialization)와 역직렬화(Deserialization)

역직렬화 : 클라이언트가 준 JSON 데이터를 DTO 같은 JAVA 객체로 변환
직렬화 : JAVA 객체를 응답을 위해 JSON 형식으로 변환

profile
백엔드 개발자 김예인입니다.

0개의 댓글