기존 프로젝트에 DTO를 적용해보자.
DTO(Data Transfer Object)는 데이터를 안전하고 명확하게 전달하기 위한 객체입니다.
DAO(Data Access Object)는 데이터베이스와의 상호작용을 담당하는 계층입니다.
이 글에서는 DTO를 활용한 데이터 검증과 DAO를 활용한 데이터베이스 접근 로직을 구현해보겠습니다.
디렉토리 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
src/
├── dtos/ # DTO 정의
│ └── user.dto.ts
├── models/ # DAO
│ └── user.model.ts
├── passports/ # 인증 관련 코드
│ ├── index.ts
│ └── strategy/
│ ├── local.strategy.ts
├── utils/ # 유틸리티 함수
│ └── crypto.until.ts
├── tsconfig.json
└── app.ts
DTO 설계
DTO(Data Transfer Object)를 설계할 때는 유효성 검증, 확장성, 코드 재사용성을 고려해야 합니다.
인터페이스 기반 DTO + express-validator 로 유효성 검증까지 구현해보겠습니다.
이후에 NestJS를 도입할 때, 클래스 기반 DTO + class-validator로 변환해주겠습니다.
이유 : 클래스는 class-validator와 class-transformer를 활용한 유효성 검사 및 변환이 가능하지만, 인터페이스는 컴파일 타임에서만 체크됩니다.
user.dto.ts
1
2
3
4
5
export interface CreateUserDTO {
id: string;
password: string;
nickname: string;
}
model 변환
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { CreateUserDTO } from "dtos/user.dto";
import prisma from "config/prismaClient.js";
class UserDAO {
// 사용자 정보 조회 (ID로 조회)
static async getUserById(id: string) {
try {
const user = await prisma.user.findUnique({
where: { id },
});
return user;
} catch (err) {
throw err;
}
}
// 사용자 추가 정보 조회 (user_id로 조회)
static async getUserInfo(userId: number) {
try {
const userInfo = await prisma.user_info.findUnique({
where: { user_id: userId },
});
return userInfo;
} catch (err) {
throw err;
}
}
// 사용자 생성
static async createUser(userInfo: CreateUserDTO) {
try {
await prisma.$transaction(async (prismaTransaction) => {
const newUser = await prismaTransaction.user.create({
data: {
id: userInfo.id,
password: userInfo.password,
},
});
await prismaTransaction.user_info.create({
data: {
user_id: newUser.user_id,
nickname: userInfo.nickname,
},
});
});
} catch (err) {
throw err;
}
}
}
export default UserDAO;
결론
DTO와 DAO를 기존 프로젝트에 적용해보았습니다.
- DTO 적용 : 데이터 구조 명확화 & 타입 안전성 강화
- DAO 적용 : DB 접근 코드 분리 & 유지보수성 향상
이후 NestJS를 도입할 때, 클래스 기반 DTO와 class-validator를 적용하는 과정도 포스팅해보겠습니다.