Spring Boot로 개발하다 보면, Entity 형태로 리턴하지 말고, DTO로 변환 후 리턴해야 한다고 나온다.
오늘은 DTO와 Entity의 개념을 간단히 정리하고, DTO와 Entity를 분리해야 하는 이유에 대해 포스팅해보겠다.
DTO (Data Transfer Object)란?
DTO란 계층 간의 데이터 교환 시 사용하는 객체를 의미한다.
주로 클라이언트와 서버 간의 데이터 교환을 위해 사용된다.
=> 로직을 가지지 않으며, getter & setter 메서드만 가진다. (데이터를 전달하고, 전달받는 메서드들)
아래는 DTO 클래스의 예시이다.
@Getter
@Setter
@NoArgsConstructor
@ToString
public class MemberDTO {
private String Id;
private String Password;
private String Name;
}
//@NoArgsConstructor 어노테이션을 써주었기 때문에 생성자를 따로 만들어주지 않아도 된다.
DTO를 사용해야 하는 이유
보안성 & 안전성
Entity의 모든 정보를 노출하면 보안적으로 위험할 수 있는데, DTO를 사용하면 필요한 정보만을 선택적으로 전달할 수 있어 민감한 정보를 노출시키는 것을 방지할 수 있다.
데이터 전송 최적화
필요한 데이터만들 전달하기 때문에 시스템의 전반적인 효율성과 성능을 향상시킬 수 있다.
toEntity() 메서드를 통해서 DTO에서 필요한 부분을 이용하여 Entity로 만든다.
Entity
DB와 직접적으로 연결된, DB에 저장되는 데이터 객체로, DB 테이블과 1:1로 매핑되는 클래스이다.
=> 테이블에 존재하는 모든 컬럼들을 필드로 가지고 있다.
DB의 영속성(persistence)을 목적으로 사용되는 객체이다.
=> 요청 및 응답을 전달하기에 부적절하다. (DB와 직접적으로 매핑되어 있고, 다른 클래스, 로직들이 Entity 클래스를 기준으로 동작하기 때문에 함부로 변경해서는 안된다.)
@Entity
@Getter, @Setter
@Table(name = "member_table")
public class MemberEntity {
@Id
@Column(unique = true) // unique 제약조건 추가
private String id;
@Column
private String Password;
@Column
private String Name;
}
DTO를 분리하는 이유
- 보안 문제
DTO는 데이터를 담고 있다는 점에서 Entity와 유사한 개념이지만, DTO의 목적은 데이터를 전달하는 것으로, 보통 일회성으로 사용되며, DB의 데이터 구조와는 독립적이다. 반면, DB 테이블과 매핑되는 Entity 클래스가 변경될 경우 여러 클래스에 영향을 미친다. 그래서 여러 계층에서 다 Entity를 직접 사용하게 되면, 원치 않게 Entity의 속성이 변경되어 DB에도 영향을 끼칠 수 있다. 또한 DB의 모든 필드가 외부에 노출되어 보안 문제가 발생할 수 있다.
- 불필요한 데이터 전송을 방지할 수 있다.
Entity에는 불필요한 필드들이 존재할 수 있다. 예를 들어, 로그인 기능에서 id와 password만 필요한데, entity 형태 그대로 리턴하게 되면 email, phoneNumber 등 민감한 개인정보나 불필요한 데이터들까지 포함된다. DTO 형태로 리턴하면 클라이언트에게 필요한 데이터만 선별해서 전달할 수 있어 효율적이다.
- API 유연성
Entity를 기준으로 API를 설계하면, 테이블 구조가 변경되었을 때 수정사항이 늘어난다. 하지만 DTO를 기준으로 설계하면, 각 계층이 독립적으로 동작 가능하므로 유연성이 향상된다. (Entity만 사용하는 경우에 비해 유지보수성 증가)
DTO는 데이터 전달용, Entity는 DB 작업용 이라고 이해하면 된다!
DTO를 사용하면 보안, 유지보수, 성능, 확장성 등 모든 면에서 유리하다!
'Spring boot' 카테고리의 다른 글
[Spring boot] - Controller, Service, Repository (0) | 2025.02.11 |
---|---|
[Spring boot] - 스프링 부트 프로젝트 구조 (계층형 vs 도메인형) (0) | 2025.02.09 |
[Spring boot] - Entity 개념 정리 (0) | 2025.02.08 |
[Spring Boot] - application.yml 설정하기 (application.properties와의 차이점) (0) | 2025.02.06 |