일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- procedure
- 백준
- MySQL
- bigdata
- hdfs
- BFS
- wrapper class
- Spring
- 우선순위큐
- 프로그래머스
- ES6
- Parquet
- database
- 시뮬레이션
- SQL
- spark
- MVC
- namenode
- datanode
- greedy
- BIT연산
- priorityqueue
- JPA
- ACID
- Algorithm
- boto3
- EventScheduler
- Transaction
- S3
- 구현
- Today
- Total
IT 개발일지
[Java] DAO, DTO 본문
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)
- *계층 간 데이터 전송을 위해 도메인 모델 대신 사용되는 데이터 객체 클래스(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