[Spring] Entity vs DTO vs VO

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);  
        }  
    }