패키지 나누기

jungnoeun·2022년 9월 22일
0

spring

목록 보기
17/24

Controller, Service, ServiceImpl,DAO,VO

DAO (Data Access Object)

DAO는 데이터베이스의 데이터에 접근하기 위한 객체이다.

  • 직접 데이터베이스에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
  • 데이터베이스에 접근하기 위한 로직&비즈니스 로직을 분리하기 위해 사용한다.
  • DAO의 경우는 데이터베이스와 연결할 Connection까지 설정되어 있는 경우가 많다.
  • 현재 많이 쓰이는 Mybatis등을 사용할 경우 커넥션풀까지 제공하고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.




DTO(Data Transfer Object)

DTO는 계층 간 데이터 교환을 하기 위해 사용하는 객체이다. DTO는 로직을 가지지 않는 순수한 데이터 객체이고, getter&setter 메서드만 가진 클래스이다.

  • DTO는 주로 비동기 처리를 할때 사용한다.

유저가 입력한 데이터를 데이터베이스에 넣는 과정을 보자

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

계층 간 데이터교환을 위한 객체(Java Beans)이다.

  • DB의 데이터를 Service나 Controller등으로 보낼 때 사용하는 객체이다.
  • DB의 데이터가 Presentation Logic Tier로 넘어올때는 DTO로 변환되어 오고가는 것이다.
  • 로직을 갖고 있지 않은 순수한 데이터 객체이며, getter/setter 메서드만을 갖는다.
  • 또한 Controller Layer에서 Response DTO 형태로 Client에 전달한다.

Spring Boot DTO 예제 코드

@Getter @Setter
class ArticleDTO {
  private String title;
  private String content;
  private String writer;
}




VO (Value Object)

VO값 오브젝트로써 값을 위해 쓰인다. read-Only 특징(사용하는 도중에 변경불가능하며 오직 읽기만 가능)을 가진다.

  • DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있습니다.
  • VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.
    VO 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별한다.

Spring Boot VO 예제 코드

@Getter @Setter
@Alias("article")
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);
}
}




DTO vs VO

  • DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다.(getter/setter)

  • 그에 반해 VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다.(getter만 존재)

  • DTO는 인스턴스 개념이라면 VO는 리터럴 개념.

  • 즉, VO는 특정한 비즈니스 값을 담는 객체이고, DTO는 Layer간의 통신 용도로 오고가는 객체를 말한다.




Entity

  • Entity 클래스는 실제 DataBase의 테이블과 1 : 1로 매핑 되는 클래스로, DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.
  • Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안된다.

참고
DAO, DTO, VO,Entity 차이
https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4

profile
개발자

0개의 댓글