[Spring] DAO, DTO, VO의 개념과 차이점

Dodam·2023년 7월 22일
0

[Spring]

목록 보기
9/9
post-thumbnail

스프링 패키지 구조


1. DAO (Data Access Object)

DAO는 실제 DB에 접근하는 객체를 뜻한다.
프로젝트의 Service 모델과 실제 DB를 연결하는 역할을 한다.
JPA에서는 DB에 데이터를 CRUD하는 Repository 객체들이 DAO 역할을 한다고 볼 수 있다.

2. DTO (Data Transfer Object)

DTO는 데이터를 Transfer(이동)하기 위한 객체이다. Client가 Controller에게 요청을 보낼 때도 RequestDto의 형식으로 데이터가 이동하고, Controller가 Client에게 응답을 보낼 때도 ResponseDto의 형태로 데이터를 보내게 된다.

Controller와 Service, Repository 계층 사이에 데이터가 오갈 때도 데이터는 DTO의 형태로 이동하게 된다.

DTO는 로직을 갖고 있지 않는 순수한 데이터 객체이며, 일반적으로 getter/setter 메서드만을 가진다. 하지만 DTO는 단순히 데이터를 옮기는 용도이기 때문에 굳이 Setter를 이용해 값을 수정할 필요 없이, 생성자만을 사용하여 값을 할당하는 것이 좋다.

DTO를 사용하는 이유

데이터를 이동할 때 Entity 객체를 그대로 사용하지 않고 DTO를 사용하는 이유는?

  1. View Layer와 DB Layer의 역할을 분리

  2. Entity 객체의 변형을 방지

  3. View와 통신하는 DTO 클래스의 잦은 변동
    View(클라이언트)와 통신하는 DTO 클래스, 예를 들어 ResponseDTO, RequestDTO는 요구사항에 따라 자주 변경된다.
    어떤 요청에서는 특정 값이 추가될 수도 있고, 특정 값이 없을 수도 있다.
    따라서 Entity 클래스와 분리하여 관리해야 한다.

  4. 도메인 모델링의 보호
    예를 들어 Entity 클래스의 특정 컬럼들을 조합하여 특정 포맷을 출력하고 싶은 경우, Entity 클래스에 표현을 위한 필드나 로직이 추가되면 객체 설계를 망가뜨릴 수 있다. 따라서 DTO에 표현을 위한 로직을 추가해서 사용하는 것이 Entity의 도메인 모델링을 지킬 수 있다.

DAO와 DTO의 구별

DAO는 DB에 접속, 명령 전송을 전담하는 클래스이고, DTO는 특정 테이블의 정보를 레코드 단위로 정의해놓은 클래스이다.

예를 들어 DB에 어떤 학교의 학과번호, 학과명, 학생수를 관리하기 위한 테이블이 있다.
테이블 이름 : DEPARTMENT
컬럼 항목 : ID, NAME, NUM

그리고 아래와 같이 3개의 레코드가 저장되어 있다.

IDNAMENUM
1Computer Science483
2Biotechnology213
3Mathematics154

이 때, 레코드를 하나의 자료형으로 다루기 위해 정의한 클래스를 DTO라고 한다.

public class DepartmentDTO {
	private int id;
    private String name;
    private int num;
    
    public int getId() {
    	return id;
    }
    
    public void setId(int id) {
    	this.id = id;
    }
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public int getNum() {
    	return num;
    }
    
    public void setNum(int num) {
    	this.num = num;
    }
}

이에 반해 DAO는 이 DTO에 정보를 저장하기 위해 DB와의 연결만을 전담하는 클래스이다.

3. VO (Value Object)

값 오브젝트로써, 값을 위해 쓰이며, Read-Only의 특징을 가진다.
다만, DTO와의 차이는 DTO는 데이터를 계층간 교환(Transfer)하는 데 의미가 있고, VO는 읽기만 가능한 read-only 속성을 가진 객체로서 데이터 그 자체에 의미를 두고 있다는 점이다. 즉, VO는 setter가 없다.

4. Entity, Controller, Service, Repository의 개념

Entity

  • Entity는 DB의 테이블에 존재하는 Column들을 필드로 가지는 객체를 뜻한다.
  • DB의 테이블과 1대1 대응이며, 테이블에 없는 컬럼을 필드로 가져서는 안 된다.
  • Entity 클래스는 다른 클래스를 상속받거나 인터페이스의 구현체여서는 안 되고 순수한 데이터 객체인 것이 좋다.
    (만약, 중복되는 내용이 있을 경우 baseEntity를 만들어 상속할 수 있다.)

예를 들어 DB의 Employee 라는 테이블에 id, name, age 컬럼이 있다고 할 때

@Entity 
// JPA를 사용할 경우, @Entity 어노테이션을 붙여 해당 클래스가 Entity 클래스임을 명시
public class Employee {

	@Id
    private Long id;
    private String name;
    private int age;

이에 대응하는 Entity 클래스 Employee는 위와 같은 필드들만 가져야 한다.

Controller

Controller는 클라이언트의 요청을 DTO의 형태로 받아 Service의 기능을 호출하고, 적절한 응답을 DTO의 형태로 반환하는 역할을 한다. 즉, 요청과 응답을 관리하는 계층이라고 생각하면 된다.

Service

Service 계층은 DTO를 통해 받은 데이터를 이용해 비즈니스 로직을 처리하고, DAO(혹은 Repository)를 통해 DB에 접근하여 데이터를 관리하는 역할을 한다.

Repository

JPA를 사용하면 Repository를 통해 DB에 실제로 접근할 수 있다. Service와 DB를 연결해주는 역할을 하며, Service 계층에서 Repository를 이용하여 데이터를 관리할 수 있다.

profile
⏰ Good things take time

0개의 댓글