SPRINT5

권나현·2025년 7월 15일
post-thumbnail

스프린트 미션5 목표

  • 기존 자바스크립트 기반의 프로젝트를 타입스크립트로 전면 마이그레이션

  • tsconfig.json 설정 및 개발 환경(ts-node, nodemon) 구성

  • 비즈니스 로직을 Controller / Service / Repository 계층으로 분리

  • DTO (Data Transfer Object) 도입으로 유효성 검사 및 계층 간 데이터 흐름 명확화

주요 작업 내역

1. TypeScript 개발 환경 구축

  • tsconfig.json 설정 (outDir, rootDir, strict 등)

  • @types/express, @types/node, ts-node, nodemon 설치

  • 개발 서버 실행 스크립트 작성
    → npm run dev (ts-node + nodemon 사용)

2. 전체 디렉토리 구조 리팩토링

디렉토리 구조

├── prisma
│ └── schema.prisma, seed.js
├── src/controllers
│ └── article.controller.js, comment.controller.js, product.controller.js
├── src/middlewares
│ └── auth.js, ownership.js, validation.js
├── src/routes
│ └── article.routes.js, comment.routes.js, product.routes.js, upload.routes.js, auth.routes.js, user.routes.js
├── src/utils
│ └── errorHandler.js, token.js, app.js, server.js
├── src/repositories
│ └── article.repository.ts, comment.repository.ts, product.epository.ts
├── src/dtos
│ └── article.dto.ts, comment.dto.ts, product.dto.ts
├── src/services
│ └── article.service.ts, comment.service.ts, product.service.ts
├── types/express
│ └── index.d.ts
├── uploads
│ └── 무침족발-1748236229012.jpg, 아이폰11프로-1748236221455.png, 컴퓨터책상-1748237562476.png, 혜원style1-1751108365297.png, 홈트하는여자-1748236237385.png
├── .env
├── .gitignore
├── package-lock.json
├── package.json
├── test.http
└── tsconfig.json

  • 각 도메인(article, product, comment)에 대해 Controller → Service → Repository 구조 분리

3. DTO 적용 (Zod)

  • zod 라이브러리로 CreateProductDto, UpdateCommentDto 등 정의

  • 각 Controller에서 safeParse()를 통해 유효성 검사 수행

  • req.body에 직접 접근하는 대신 파싱된 데이터 사용

예:

const parsed = CreateProductDto.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error.issues[0].message });

레이어드 아키텍처 적용 예시

1. [Controller]

export const createProduct = async (req, res) => {
  const parsed = CreateProductDto.safeParse(req.body);
  const product = await ProductService.createProduct(parsed.data);
};

2. [Service]

export class ProductService {
  static async createProduct(data) {
    return await ProductRepository.create(data);
  }
}

3. [Repository]

export const ProductRepository = {
  create: async (data) => prisma.product.create({ data })
};

테스트 수행

  • Controller → Service → Repository 흐름에 console.log 삽입하여 추적

  • DTO 유효성 검사 테스트 (빈 문자열, 타입 오류 등)

  • 인증/인가 테스트 (req.user 인증, 소유자만 수정 가능 등)

  • 실제 DB 반영 여부 확인 (Prisma Studio 활용)

  • test.http로 API 자동 테스트 작성 및 반복 확인

배운 점 / 느낀 점

  • 타입스크립트 도입 후 컴파일 타임 오류 발견이 쉬워졌고, 생산성이 향상되었다.

  • 레이어드 아키텍처 덕분에 책임이 명확히 나뉘어 유지보수가 쉬워졌다.

  • DTO 사용으로 데이터 유효성 검사를 명확하게 수행할 수 있었고, 클린 코드 작성에 도움이 되었다.

  • 작은 프로젝트라도 구조적으로 짜는 습관이 중요하다는 것을 느꼈다.

profile
node.js 백앤드 개발자가 되기 위한 Study Vlog

0개의 댓글