Entity
실제 DB의 테이블과 매핑되는 객체이다.
id
로 Entity를 구분한다.public class Member { private final String id; private final String name; public Member(String id, String name) { this.id = id; this.name = name; } }
DTO(Data Transfer Object)
계층(Layer)간 데이터 교환을 위해 사용하는 객체이다.
데이터 교환만을 위해 사용한다.
로직을 갖지 않고, getter()/setter()만 갖는다.
public class MemberDto { private String id; private String name; public MemberDto(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
VO(Value Object)
값 자체를 표현하는 객체이다.
로직을 포함할 수 있고, 객체의 불변성을 보장한다.
getter()를 가질 수 있다. setter()는 가지지 않는다.
서로 다른 이름을 갖는 VO 인스턴스여도 모든 속성 값이 같으면 두 인스턴스는 같은 객체라고 할 수 있다.
- 동일 객체인지 확인하기 위해 Object클래스의 equals()와 hashCode() 오버라이딩 함
public class Member { private final String id; private final String name; public Member(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } @Override public boolean equals(Object object) { if(this == object) return true; if(object == null || getClass() != object.getClass()) return false; Member member = (Member) object; return id == member.id && Objects.equals(name, member.name); } @Override public int hashCode() { return Objects.hash(id, name); } }