Entity와 DTO를 분리해야 하는 이유는 DB Layer와 View Layer 사이의 역할을 분리하기 위해서이다.
(DB Layer = Persistence Tier, View Layer = Presentation Tier)
Entity
Entity는 실제 DB 테이블과 매핑되는 객체이다.
Entity를 작성할 때 Setter를 무분별하게 사용하면 객체의 값을 쉽게 변경할 수 있으므로, 객체의 일관성을 보장할 수 없다. 즉, Entity의 값은 변하지 않아야 하므로 setter를 사용하지 않는 것이 바람직하다.
Entity를 기준으로 테이블이 생성되고 스키마가 변경된다. 따라서 Entity를 요청이나 응답 값을 전달하는 객체로 사용해서는 안된다.
Entity는 비즈니스 로직을 포함할 수 있다.
@Getter
@Entity
@Table(name = "user")
public Class User {
@Id
@GeneratedValue
private Long id;
@Column(name = "name")
private String name;
@Column(name = "address")
private String address;
private User(UserDTO dto) {
id = dto.getId();
name = dto.getName();
address = dto.getAddress();
}
}
DTO
DTO는 Data Transfer Object로, 계층 간 데이터 교환을 위한 객체이다. 데이터 교환만을 위해 사용하므로 로직을 갖지 않고, getter/setter 메소드만 갖는다. 데이터 전달만을 위한 객체이기 때문에 다른 로직이 필요하지 않다.
@Getter
@Setter
public class UserDTO {
private Long id;
private String name;
private String address;
}
setter의 경우 생성자로 값을 넣어주도록 하게 되면 불변 객체로 활용할 수 있다.
// 생성자를 이용한 불변 객체
@Getter
public class UserDTO {
private Long id;
private String name;
private String address;
public UserDTO(Long id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
}
그렇다면 VO란 무엇일까?
VO
VO는 Value Object로 값 그 자체를 표현하는 객체이다. 그리고 비교를 위해서도 사용한다.
VO는 equals()와 hashCode()를 오버라이딩하여 사용하고, VO 객체 내부에 선언된 속성의 모든 값들이 같으면 같은 객체라고 판별한다.
@Getter
@Setter
public class UserVO {
private Long id;
private String name;
private String address;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserVO userVO = (UserVO) o;
return Objects.equals(id, userVO.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
// 생성자를 이용한 불변 객체
@Getter
public class UserVO {
private Long id;
private String name;
private String address;
public UserVO(Long id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
}
정리
Entity는 실제 테이블과 매핑되어 setter의 사용을 지양하여 객체의 일관성을 보장해야 한다.
DTO는 Data Transfer Object로 계층 간 데이터 교환을 위한 객체로 로직을 가지고 있지 않은 데이터 객체이다.
VO는 Value Object로 값을 저장하기 위해 사용하며, 비교를 위해서도 사용한다.
참고
'자바' 카테고리의 다른 글
일급 컬렉션 (0) | 2023.11.17 |
---|---|
Java - repeat() (1) | 2023.10.25 |
JavaBean 규약 (1) | 2023.10.20 |
String null일 때 비교 (0) | 2023.09.24 |
JAVA 여러 버전 사용하기 (0) | 2023.09.13 |