[Spring Boot] Entity와 DTO에 대하여

2jjong·2023년 11월 1일
0

Entity(엔티티)

Entity(엔티티)는 데이터베이스에서 사용되는 데이터 모델을 나타내는 객체입니다. 주로 데이터베이스 테이블과 매핑되며, 어플리케이션의 핵심 비즈니스 논리를 표현합니다. 엔티티 클래스는 데이터베이스의 테이블과 1:1로 매핑되기 때문에 데이터베이스 스키마와 밀접한 관련이 있습니다.

Entity의 역할

  • 데이터베이스와의 통신
  • 비즈니스 로직 수행
  • 영속성 관리 (데이터베이스에서 읽기/쓰기)

Entity 사용법

Spring Boot에서 Entity를 사용하는 방법을 간단하게 알아보겠습니다.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    private String email;
    // getter, setter, constructor 등...
}

User 클래스를 만들고 @Entity 어노테이션을 지정해주면 JPA에 의해 Entity로 관리됩니다.


DTO (Data Transfer Object)

DTO(Data Transfer Object)는 엔티티로부터 클라이언트로 전송되는 데이터의 모델을 나타냅니다. 주로 엔티티의 일부 데이터를 가지고 있으며, 클라이언트와 서버 간의 효율적인 데이터 전송을 위해 사용됩니다. DTO는 엔티티로부터 필요한 정보만을 추출한 가벼운 객체입니다.

DTO의 역할

  • 클라이언트와의 효율적인 데이터 교환
  • 불필요한 데이터의 노출 방지
  • 엔티티의 구조 변경에 대한 유연성 제공

DTO 사용법

다음은 Spring Boot에서 DTO를 사용하는 방법을 간단하게 알아보겠습니다.

public class UserRequestDTO {
    private String username;
    private String email;
    // getter, setter, constructor 등...
}

public class UserResponseDTO {
    private Long id;
    private String username;
    private String email;
    // getter, setter, constructor 등...
}

DTO는 클라이언트와의 데이터 교환을 위한 객체로 사용되므로 클라이언트에서 요청을 받는 RequestDTO, 요청에 대한 응답을 반환하는 ResponseDTO로 사용될 수 있습니다.


왜 DTO를 사용해야 하는가?

  • 데이터 전송 최적화: 필요한 데이터만을 클라이언트로 전송하여 대역폭을 절약하고 응답 시간을 최적화합니다.
  • 보안 강화: 클라이언트에게 노출되어서는 안 되는 정보를 숨기고, 필요한 정보만을 노출시켜 보안을 강화할 수 있습니다.
  • 클라이언트와 서버 간의 결합도 낮춤: 클라이언트는 자신이 필요한 데이터에만 의존하게 되므로, 서버의 엔티티 변경이 클라이언트에 미치는 영향을 최소화합니다.

DTO와 Entity 변환

DTO와 Entity 간의 변환 작업은 주로 서비스 계층에서 이루어지는데 그 이유로는 여러가지가 있습니다.

  • 비즈니스 로직 분리: 엔티티는 주로 비즈니스 로직을 처리하기 위해 설계되었기 때문에, 서비스 계층에서 비즈니스 로직을 처리하는 것이 자연스럽습니다.
  • 트랜잭션 관리: 서비스 계층에서 DTO와 Entity 간의 변환 작업을 처리하면, 트랜잭션 경계 내에서 변환을 수행하여 일관성을 유지할 수 있습니다.
  • 레이어 간 의존성 관리: DTO와 Entity 변환을 서비스 계층에서 수행하면, 레이어 간의 의존성이 덜해지고 각 레이어가 독립적으로 테스트될 수 있습니다.

변환 방법

변환 방법에는 ModelMapper나 MapStruct, Builder 패턴 등 다양한 방법이 있습니다.
이 포스팅에서는 ModelMapper를 이용해 변환하는 방법을 알아보겠습니다.

import org.modelmapper.ModelMapper;

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private ModelMapper modelMapper;
    
    public UserResponseDTO getUserById(Long id) {
        User user = userRepository.findById(id).orElse(null);
        if (user == null) {
            // 예외 처리 등...
        }
        return modelMapper.map(user, UserResponseDTO.class);
    }
    
    public void createUser(UserRequestDTO userRequestDTO) {
        User user = modelMapper.map(userRequestDTO, User.class);
        userRepository.save(user);
    }
}

ModelMapper 라이브러리를 사용하면 DTO <-> Entity간 변환을 자동으로 수행해줘 매우 간단하게 변환할 수 있습니다.


요약

Entity는 주로 데이터베이스와의 상호 작용 및 비즈니스 로직을 처리하기 위한 모델로 사용되고, DTO는 클라이언트와 서버 간의 효율적인 데이터 전송을 위한 모델로 사용됩니다. DTO와 Entity 간의 변환은 주로 서비스 계층에서 이루어져야 하며, 이를 통해 응용프로그램의 유지보수성과 유연성을 향상시킬 수 있습니다.

profile
student

0개의 댓글