카테고리 없음

Entity,Dto,Dao

jineric 2023. 1. 14. 17:12

국비과정에서 배웠던 기억은 나는데 정확히 Dto와 Dao가 무엇이고, 어떻게 활용하는지 기억이 안난다.

Dto와 Dao는 무엇을 하기위해서 나오고, 왜 사용하는걸까??

Java에서 배웠지만 Spring Boot에서 Entity DAO DTO를 쓴다

Entity의 용도는 대략적으로 알지만 한 번더 배워보자

 

Entity

Entity 클래스는 DB테이블에 존재하는 Column들을 필드로 가지고 있는 객체라고 한다.

Entity는 DB테이블과 1 :  1 로 대응되고 테이블이 가지지 않는 컬럼을 필드로 가질수 없다.

그리고 Entity 클래스는 다른 클래스를 상속 받거나 인터페이스의 구현체로 사용 될 수 없다.

 

ex)

package com.watcha.watchapedia.model.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity(name = "tbBook")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Table(name = "tb_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bookIdx;
    private String bookThumbnail;
    @Column(length =100)
    private String bookTitle;
    @Column(length =100)
    private String bookTitleSub;
    @Column(length =20)
    private String bookWriter;
    @Column(length =20)
    private String bookCategory;
    @Column(length =20)
    private String bookAtDate;
    @Column(length =10)
    private String bookPage;
    @Column(length =10)
    private String bookAge;
    private String bookSummary;
    private String bookPeople;
    private String bookContentIdx;
    private String bookPubSummary;
    private String bookBackImg;
    private String bookBuy;

}

만들 Watchapedia페이지의 컨텐츠중 책 Entity이다.

Entity 클래스 Book은 book테이블의 컬럼들을 필드로 가져야 한다.

 

JPA를사용할 때 어노테이션(@)을 사용하여 @Entity를 클래스의 상단에서 명시 해야하고,

@Id @generatedValue를 primary key에 연결하고,

내부필드에서 @Column(length = ??) sql과 연동하여 길이를 설정 할 수 있다

 

DAO

DAO는 (Data Access Object)의 약자로 직역하면 데이터 접근 객체라고 볼 수 있다.

실제로 DB에 접근하려면 DAO를 사용한다.

DAO는 프로젝트 Service 모델과 실제 데이터베이스를 연결하는 역할을 하며,

JPA에서는 DB에 데이터를 CRUD하는 Repository 객체들이 DAO라고 볼 수 있다

(DAO는 service와 데이터베이스 연결!, DAO =JPA의 DB데이터를 CRUD하는 Repository)

 

DAO와 Repository의 용도는 같다고 볼 수 있는데 차이점은 무엇인지 아직 감이 잡히지 않는다.

 

 

Dto

Dto는 (DataTransfer Object)의 약자로 계층 간 데이터 교환 역할? 이라고 한다. 

DB에서 꺼낸 데이터를 저장 = Entity 

Entity를 가지고 만드는 일종의 Wrapper라고 볼수 있다.

Entity를 Controller 같은 계층이나 클라이언트에 직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.

 

DTO는 계층간 데이터 교환이 이루어 질 수 있도록 하는 객체라서 특별한 로직을 가지지 않는 순수한 데이터 객체이다.

DB에서 꺼낸 값을 DTO에서 임의로 조작할 필요가 없어서 DTO에는 Setter를 만들 필요가 없고 생성자에서 값을 할당한다.

 

ps.Entity가 있는데 굳이 DTO를 사용할까???

 

Entity와 DTO를 분리하는 이유

Entity의 값이 변하면 Repository 클래스의 Entity Manager의 flush가 호출될 때 DB에 값이 반영되고

다른 로직들에도 영향을 미친다. 그래서 View와 통신하면서 데이터 변경이 많은 DTO클래스를 분리해 주어야 한다.