안녕하세요. 새내기 개발자입니다. 공부하면서 정리하는 글로 틀린 부분은 언제나 댓글로 환영입니다!
Java에서 데이터 관리를 위해 자주 사용되는 개념으로 DAO(Data Access Object), DTO(Data Transfer Object), VO(Value Object), Entity가 있습니다. 각각의 개념이 무엇이며 어떤 역할을 하는지, 그리고 실무에서 어떻게 활용되는지를 정리해 보겠습니다.
1. DAO (Data Access Object)
📌 정의
DAO는 데이터베이스와 직접적으로 상호 작용하는 객체입니다. 주로 SQL 쿼리를 실행하고, 데이터를 조회·삽입·수정·삭제하는 역할을 합니다.
📌 역할
- 데이터베이스와 애플리케이션 간의 데이터 전달을 담당
- SQL 실행 및 트랜잭션 관리
- 데이터베이스 연결 및 자원 해제
📌 특징
- DAO는 데이터 액세스 로직을 캡슐화하여 다른 계층(서비스, 컨트롤러)에서 직접 DB 접근을 하지 않도록 한다.
- 주로 JDBC, MyBatis, JPA와 같은 라이브러리를 이용하여 구현된다.
📌 DAO 예제 (JPA 사용)
@Repository
public class UserDao {
@PersistenceContext
private EntityManager entityManager;
public UserEntity findById(Long id) {
return entityManager.find(UserEntity.class, id);
}
public void save(UserEntity user) {
entityManager.persist(user);
}
}
2. DTO (Data Transfer Object)
📌 정의
DTO는 데이터 전송을 위한 객체로, 계층 간(예: 컨트롤러 ↔ 서비스 ↔ DAO) 데이터를 주고받을 때 사용됩니다.
📌 역할
- 데이터를 한 번에 묶어서 전달하기 위해 사용
- 보안 및 성능 최적화를 위해 특정 필드만 포함할 수도 있음
- 주로 컨트롤러에서 클라이언트 요청을 받을 때나 응답을 보낼 때 사용됨
📌 특징
- 가변 객체(Mutable Object)로, 필드를 변경할 수 있음
- @Getter, @Setter 또는 record를 활용하여 구현 가능
📌 DTO 예제
public class UserDto {
private String name;
private String email;
// 기본 생성자
public UserDto() {}
public UserDto(String name, String email) {
this.name = name;
this.email = email;
}
// Getter & Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
📌 DTO 사용 예제 (컨트롤러에서 활용)
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
UserDto userDto = userService.getUserById(id);
return ResponseEntity.ok(userDto);
}
}
3. VO (Value Object)
📌 정의
VO는 값을 표현하는 객체로, 한 번 생성되면 변경되지 않는 불변(Immutable) 객체입니다.
📌 역할
- 특정 도메인 값을 표현하는 객체
- 동등성(equality)을 기준으로 비교됨 (==이 아니라 equals/hashCode로 비교)
- 예를 들어, "돈", "좌표", "색상", "주소" 같은 개념을 표현할 때 유용
📌 특징
- 필드 값 변경이 불가능 (Setter가 없음)
- equals()와 hashCode()를 재정의하여 동등성 비교를 수행
📌 VO 예제
public class Money {
private final int amount;
public Money(int amount) {
this.amount = amount;
}
public Money add(Money other) {
return new Money(this.amount + other.amount);
}
public int getAmount() {
return amount;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Money money = (Money) o;
return amount == money.amount;
}
@Override
public int hashCode() {
return Objects.hash(amount);
}
}
📌 VO 사용 예제
Money price = new Money(1000);
Money discount = new Money(200);
Money finalPrice = price.add(discount); // 새로운 Money 객체 생성
4. Entity
📌 정의
Entity는 데이터베이스 테이블과 1:1 매핑되는 객체입니다. JPA를 사용하면 엔티티 클래스를 통해 테이블을 매핑하고 관리할 수 있습니다.
📌 역할
- 데이터베이스의 테이블 구조를 Java 객체로 표현
- @Entity 어노테이션을 사용하여 JPA에서 관리
- 필드와 컬럼이 직접적으로 매핑되며, 영속성 컨텍스트에서 관리됨
📌 특징
- 식별자(ID)가 필수적으로 존재
- JPA의 영속성 컨텍스트 관리 대상
- 데이터베이스와 1:1 매핑되므로 DAO와 함께 활용됨
📌 Entity 예제 (JPA)
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
protected UserEntity() {} // JPA 기본 생성자 필요
public UserEntity(String name, String email) {
this.name = name;
this.email = email;
}
// Getter & Setter
public Long getId() { return id; }
public String getName() { return name; }
public String getEmail() { return email; }
}
5. DAO, DTO, VO, Entity 비교표
구분DAO (Data Access Object)DTO (Data Transfer Object)VO (Value Object)Entity
구분 | DAO (Data Access Object) | DTO (Data Transfer Object) | VO (Value Obejct) | Entity |
역할 | DB 접근 및 CRUD | 계층 간 데이터 전달 | 값 객체 (불변) | 테이블과 매핑된 객체 |
데이터베이스 연관 | O (SQL 실행) | X | X | O |
변경 가능성 | O (데이터 변경 가능) | O (Setter 제공) | X (불변) | O (JPA에서 변경 가능) |
어노테이션 | @Repository (DAO 클래스) | 없음 (@Data 사용 가능) | 없음 | @Entity, @Table |
사용 예 | 데이터 조회 및 저장 | API 요청/응답 | 금액, 좌표, 색상 등 값 표현 | DB 테이블과 1:1 매핑 |
6. 정리
- DAO: 데이터베이스와 직접 연결되는 객체 (SQL 실행)
- DTO: 계층 간 데이터 전달을 위한 객체 (Setter 가능, 가변)
- VO: 불변 객체로, 특정 값을 나타냄 (Setter 없음)
- Entity: DB 테이블과 매핑되는 객체 (@Entity)
'백엔드' 카테고리의 다른 글
Java 메모리 영역과 동작 원리 (1) | 2025.02.14 |
---|---|
[자바/JAVA] 객체는 뭐로 만들어? Class, Interface, Record? (1) | 2025.02.12 |
[DB] 관계형(RDB) vs 비관계형(NoSQL) 데이터베이스 비교 (1) | 2025.02.10 |
[자바/JAVA] Null Pointer Exception (NPE) (1) | 2025.02.08 |
[자바/JAVA] 자바 스프링 AOP(Aspect-Oriented Programming) 이해하기 (0) | 2025.02.08 |