Home Js to Ts (dto)
Post
X

Js to Ts (dto)

기존 프로젝트에 DTO를 적용해보자.

참고글 : DTO, DAO

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를 도입할 때, 클래스 기반 DTOclass-validator를 적용하는 과정도 포스팅해보겠습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.