-
[Java] DTO와 VO 그리고 EntityProgramming/Java 2021. 8. 1. 18:45
DTO와 VO 그리고 Entity
DTO
Data Transfer Object로계층(Layer)간 데이터 교환을 위해 사용하는객체이다. 주로 데이터 교환을 위해서만 사용하기 때문에 특별한 로직을 가지고 있지 않고getter/setter메소드만 갖는다.public class UserDto { private String name; private int age; public UserDto(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } }
VO
Value Object로값 그 자체를 표현하는객체이다. 특별한로직을 포함할 수 있으며, 객체의불변성(객체의 정보가 변경되지 않는 것)을 보장한다.서로 다른 이름을 갖는
VO 인스턴스를 가질 수 있다. 모든속성이 같다면 두 인스턴스는 같은 객체임을 보장해야 한다. 이것을 위해서VO는Object클래스의equals메소드와hashCode메소드를 오버라이딩 해야 한다.public class User { private final String name; private final int age; public User(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return age == user.age && Objects.equals(name, user.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
Entity
실제
DB의테이블과 매핑되는객체이다. 식별자인id를 통하여 각각의Entity를 구분할 수 있다. 또한 추가적인로직을 포함할 수 잇다.@Entity public class User { @Id @GeneratedValue(Strategy = GenerationType.IDENTITY) private Long id; private String name; private int age; protected User() { } @Builder public User(String name, int age) { this.name = name; this.age = age; } }
DTO 와 VO
보통 웹 개발에서
DTO와VO를혼용해서 사용하곤 한다. 하지만 두객체는 의미를 살펴보아도 서로 다른 점을 가지고 있다. 이제는 두 개의차이점을 잘 구분해야 한다.또한
DTO를VO처럼불변 객체로 사용하면 얻는 이점은 전송하는 과정에서 데이터가 변조되지 않음을 보장한다.
Entity 와 DTO
Entity를DTO로 사용하게 된다면 어떤 문제점이 생기는지 살펴보았다. DB는 보통 정해지면 쉽게 속성 값이 변경되지 않는다. 하지만view의 경우요구사항에 따라 요청하는 데이터가 자주 바뀔 우려가 있다. 이것을 계속해서 반영하게 되면Entity는 수정될 것이고, 영속성 모델을 표현한Entity의 순수성은 모호해질 것이다. 그렇기 때문에controller layer에서 사용할DTO와Entity는 분리하여 사용하는 것이 바람직하다.이와 비슷하게
DTO에서Entity클래스를 참조하는 것은 괜찮지만Entity에서DTO를 참조하여 사용하는 것은 바람직하지 않다. 앞서 말했던 것 처럼DTO의 속성이 변하게 되면 그것을 참조하는Entity에게도 예상치 못하는 수정을 야기할 수 있기 때문이다.
References.
'Programming > Java' 카테고리의 다른 글
[Java] 매개변수(Parameter)와 인수(Argument) (0) 2021.07.22 [JAVA] Arrays.asList() (0) 2021.07.18 [JAVA] 코드를 올바르게 드러내는 방법 (0) 2021.07.16 [Java] Integer.parseInt(), Integer.valueOf() (0) 2021.03.17 [Spring] Singleton Container (0) 2021.01.08