
Entity, DAO, DTO, VO는 데이터 처리 계층에서 중요한 역할을 합니다. 이들은 애플리케이션이 데이터를 관리하고 처리하는 방식에 중요한 요소로, 서로 다른 책임을 가지고 있습니다.
: DB 테이블과 매핑되는 클래스
- JPA를 사용하는 Spring Boot에서는 Entity가 테이블과 직접 매핑되며, DB에서 데이터를 가져오거나 저장하는 역할
역할
: DB 테이블의 구조를 반영, DB와 상호작용
특징
: 보통 JPA 어노테이션인 @Entity, @Table 을 사용해 매핑
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String password;
// Getters and Setters
}
: DB에 대한 접근 로직을 관리하는 클래스
- 주로 CRUD 작업을 수행
- Spring Boot 에서는 Repository 패턴을 통해 이 역할을 수행
역할
: DB 와 상호작용하여 데이터를 조회하거나 조작하는 메서드 포함
특징
: Spring Data JPA에서는 보통 JpaRepository 인터페이스를 확장하여 DAO 구현
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
: 계층 간에 데이터를 전달할 때 사용하는 객체
- 네트워크나 애플리케이션의 다른 레이어 간 데이터를 주고받을 때 사용
- Entity 와는 다른 구조를 가질 수 있으며, 보통 필요한 일부 데이터만 포함
- 주로 서비스 계층이나 컨트롤러에서 사용되며, 특정 API 요청이나 응답에 필요한 데이터만 담고 있다.
역할
: 데이터를 전송할 때 불필요한 정보는 제거하고 필요한 정보만 담아 전송
특징
: 보안성 및 성능 최적화를 위해 Entity 와 별개로 필요한 데이터만 포함
public class UserDTO {
private String email;
private String fullName;
// Constructor
public UserDTO(String email, String fullName) {
this.email = email;
this.fullName = fullName;
}
// Getters and Setters
}
: 값을 표현하는 객체로, 불변의 성격을 가지며 주로 데이터를 묶어 하나의 값으로 표현할 때 사용
- 2개의 값 객체가 같다면 그들이 가지고 있는 데이터 값도 동일하다는 의미를 가짐
- 불변성을 가져 생성된 후에는 값이 변경되지 x
역할
: 여러 값을 하나의 객체로 묶어 데이터의 무결성과 일관성 유지
특징
: 생성된 후에는 변경되지 않으며, 두 VO 객체는 그 내부의 값이 같다면 동일한 객체로 간주
public class AddressVO {
private final String street;
private final String city;
private final String zipCode;
// Constructor
public AddressVO(String street, String city, String zipCode) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
}
// Getters (no setters to maintain immutability)
public String getStreet() {
return street;
}
public String getCity() {
return city;
}
public String getZipCode() {
return zipCode;
}
// Equals and HashCode to compare values
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AddressVO address = (AddressVO) o;
return street.equals(address.street) && city.equals(address.city) && zipCode.equals(address.zipCode);
}
@Override
public int hashCode() {
return Objects.hash(street, city, zipCode);
}
}
VO는 주로 하나의 값을 여러 구성 요소로 나누어 표현할 때 사용. 예를 들어, 주소(AddressVO)는 여러 필드로 구성된 하나의 값으로 간주
Entity
: DB 테이블과 직접적으로 매핑되는 클래스 (DB 구조 반영)
DAO
: DB 접근을 위한 클래스 (CRUD 연산 담당)
DTO
: 계층 간 데이터 전송을 위한 클래스 (불필요한 데이터를 제외하고 필요한 정보만 포함)
VO
불변 객체로, 값으로 판단되는 데이터 묶음(주로 여러 값들을 하나의 값으로 표현)