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로 넘기게 되었을 때 불필요한 정보 및 노출되면 안 되는 정보까지 노출될 수 있고, 이를 막기 위한 로직을 따로 구현해야 한다
'Web > 📗 Spring' 카테고리의 다른 글
[Spring 스터디] Spring Message 처리 / 국제화 (0) | 2023.01.04 |
---|---|
Spring '등록' 기능 구현 및 테스트 코드 작성 [Spring / 스프링 부트와 AWS로 혼자 구현하는 웹 서비스] (0) | 2022.07.18 |
[Spring] 스프링에서 Scheduler 사용하기 (0) | 2022.07.18 |
Service에서 비지니스 로직을 처리한다? [Spring / 스프링 부트와 AWS로 혼자 구현하는 웹 서비스] (0) | 2022.07.18 |
롬복 소개 및 설치하기 [Spring / 스프링 부트와 AWS로 혼자 구현하는 웹 서비스] (0) | 2022.07.08 |
댓글