JPA를 공부하다 보니 DTO, VO, 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<>();
}
계층 간 데이터 교환이 이루어질 수 있도록 하는 객체로서 순수한 데이터 객체여야 한다.
전달만을 목적으로 하기에 setter, getter만을 메소드로 갖는다.
데이터를 최대한 고정하고 싶으면 생성자로 값을 넣어서 set한다.
@RequiredArgsConstructor
pubic class Member {
private final String name;
private final String number;
private final int age;
}
위와 같이 @RequiredArgsConstructor를 사용하면 생성자를 쉽게 만들 수 있다.
DTO와 같다고 생각할수 있지만, VO는 값 그 자체로 표현하는 객체이다.
값 자체를 나타내는 것이 목적 -> 값이 불변해야함 -> 생성자를 통해 값을 넣는다.
(DTO와 비슷할수 있으나 목적이 다르며 setter/getter 외의 메소드가 들어가도 된다.)
VO에서는 "필드값이 같다면 두 객체를 같은 객체"로 보기 때문에 값 비교를 한다.
이때 일반적으로 == 를 통해 비교를 하게 되면 주소값을 비교하는데
여기서 주소값은 new를 통해 생성될 때마다 새로운 주소를 할당받기 때문에
안의 값이 같더라도 다른 주소값을 가질 수 있다.
그래서 속성값들로만 비교하기 위해 equals와 hashcode()를 Override해야한다.