본문 바로가기
spring

[Spring] DTO

by goblin- 2024. 10. 4.

**DTO(Data Transfer Object)**는 데이터 전송 객체로, 주로 계층 간의 데이터 전송을 목적으로 사용하는 객체입니다. DTO는 일반적으로 서버와 클라이언트 간 또는 애플리케이션의 다른 계층 간에 데이터를 전송할 때 사용됩니다. DTO는 데이터를 담는 순수한 객체로, 비즈니스 로직이 들어가지 않으며, 단순히 데이터를 전송하는 역할만 합니다.

 

DTO의 주요 목적과 특징

 

1. 데이터 전송:

DTO는 주로 한 시스템에서 다른 시스템으로, 또는 애플리케이션의 계층 간 데이터를 전송하는 데 사용됩니다.

예를 들어, 클라이언트가 서버로 API 요청을 보낼 때, DTO를 통해 필요한 데이터를 전달하고, 서버에서 클라이언트에게 응답할 때도 DTO를 사용해 데이터를 반환합니다.

2. 비즈니스 로직 없음:

DTO는 데이터를 담는 단순한 객체로, 비즈니스 로직이 포함되지 않습니다. 주로 **게터(getters)와 세터(setters)**로 구성되며, 데이터를 담거나 가져오는 역할만 합니다.

DTO는 복잡한 처리를 하지 않고, 데이터의 이동에만 집중합니다.

3. 데이터의 캡슐화:

DTO는 외부에서 데이터를 주고받을 때 데이터의 캡슐화를 도와줍니다. 예를 들어, 데이터베이스의 구조를 외부로 직접 노출하지 않고, 필요한 정보만 담아 전달할 수 있습니다.

이를 통해 보안성을 높이고 데이터의 표현 방식을 변경할 수 있는 유연성을 제공합니다.

4. 유효성 검사:

DTO는 주로 데이터 전송을 위한 객체이기 때문에, 데이터 유효성 검사나 데이터 형식을 맞추는 데 유용하게 사용될 수 있습니다.

예를 들어, 클라이언트로부터 들어오는 데이터가 올바른 형식인지 확인하고, 유효하지 않은 데이터를 걸러내기 위한 필터로 사용됩니다.

5. 일반적으로 읽기/쓰기 속성만 포함:

DTO는 데이터 전송에만 사용되므로, 복잡한 비즈니스 로직이 없어야 하며, 데이터의 **게터(getter)**와 **세터(setter)**만을 포함하는 것이 일반적입니다.

 

DTO의 사용 이유

 

1. 레이어 간 의존성 분리:

애플리케이션에서 각 레이어(프레젠테이션, 서비스, 데이터 접근 등)가 독립적으로 동작하고 의존성을 줄이기 위해 DTO를 사용합니다. 즉, 데이터베이스 모델(Entity)을 외부에 직접 노출하지 않고, DTO로 변환하여 전송함으로써 각 레이어 간의 결합도를 낮춥니다.

2. 데이터 최적화:

클라이언트에게 필요하지 않은 정보를 숨기고, 오직 필요한 데이터만 포함한 DTO를 전송할 수 있습니다. 이를 통해 네트워크 성능을 최적화하고, 불필요한 데이터 전송을 줄일 수 있습니다.

3. 보안성 향상:

데이터베이스와 직접적으로 연결된 엔티티 객체를 외부에 노출시키지 않음으로써, 민감한 정보를 보호하고 보안성을 높일 수 있습니다. DTO는 필요한 정보만 담아 클라이언트나 다른 시스템에 노출됩니다.

 

DTO와 Entity의 차이

 

Entity는 데이터베이스 테이블과 직접적으로 1:1 매핑되는 객체입니다. 주로 데이터베이스와 상호작용하며, 데이터베이스 구조에 맞춰 설계됩니다.

DTO는 데이터베이스와 상관없이 외부와의 데이터 전송을 위해 설계된 객체입니다. 데이터베이스 구조와 다를 수 있으며, 필요한 데이터만을 전달하거나 받을 때 사용됩니다.

 

