카테고리 없음

Entity 와 DTO 차이 (간단 요약 포함)

math_tbro 2022. 10. 11. 14:54

Entity

  • Entity는 실제 DB 테이블과 매핑되는 핵심 클래스

  • 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체

  • (1:1로 테이블과 매핑되며, 테이블이 가지지 않는 컬럼을 필드로 못가짐)

  • Entity → persistent의 목적, 즉 Request or Response 값을 전달하는 클래스로 사용하는 것은 안좋음

  • setter 사용 지양

    • 변경되지 않는 인스턴스에 대해서도 setter로 접근이 가능해져서 객체의 일관성, 안전성을 보장하기 힘들어짐.
  • Builder

    • setter 대신 초기화 하는 기능으로 멤버 변수가 많아져도 내가 필요한 값만을 넣을수 있음.

    • 예로 프로젝트 때 member 다 선언하고 밑에서 내가 필요한것만 따로

      //Entity
      
      @Builder
      @Getter
      @Entity
      @NoArgsConstructor
      public class Member {
        @Id
        @GeneratedBalue(strategy = GenerationTye.IDENTITY)
        private Long idx;
        private String name;
        private Double phone;
      
        public Member(Long idx, String name, double phone) {
             this.idx = idx;
             this.name = name;
             this.phone = phone;
             }
        }
      
      // HOW USE
      Member member = Member.builder()
                .name('KIM')
                .phone(010-5039-7151)
                .build();

DTO (Data Transfer Object)

  • DTO는 계층 간 데이터 교환 해주는 객체로 JSON serailization 직렬화에 사용되는 객체
  • Controller 클라이언트 단과 직접 마주할 때 entity 대신 DTO를 사용해서 데이터를 교환
  • View 와 Controller 사이에서 데이터를 주고 받을 때 활용성이 높다.
public class MemberDTO{

    public MemberDTO() {

    private String name;

    public String getName() {
        return name;
        }

    public void setName(String name) {
        this.name = name;
    }
}

위와 같이 하면 setter를 통해 데이터를 넣을수 있어서 DTO를 view→ controller 에 사용할 때 무지하게 편하다.

결론? 왜 둘을 분리할까?

  • DTO는 각 계층(Controller, View)끼리 주고받는 상자 개념
  • Entity처럼 데이터를 담고 있지만 목적 자체가 전달이므로 읽고 쓰는것이 모두 가능하고 일회성이 강하다.
  • DB에서 필요한 정보만 쓰고 싶을 때 Entity를 직접 넘기기보단 DTO를 만들어서 DTO로 불필요한 정보 유출을 막는다.
  • 결론
    • Entity
      • 실제 DB 테이블과 1대1 매핑
      • 핵심이기 떄문에 정보가 수정되면 안되기 때문에 request, response 클래스로 사용 x
    • DTO
      • 계층 간 데이터 교환을 위한 객체
      • getter/setter 메소드를 갖을수 있는 객체
      • response, request용 객체
    • 앞으로 DB를 설계할 때 entity // DB 데이터를 이용할 땐 DTO를 쓰자.