Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240711 Dto 사용의 중요성 본문

개발Article

[TIL]20240711 Dto 사용의 중요성

최밤빵 2024. 7. 12. 02:03

솔직히 과제하면서 만들라니까 만들지... 하는 생각으로 만들면서 entity나 dto에 대해서 설명하라고 하면 어버버 하게되서 그냥 데이터 전송하고 이동하는거!! 정도로만 알고있어도 될 거 같았는데, 컨트롤러에 대해 개발일지를 쓰고나서 하나씩 쓰는것도 좋겠다는 생각이들어서 dto에대해서도 공부를 하게됐다. 사실 entity에 대해서 물었던 질문에 대답을 하지 못해서가 가장 큰 이유이긴하다. 노트북 이슈로 레벨2과제를 손으로 하게되면서 시간이 너무 부족해서 일단 dto만 정리를 먼저 하기로 했다. 

 

▶ DTO (Data Transfer Object) 란?

→ DTO (Data Transfer Object)는 애플리케이션의 서로 다른 계층 간에 데이터를 주고받기 위한 객체이다. Entity와는 별도로 정의되고, 서비스 계층에서 컨트롤러 계층으로 데이터를 전달하거나, 반대로 컨트롤러에서 서비스 계층으로 데이터를 전달할 때 사용된다. DTO는 데이터를 전송하는데 중점을 두고, 비즈니스 로직과는 분리되어 코드의 명확성을 높이고 유지보수성을 향상시킨다. 

 

▶ DTO를 사용하는 이유 

 DTO 사용하는 이유는 다음과 같다. 

데이터보호 :

엔티티는 데이터베이스와 직접 연결된 객체이기 때문에 민감한 데이터가 노출 될 위험이 있다. DTO를 사용하면 필요한 데티만 전송하여 이러한 위험을 줄일 수 있다.

역할 분리 :

엔티티는 데이터베이스와의 매핑을 담당하고, DTO는 데이터를 이동시키는 역할을 하기 때문에 각자의 역할이 명확히 분리된다.

유연성 :

DTO는 엔티티와 독립적으로 설계되기 때문에 데이터 전송 요구 사항에 따라  DTO구조를 자유롭게 변경할 수 있다. 

Validation

DTO를 통해 입력값을 검증하여 잘못된 데이터의 유입을 방지할 수 있다. 

 

▶ DTO의 장점 

간결한 데이터 전송 :

필요한 데이터만 포함하여 네트워크 전송 효율을 높인다. 

유지보수성 향상 :

도메인 모델 변경에 독립적이기 때문에 코드의 유지보수성이 향상된다. 

보안성 강화 : 

불필요한 데이터나 민감한 데이터를 숨길 수 있어 보안이 강화된다. 

 

▶ DTO 사용예시 

지금 하고있는 과제를 예시로 들고싶었는데.... 손으로 써내려간걸 보자니 너무 지저분해서 과제1 때 DTO를 예시로..! 

과제 1 게시판 기능에서 MemoRequestDto와 MemoResponseDto를 사용하여 데이터를 주고받는 DTO인데,  MemoRequestDto는 클라이언트로부터 데이터를 수신할 때 사용되고, MemoResponseDto는 클라이언트에게 데이터를 반환할 때 사용된다.

package com.sparta.memo.dto;

import lombok.Getter;

@Getter
public class MemoRequestDto {
    private String username;
    private String contents;
}

→  MemoRequestDto는 사용자가 메모를 작성할 때 필요한 usernamecontents만을 포함한다. 이를 통해 클라이언트로부터 불필요한 데이터가 서버로 전달되지 않도록 한다.

package com.sparta.memo.dto;

import com.sparta.memo.entity.Memo;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class MemoResponseDto {
    private Long id;
    private String username;
    private String contents;
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;

    public MemoResponseDto(Memo memo) {
        this.id = memo.getId();
        this.username = memo.getUsername();
        this.contents = memo.getContents();
        this.createdAt = memo.getCreatedAt();
        this.modifiedAt = memo.getModifiedAt();
    }
}

 

MemoResponseDto는 메모 엔티티(Memo)의 정보를 클라이언트에게 반환할 때 사용된다. 엔티티의 모든 필드를 노출하지 않고, 클라이언트에게 필요한 정보만을 포함한다. 이를 통해 민감한 데이터를 보호하고, 클라이언트에게 필요한 정보만을 제공할 수 있다.

 

▶ 정리 

→ DTO는 애플리케이션의 계층 간 데이터 전송을 위해 사용되며, 클라이언트와 서버 간의 데이터 교환에서 매우 중요한 역할을 한다.  DTO를 사용함으로써 애플리케이션의 계층 간 데이터 전송을 효율적이고 안전하게 관리할 수 있다. 코드의 명확성과 유지보수성이 크게 향상 되었고, DTO를 적극 활용하면 클린 코드와 확장 가능한 구조를 유지할 수 있다고 한다. 

또한 DB와의 소통을 담당하는 JAVA클래스를 그대로 Client에 반환하는 것이아니라 DTO로 한번 변환한 후 반환할 때도 사용된다. 

 

🤓오늘의 소감 

엔티티 물어보는데 말문이 막혀서 대답을 못하는 내가, 과제 1 해놓고도 정확히 어떤 역할을 하는지 모르고 있는게 조금 멍청한 느낌이라 꼭 알아둬야 겠다는생각을 하게됐다. 어차피 계속 써야할거같은데 잘 알고있는게 좋은거니까. 과제 2 예시를 쓰고싶었는데 gpt가 해준 걸 수정하느라 너무 지저분해져서 올릴수가 없었다... 인텔리제이의 자동완성 기능이 자꾸 생각나는데.. 빨간줄 확인을 못해서 그렇지 공부가 되는거 같아서 나름 만족하는 중!! 

 

추가 +)