DTO의 예시

 

1. DTO 사용 예시:

 

UserDTO.java

public class UserDTO {
    private String username;
    private String email;
    private int age;

    // 생성자
    public UserDTO(String username, String email, int age) {
        this.username = username;
        this.email = email;
        this.age = age;
    }

    // 게터
    public String getUsername() {
        return username;
    }

    public String getEmail() {
        return email;
    }

    public int getAge() {
        return age;
    }

    // 세터
    public void setUsername(String username) {
        this.username = username;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

2. DTO와 Entity 간 변환:

 

DTO에서 받은 데이터를 Entity로 변환하여 데이터베이스에 저장할 수 있습니다. 이때, 정적 팩토리 메서드를 사용해 변환을 간편하게 할 수 있습니다.

 

UserEntity.java

public class UserEntity {
    private String username;
    private String email;
    private int age;

    // private 생성자
    private UserEntity(String username, String email, int age) {
        this.username = username;
        this.email = email;
        this.age = age;
    }

    // 정적 팩토리 메서드로 DTO → Entity 변환
    public static UserEntity fromDTO(UserDTO userDTO) {
        return new UserEntity(userDTO.getUsername(), userDTO.getEmail(), userDTO.getAge());
    }

    @Override
    public String toString() {
        return "UserEntity{username='" + username + "', email='" + email + "', age=" + age + '}';
    }
}

 

3. DTO 사용 시나리오:

public class Main {
    public static void main(String[] args) {
        // 외부에서 입력받은 DTO
        UserDTO userDTO = new UserDTO("john_doe", "john@example.com", 25);

        // DTO → Entity 변환
        UserEntity userEntity = UserEntity.fromDTO(userDTO);

        // 데이터베이스에 저장한다고 가정
        System.out.println("저장된 유저 정보: " + userEntity);
    }
}

 

DTO의 장점

 

1. 레이어 분리: 비즈니스 로직, 데이터 접근 로직과 전송 데이터를 분리하여 애플리케이션의 계층 간 결합도를 낮춥니다.

2. 데이터 최적화: 외부로부터 필요한 데이터만을 수집하거나 제공함으로써 불필요한 데이터를 전송하지 않습니다.

3. 보안성 향상: DTO는 민감한 데이터를 숨기고 필요한 데이터만을 전송하므로, 엔티티의 구조를 숨길 수 있고 보안성을 높일 수 있습니다.

 

DTO의 단점

 

1. 추가 코드 필요: 엔티티와 DTO 간의 변환 과정 때문에 추가적인 코드 작성이 필요합니다. 이를 자동화하려면 라이브러리(예: MapStruct)를 사용할 수 있습니다.

2. 중복 코드 발생 가능성: DTO와 엔티티 간의 속성 중복이 발생할 수 있습니다. 같은 필드를 두 번 관리해야 할 수 있습니다.

 

DTO의 요약

 

**DTO(Data Transfer Object)**는 계층 간 또는 시스템 간의 데이터 전송을 위한 객체로, 데이터를 전달하는 데 초점을 맞추며 비즈니스 로직이 포함되지 않습니다.

DTO는 외부로부터 데이터를 입력받을 때나, 외부에 데이터를 반환할 때 사용되며, 데이터를 캡슐화하여 보안성성능 최적화를 제공합니다.

실무에서는 DTO → Entity로 변환하는 작업이 필요하며, 이를 통해 엔티티가 직접 외부에 노출되는 것을 방지하고, 안전하게 데이터를 처리할 수 있습니다.

 

DTO는 클라이언트-서버 간의 데이터 전송 최적화보안성 향상에 중요한 역할을 합니다.

'spring' 카테고리의 다른 글

[Spring] CustomError 작성법  (0) 2024.10.20
[Spring] 주요 Annotation  (3) 2024.10.19
[Spring] Bean  (1) 2024.10.12
[Spring] Spring과 Tomcat  (0) 2024.10.12
[Spring] Lombok  (2) 2024.09.28