[Spring] Entity, DAO, DTO, VO

yee·2024년 10월 7일

Spring

목록 보기
5/6

Entity, DAO, DTO, VO는 데이터 처리 계층에서 중요한 역할을 합니다. 이들은 애플리케이션이 데이터를 관리하고 처리하는 방식에 중요한 요소로, 서로 다른 책임을 가지고 있습니다.

🎈 Entity

: 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
}

🎈 DAO (Data Access Object)

: 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);
}

🎈 DTO (Data Transfer Object)

: 계층 간에 데이터를 전달할 때 사용하는 객체

  • 네트워크나 애플리케이션의 다른 레이어 간 데이터를 주고받을 때 사용
  • 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
}

🎈 VO(Value Object)

: 값을 표현하는 객체로, 불변의 성격을 가지며 주로 데이터를 묶어 하나의 값으로 표현할 때 사용

  • 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

불변 객체로, 값으로 판단되는 데이터 묶음(주로 여러 값들을 하나의 값으로 표현)




📃출처 및 참고자료📃

https://m.blog.naver.com/scw0531/220988401816

0개의 댓글