카테고리 없음
DTO와 Entity의 분리 이유
개발 도
2025. 6. 8. 22:53
DTO와 Entity를 왜 분리해야 할까?
한 줄 요약
DTO는 "데이터 전달용", Entity는 "데이터 저장/로직용"이다.
역할이 다르기 때문에 둘을 분리하면 더 안전하고 유지보수에 강한 코드가 된다.
핵심 개념 정리
구분 DTO (Data Transfer Object) Entity (도메인 모델)
목적 | 계층 간 데이터 전달용 | DB 테이블 매핑 및 비즈니스 로직 처리 |
위치 | Controller ↔ Service ↔ View 사이 | Repository ↔ Service ↔ DB |
예시 | 회원가입폼, 숙소등록폼 | Member, Accommodation 등 테이블 객체 |
사용 범위 | 외부 입력/응답 전용 | DB 저장/조회, 연관관계 포함 |
포함 데이터 | 최소한의 필드만 | 모든 컬럼, 연관 객체 포함 |
특징 | Getter/Setter만 있는 순수 데이터 객체 | JPA 어노테이션, 연관관계, 도메인 로직 포함 |
분리하는 이유 5가지
1. 보안
- Entity에는 id, password, userRole, createdAt 같은 민감 정보가 들어 있음
- DTO는 필요한 필드만 담기 때문에, 의도하지 않은 정보 노출을 방지할 수 있음
2. 유효성 검증 (Validation)
- @NotNull, @Pattern, @Min 같은 검증 어노테이션은 DTO에 적용하는 게 자연스럽고 깔끔함
- Entity는 DB 구조고, 검증 책임은 Controller/Service가 갖는 게 명확함
3. 역할 분리 & 유지보수
- View 요구사항이 바뀔 때마다 Entity를 수정하면 DB 구조까지 흔들림
- DTO를 따로 두면 프론트 요청에 맞게 유연하게 대응 가능
4. 테스트 편의성
- 테스트할 때 Entity를 직접 만들면 연관관계 복잡해서 불편함
- DTO는 테스트에 필요한 필드만 있어 단순하고 깔끔함
5. 계층 간 의존성 최소화
- Controller/Service → Entity 직접 사용하면, 도메인 로직이 프레젠테이션 계층에 노출됨
- DTO는 이걸 끊어주는 완충재 역할을 함
📌 실전 예시
👎 Entity를 직접 받는 경우
@PostMapping("/register")
public String register(@ModelAttribute User user) {
// ❌ Entity를 직접 받으면 보안 위험 + 연관관계 파악 어려움
}
👍 DTO로 받는 경우
@PostMapping("/register")
public String register(@ModelAttribute UserRegisterDto dto) {
// ✅ 필요한 값만 전달받고
User user = new User(dto.getUsername(), dto.getPassword());
userRepository.save(user);
}
최종 정리
DTO는 "필요한 값만 전달하는 가벼운 택배 상자"
Entity는 "DB 테이블과 1:1로 연결된 무거운 설계도"
둘을 섞지 않고 역할을 나누는 것이 결국 유지보수성, 확장성, 안정성을 모두 가져다줌.
필요하면 이걸 Notion에 복사 붙여넣기 쉽게 마크다운 형식으로도 따로 정리해줄게.
계속 정리 이어갈까?