Web/📗 Spring

Entity와 DTO [Spring / 스프링 부트와 AWS로 혼자 구현하는 웹 서비스]

키깡 2022. 7. 18.
728x90

Entity 클래스와 Controller에서 쓸 Dto는 꼭 분리해야 함.

  • Entity
    • Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체 (DB의 테이블과 1:1로 매핑)
    • 데이터베이스와 맞닿은 핵심 클래스. Entity를 기준으로 테이블이 생성되고, 스키마가 변경 됨.
@Getter
@NoArgsConstructor  //  기본 생성자 자동 추가 (public Posts() {}와 같은 효과)
@Entity //  테이블과 링크될 클래스임을 나타냄 (SalesManager.java -> sales_manager 테이블)
public class Posts {
    @Id //  해당 테이블의 PK 필드
    @GeneratedValue(strategy = GenerationType.IDENTITY) // PK의 생성 규칙을 나타냄. GenerationType.IDENTITY 추가해야만 auto_increment
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder    //  해당 클래스의 빌더 패턴 클래스 생성
    public Posts(String title, String content, String author){
        this.title = title;
        this.content = content;
        this.author = author;
    }

}
  • DTO
    • 계층(Layer) 간 데이터 교환이 이루어질 수 있도록 하는 객체
    • JSON serialization과 같은 직렬화에도 사용되는 객체
    • 주로 View와 Controller 사이에서 데이터를 주고받을 때 활용
@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
    private Long id;
    private String title;
    private String content;
    private String author;

    public PostsSaveRequestDto(String title, String content, String author){
        this.title = title;
        this.content = content;
        this.author = author;
    }

    public Posts toEntity(){
        return Posts.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();
    }
}

정리하면, 'Entity와 DTO를 분리하는 이유는 DB와 View 사이의 역할 분리를 위해서'

  • 화면변경은 아주 사소한 기능 변경이고, 이를 위해 테이블과 연결된 Entity 클래스를 변경하는 것은 너무 큰 변경 => 화면 변경(View Layer)은 Dto에서
    출처 : 역할 분리를 위한 Entity, DTO 개념과 차이점
  • DTO(Data Transfer Object)는 Entity 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념
  • 순수하게 데이터를 담고 있다는 점에서 Entity 객체와 유사하지만, 목적 자체가 전달이므로 읽고, 쓰는 것이 모두 가능하고, 일회성으로 사용되는 성격이 강함
  • 특히 JPA를 이용하게 되면 Entity 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련된 중요한 역할을 하며, 내부적으로 EM(EntityManager)에 의해 관리되는 객체
  • DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 다르게 Entity의 생명주기(Life Cycle)도 전혀 다르다는 점도 분리해야 하는 이유
  • DB로부터 조회된 Entity를 그대로 View로 넘기게 되었을 때 불필요한 정보 및 노출되면 안 되는 정보까지 노출될 수 있고, 이를 막기 위한 로직을 따로 구현해야 한다

댓글