Entity-DTO-VO 의 관계

jiaLEE·2022년 6월 24일
0

JPA를 공부하다 보니 DTO, VO, Entity가 나오는데 개념들이 헷갈려
아래와 같이 각 부분들을 정리한다.

Entity

실체이자 객체, 엔티티간의 관계를 어노테이션을 통해 정의할 수 있다.
또한 설계에 따라 엔티티에 핵심 비즈니스 로직을 넣을 수 있으며
엔티티를 기반으로 많은 것들이 생성하기 때문에 함부로 수정하지 않는다.

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name="member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

DTO(Data Transfer Object)

계층 간 데이터 교환이 이루어질 수 있도록 하는 객체로서 순수한 데이터 객체여야 한다.
전달만을 목적으로 하기에 setter, getter만을 메소드로 갖는다.

데이터를 최대한 고정하고 싶으면 생성자로 값을 넣어서 set한다.

@RequiredArgsConstructor
pubic class Member {
	private final String name;
	private final String number;
    private final int age;
}

위와 같이 @RequiredArgsConstructor를 사용하면 생성자를 쉽게 만들 수 있다.

VO(Value Object)

DTO와 같다고 생각할수 있지만, VO는 값 그 자체로 표현하는 객체이다.
값 자체를 나타내는 것이 목적 -> 값이 불변해야함 -> 생성자를 통해 값을 넣는다.
(DTO와 비슷할수 있으나 목적이 다르며 setter/getter 외의 메소드가 들어가도 된다.)

VO에서는 "필드값이 같다면 두 객체를 같은 객체"로 보기 때문에 값 비교를 한다.
이때 일반적으로 == 를 통해 비교를 하게 되면 주소값을 비교하는데
여기서 주소값은 new를 통해 생성될 때마다 새로운 주소를 할당받기 때문에
안의 값이 같더라도 다른 주소값을 가질 수 있다.

그래서 속성값들로만 비교하기 위해 equals와 hashcode()를 Override해야한다.

0개의 댓글