본문 바로가기

IntelliJ/Spring boot

[Spring boot] Entitiy, DTO, VO 차이 -hoyhi-tistory

엔티티(Entity)

  • JPA @Entity
  • 실제 Database의 테이블과 1:1 매핑
  • DB의 테이블내에 존재하는 컬럼만을 속성으로 가짐
  • 상속받거나 구현체여서는 안됨, 존재하지 않는 컬럼을 가지면 안됨
  • VO와 다르게 식별성을 가짐

무분별한 Setter는 객체의 일관성 보장을 해치므로 사용 자제(객체의 생성자에 값 추가하는 형식으로 사용)

// <객체 생성자 설정>
@Builder
public User(String username, String password, String name) {
            this.username = username;
            this.password = password;
            this.name = name;
}

// <객체 생성 시 값 세팅(Builder 패턴)>
User user = User.Builder()
       .username("name")
       .password("1234")
       .name("name")
       build();

// ex1 ) Spring Boot Entity.class

    @Entity
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    @ToString
    public class Member {
     
      @Id
      private String email;
      private String password;
      private String name;

      public Member(String email){
      		this.email = email;
    }

VO(Value Object)

  • 값 객체
  • 값이 같으면 같은 객체라고 인식하는 식별성 없는 작은 객체
  • 핵심적인 역할 : equals() 와 hashcode() 를 overriding
  • 테이블 속성 외의 추가적인 속성 가짐
  • ReadOnly
//ex) Spring Boot VO

class BookVO {
     private Long id;
     private String title;
     private String contents;

     @Override
     public boolean equals(Object o) {
           if (this == o) return true;
           if (o == null || getClass() != o.getClass()) return false;
           BookVO bookVO = (BookVO) o ;
           return Objects.equals(id, bookVO.id);
     }

     @Override
     public int hashCode() {
          return Objects.hash(id);
     }
}

DTO(Data Transfer Object)

  • DB의 데이터를 Service나 Controller 등올 보낼 때 사용하는 데이터 전송 객체
  • DB의 데이터가 Presentation Logic Tier로 넘어올때는 DTO로 변환되어 오고감
  • 네트워크 전송 시 Data holder의 느낌이 강함
  • 데이터 가공 처리를 감싸주는 객체

//ex) Spring Boot DTO

class MenuDTO() {
     private String name;
     private String description;
     private int price;
}