lala9663
Bump into
lala9663
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (1)
    • Java (39)
    • Spring (28)
    • IntelliJ (7)
    • Git,Github (2)
    • CS (22)
    • Algorithm (23)
      • Algorithm 문제 (13)
    • 공부방 (9)
    • 그 외 (27)
      • TIL (24)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 정적
  • Get
  • was
  • 자바
  • 스트림(Stream)
  • try-catch
  • Spring
  • Java
  • jsp
  • servlet
  • Post
  • 동적
  • 1193
  • 백준
  • 웹 3.0
  • 백준 벌집
  • Intellij
  • Til
  • 백준 2292
  • 웹서버
  • 자바 람다
  • thread

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
lala9663

Bump into

[Spring] DAO, DTO, VO, Entity 란?
Spring

[Spring] DAO, DTO, VO, Entity 란?

2022. 10. 22. 15:56

spring을 사용하면 가장 먼저 접하는 용어 중 하나가 DTO DAO VO 일 것이다.

스프링 패키지 구조

DAO

  • DAO(Data Access Object)는 데이터베이스의 data에 접근하기 위한 객체이다. DataBase에 접근하기 위한 로직 & 비즈니스 로직을 분리하기 위해 사용한다.
  • PA, Hibernate, Mybatis 등의 Persistence Framework를 통해 접근한다.

DTO

  • DTO(Data Transfer Object 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로 DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter)만 가지는 클레스이다. 따라서 DTO는 데이터 전송(이동) 객체라는 의미를 가진다.
  • @Getter @Setter class ArticleDTO { private String title; private String content; private String writer; }

유저가 입력한 데이터를 DB에 넣으면 →
유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송 →
해당 DTO를 받은 서버가 DAO를 이용하여 DB로 데이터를 집어넣는다.

VO

  • VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다.
  • read-Only 특징(사용하는도중에 변경 불가능하며 오직 읽기만 가능 -getter 메서드만 가진 클래스)
  • equals(), hashcode() 오버라이딩 필요하다.
  • DTO와 유사하지만 DTO는 Setter를 가지고 있어 값이 변할 수 있다.
  • VO 내부에 선언된 필드 모든 값들이 같아서 동일 객체인지 판단하기 위함이다.
@Getter
class ArticleVO {
    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;
        Article article = (Article) o;
        return Objects.equals(id, article.id);
    }

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

Entity

  • 실제 데이터베이스와 1:1 매칭되는 클래스
  • DB 테이블 내 존재하는 컬럼만을 속성(필드)으로 가져야 한다.(테이블 내에 존재하지 않는 칼럼을 가져도 안됨)
  • 상속받거나 구현 클래스면 안된다.
  • 최대한 외부에서 Entity 클래스의 getter/setter를 사용하지 않도록 클래스 내부에서 필요한 로직을 구현해야 함
  • setter 무분별하게 사용 금지
  • 객체의 일관성을 보장할 수 없음
  • 구현 메소드는 주로 Service Layer에서 사용함
  • Domain Logic
  • Presentation Logic을 가지면 안 됨
// Article 엔티티
@Entity
@Getter
@Table(name = "article")
public class Article {

    // 기본 생성자 protected로 접근 제한 (기본 생성자 접근 제한자는 protected 까지 허용
    // 기본 생성자의 접근 제한자를 private으로 걸면 추후에 Lazy Loading 사용 시 Proxy 관련 예외가 발생)
    protected Article(){};
...
}

// 객체 생성 시 값 세팅 (빌더패턴 사용)
Article article = Article.Builder()
.title("Harry Potter")
.content("...")
.writer("J. K. Rowling.")
.build();

간단 비교

'Spring' 카테고리의 다른 글

[JSP] EL 과 JSTL 정리  (0) 2022.10.26
[JSP] 기초 문법  (0) 2022.10.25
[JSP] Java Beans  (0) 2022.10.22
[JSP] Cookie  (0) 2022.10.20
[JSP] Session  (0) 2022.10.20
    'Spring' 카테고리의 다른 글
    • [JSP] EL 과 JSTL 정리
    • [JSP] 기초 문법
    • [JSP] Java Beans
    • [JSP] Cookie
    lala9663
    lala9663
    초보의 험난한 공부

    티스토리툴바