[API설계] DTO/ENTITY 차이

2024. 8. 13. 18:17[Spring_gradle]

1. DTO (data transfer object) 

먼저 DTO는 데이터 전달용 (계층 간 데이터를 전달하기 위한 객체)으로 본다.  

web layer <-> service layer 간 데이터 전달한다. 

 

getter/setter, 생성자 메서드를 포함하며, 로직이 전혀 없다. 

 

DB구조보다는 전송할 데이터를 필요한 부분만 선택해서 단순화한 구조를 따른다. 

 

2. ENTITY 

ENTITY는 DB 테이블 구조를 직접 반영하는 객체이기 때문에, DB의 CRUD 작업에 사용된다. 

한 행(ROW)에 해당하는 데이터를 담고 있다.  

 

비지니스 로직을 포함하지 않는다. 

 

3. 데이터 전달 방식

1) 클라이언트에서 DTO 형태로 데이터 전송

2) 서버에서 DTO 수신

- 클라이언트로부터 DTO형태 데이터를 수신 (전달용 객체O, DB형태 객체X)

3) DTO를 ENTITY로 변환

- 수신한 DTO데이터를 기반으로 ENTITY객체 생성 (하나의 ROW에 들어갈 데이터가 생성되는 곳)

public User convertToEntity(UserDTO userDTO) {
    User user = new User();
    user.setUsername(userDTO.getUsername());
    user.setEmail(userDTO.getEmail());
    // 필요한 다른 필드 설정 및 유효성 검사
    return user;
}

4) ENTITY를 DB에 저장

repository.save(entity)

5) DB에서 ENTITY 조회하거나 데이터처리(수정/삭제 등)를 할 때, DTO로 변환

public UserDTO convertToDTO(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setUsername(user.getUsername());
    userDTO.setEmail(user.getEmail());
    // 필요한 다른 필드 설정
    return userDTO;
}

 

이와같이 도메인(ENTITY)과 DTO를 분리하는 이유는 1) DB에 함부로 값이 변경되지 않도록 2) DTO(데이터처리용)를 사용할 때마다 DB에 있는 내용을 다 호출하면 처리시간이 오래 걸리기 때문이다.

이러므로 DTO에서 도메인을 받아오고 사용할 데이터들만 부분적으로 사용하면 된다.

요약

  • 클라이언트는 DTO를 사용해 서버로 데이터를 전송합니다.
  • 서버는 DTO를 받아 ENTITY로 변환한 후, 데이터베이스에 저장합니다.
  • 데이터를 조회할 때는 ENTITY를 DTO로 변환하여 클라이언트로 전송합니다.