Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

IT 개발일지

[Java] DAO, DTO 본문

카테고리 없음

[Java] DAO, DTO

맛난밤송이 2024. 4. 1. 10:17

DAO(Data Access Object)

- 영속성 메커니즘(Persistence,  ex. 파일 시스템, 데이터베이스)에 접근하는 역할을 하는 객체

- 프로젝트의 서비스 모델에 해당하는 부분과 데이터베이스를 연결

- 주로 CRUD와 같은 처리를 담당하는 객체 혹은 그러한 패턴을 의미

 

DAO를 사용하는 이유??

- 만약 Business Layer에서 직접 DBMS의 특정 벤더의 API를 사용하게 된다면

  => Database Layer의 변화가 Business Layer까지 영향을 끼치게 된다.

- 이러한 일을 방지하기 위해  저수준인 *Persistence Logic을 캡슐화하고 Domain Layer에게 객체지향적인 인터페이스 제공

- DAO를 사용하여 영속성 메커니즘에 대한 CRUD 로직을 캡슐화하게 되면, Business Layer는 데이터에 접근하는 방식을 알고있지 않게된다. 

- 즉, DAO에서는 CRUD 로직에만 집중할 수 있게 된다.

- 그리고 Business Layer은 데이터에 접근하는 방식은 모른 채, Business Logic에만 집중할 수 있게 된다.

Persistence Logic :데이터를 데이터베이스에 저장하거나 데이터베이스로부터 데이터를 읽어오는 등의 작업을 수행

 


DTO(Data Transfer Object)

https://hudi.blog/data-transfer-object/

- *계층 간 데이터 전송을 위해 도메인 모델 대신 사용되는 데이터 객체 클래스(Java Beans)

- 주로 View 및 Controller 간 계층에서 활용되기도 한다.

계층 : Presentation(View, Controller), Business(Service), Persistence(DAO, Repository) 등을 의미

 

- DTO는 데이터를 저장, 검색, 직렬화, 역직렬화 로직만을 가져야 한다고 한다. 즉, 다른 비즈니스 로직을 포함하지 않는다.

 

DTO를 사용하는 이유?

1. *도메인 모델을 캡슐화하여 보안 강화

  - UI계층에서 도메인 모델의 메소드를 호출하거나 상태 변동시킬 수 있음

  - 도메인 모델은 UI에 필요하지 않은 정보까지 가지고 있는데,  모든 도메인 모델 속성이 외부에 노출되면 보안 문제 발생

2. 도메인 모델을 계층간 전송에 사용하여 Model과 View가 강하게 결합될 수 있는 현상 방지

 

※ 도메인 모델(Domain Model)

-  소프트웨어 시스템이 다루는 실제 비즈니스 개체와 개념을 나타내는 객체들의 집합

1. 은행 계좌 도메인 객체

public class Account {
    private long id;
    private Customer owner;
    private double balance;
    
    // 생성자, 게터, 세터 등...

    // 비즈니스 로직 예시
    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        } else {
            throw new IllegalArgumentException("Invalid withdrawal amount");
        }
    }
}

 

2. 은행 계좌 DTO

public class AccountDTO {
    private long id;
    private long ownerId;
    private double balance;
    
    // 생성자, 게터, 세터 등...
}

 

- 두 객체의 가장 큰 차이점은 Account 객체에는 계좌 정보 이외에도 출금하는 비즈니스 로직이 포함되어 있다는 것이다.

- UI 입장에서는 당연히 비즈니스 로직까지는 불필요하다. 이는 보안상 문제도 발생할 수 있다.

- 반면 AccountDTO 클래스는 오로지 데이터 전송을 위한 용도로 설계되었기 때문에, 비즈니스 로직이나 동작을 가지고 있지 않으며 계층 간 결합을 완화하는 시스템 유연성, 필요한 정보만 전송하는 전송 효율성 또한 증가한다. 

 


출처

- DAO : https://hudi.blog/data-access-object/

- DTO : https://hudi.blog/data-transfer-object/

- VO, Entity : https://ccomccomhan.tistory.com/35