빙응의 공부 블로그

[스프링] DTO 왜 써야 해? 본문

Spring/개인공부_이론

[스프링] DTO 왜 써야 해?

빙응이 2023. 11. 15. 17:29

 

1.배경

 

Spring으로 간단한 팀프로젝트를 하고 있었는데

조원이 "DTO라고 중계를 사용하는게 좋다" 라는 말이 나왔다.


DTO란? (Data Transfer Object) 계층간 데이터 교환을 위해 사용한다.

아래 코드는 간단한 엔티티 코드와 DTO이다.

@Entity
@Data
public class Member {
  @Id
  private String id;
  private String password;
  private String tell;
  private String name;
  @Builder
  public void Member(String id, String password, String tell, String name){
    this.id = id;
    this.password = password;
    this.tell= tell;
    this.name = name;
  }
  public void Member(){
  }
}
 
@Getter
@Setter
public class MemberDto {

  private String id;

  private String tell;

  private  String password;

  private  String name;



  @Builder
  public MemberDto(String id, String tell, String password, String name){
    this.id =id;
    this.tell =tell;
    this.password = password;
    this.name = name;
  }
}
만들어 보고 의문이 들었다.

"아니 엔티티랑 똑같은데 왜 쓰는 거임?"

2. 사용 이유

 

핵심

결론부터 말하면 Entity 클래스는 데이터베이스와 직접적인 연관이 있는 클래스이기 때문 이다.

기본적으로 JPA 방식에서는 Entity 클래스를 기준으로 모든 작업이 진행된다.

그러나 여기서 불편한 점이 발생한다.

바로 모든 정보가 아니라 몇개의 정보만 필요하다면 어떨까?

몇 개의 정보를 위해 엔티티에 접근하는게 맞는 걸까?

아래는 DTO의 장점이다.

1) 화면에 표시되는 데이터

  • 데이터베이스에 저장되는 엔티티와는 다르게, 화면에 표시되는 데이터는 종종 다르게 구성될 수 있다.
  • 필요한 경우 변환을 수행하여 View Layer와 DB Layer를 분리할 수 있다.

2) 다양한 비즈니스 로직과 요구사항에 대한 것

  • 엔티티로 모든 요구사항에 대해 설계를 하면 정해진 틀에 맞춰 개발해야한다.
  • DTO를 사용하면 각 로직에 맞춘 필드만을 생성하여 유연하게 대처할 수 있다.

3) Controller와 Service 사이에서 강한 의존을 방지

  • 만약 Service가 받고 싶은 값이 Controller가 결정한다면 어떻게 될까?
  • 그것은 Service가 그 Controller에 종속이 되는 것이다.
  • 이를 방지하기 위해 DTO로 구성해 값을 맞춘다.

 

즉 DTO는 일종의 맞춤 제작 데이터 모둠인 것이다.

비즈니스 로직에 따라 다르게 보여주는 DB의 뷰 개념처럼 필요한 데이터만 가져가서 로직을 구현하는게 가능하다. 

마치며...

좋은 설계에 대해 많은 고민을 해봤지만 매번 배워가는 것 같다...

나 공부 열심히해서 취업할 수 있을까..

 

참고로 이정만 적어보고 개발을 해보며 내용을 추가할 것이다.