[TIL] DTO vs VO vs Entity, DTO/DAO/Repository
in TIL on Til Last modified at:
2025-04-02 TIL
📝 TIL (Today I Learned)
🔗 원본 이슈: #35
📅 작성일: 2025-04-02
🔄 최종 수정: 2025년 04월 09일
🍀 새롭게 배운 것
- DTO vs VO vs Entity
- 약간씩 다른 비슷한 개념인 것 같은데, 어떤 것이 정확히 다른지 알아보기 위해 블로그에 정리해보았다.
- DTO vs VO vs Entity
- DTO, DAO
- 이름이 비슷한데 역할이 다른 것 같아 아래에 정리해보았다.
- 공부하다 보니 Repository와 DAO도 비슷한 개념인 것 같아서 아래에 같이 정리했다.
📦 DTO (Data Transfer Object)
💡 데이터 “전달용” 객체
✅ 개념
- 계층 간(Controller ↔ Service, Frontend ↔ Backend 등) 데이터를 주고받기 위한 객체
- 순수 데이터만 담는 클래스 (getter/setter만 있는 경우 많음)
✅ 예시
public class UserDTO {
private String name;
private int age;
}
✅ 용도
- API 요청/응답 데이터 전달
- DB Entity와 분리된 가벼운 데이터 구조
🗃️ DAO (Data Access Object)
💡 DB에 접근하는 역할을 하는 객체
✅ 개념
- 실제로 DB와 연결되어 데이터를 저장하거나 불러오는 역할
- SQL 실행, JPA 사용 등 DB 처리 로직을 담당
✅ 예시
public interface UserDAO {
UserEntity findById(Long id);
void save(UserEntity user);
}
✅ 용도
- DB 연동 로직을 캡슐화해서 Service 계층에서 쉽게 사용하도록 함
- DB 종류가 바뀌어도 DAO만 바꾸면 되게 설계 가능
📌 핵심 비교 정리
항목 | DTO | DAO |
---|---|---|
의미 | Data Transfer Object | Data Access Object |
역할 | 데이터 전달 전용 | DB 접근/처리 전용 |
내용 | 필드 + getter/setter | 메서드 (save, find 등 DB 작업) |
위치 | Controller ↔ Service 계층 사이 등 | Service ↔ DB 사이에서 사용 |
비유 | 택배 상자 (데이터만 담음) | 택배기사 (DB에서 데이터를 꺼내옴) |
Repository
vs DAO
✅ 공통점
- 둘 다 데이터에 접근하기 위한 객체
- 보통 DB에서 데이터를 가져오거나 저장하는 역할을 한다.
✅ DAO (Data Access Object)
📌 정의
DAO는 데이터베이스에 직접 접근해서 데이터를 CRUD(Create, Read, Update, Delete)하는 객체
💡 특징
- 기술 중심: SQL, JDBC, MyBatis 같은 구체적인 구현 기술을 다룰 때 자주 씀.
- DB와 직접 소통하는 코드를 포함.
- 예전 Java에서 많이 쓰던 방식.
📦 예시
public class UserDao {
public User findById(int id) {
// JDBC, SQL 직접 사용
}
public void save(User user) {
// INSERT 쿼리
}
}
✅ Repository (Spring에서의 의미)
📌 정의
Repository는 도메인 객체의 컬렉션처럼 다루기 위한 추상화된 계층이
💡 특징
- 비즈니스 관점에서 설계: “데이터 저장소”처럼 보이도록 추상화.
- Spring에서는 보통
@Repository
어노테이션 붙임. - JPA에서는
CrudRepository
,JpaRepository
등을 상속받아 간단하게 사용 가능. - SQL보다 객체 지향적인 도메인 중심 접근.
📦 예시
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
🔍 DAO vs Repository 요약 비교
항목 | DAO | Repository |
---|---|---|
의미 | 데이터에 접근하는 객체 | 도메인 저장소를 추상화한 객체 |
초점 | 기술 (SQL, JDBC, MyBatis) | 비즈니스/도메인 중심 (JPA, ORM 기반) |
구현 방식 | 구현체를 직접 만듦 | 인터페이스 + Spring Data JPA가 구현체 제공 |
어노테이션 사용 | 없음 (전통적인 Java 방식) | @Repository 사용 |
대표 기술 | JDBC, MyBatis | Spring Data JPA, Hibernate |
✨ 결론적으로…
- DAO는 전통적인 방식으로, 데이터베이스 중심의 설계.
- Repository는 도메인 중심의 설계 방식이며, Spring에서는 더 추상화된 계층
- 요즘 Spring 프로젝트에서는 대부분 Repository 패턴을 쓴다. 특히 JPA랑 궁합이 잘 맞는다.