본문 바로가기
TIL,WIL

TIL 241227

by GREEN나무 2024. 12. 27.
728x90

TIL - 챔피언 데이터를 데이터베이스에 삽입하는 API 구현

오늘 배운 것

오늘은 Express, Prisma, 및 파일 시스템 모듈을 활용하여 롤 챔피언 데이터를 데이터베이스에 삽입하고 조회하는 API를 작성했다. 주요 구현 내용은 다음과 같다.


1. 프로젝트에 사용된 주요 기술과 라이브러리

  • Node.js: 백엔드 런타임 환경
  • Express: 라우팅과 API 개발을 위한 웹 프레임워크
  • Prisma: 데이터베이스 ORM으로 SQL 쿼리 없이 데이터베이스를 관리
  • fs/promises: 파일 읽기 및 쓰기를 위한 Promise 기반 파일 시스템 모듈
  • path: 파일 및 디렉터리 경로 관리

설치한 라이브러리

npm install express @prisma/client
npm install --save-dev prisma

2. 구현한 API

2.1. POST /api/update_champion_list

  • 기능:
    • JSON 파일(champion_data.json)에서 데이터를 읽어와 데이터베이스에 삽입.
    • 삽입 전 기존 데이터는 초기화(deleteMany()).
  • Prisma의 createMany 메서드를 활용하여 JSON 데이터를 한번에 삽입하고 중복된 데이터는 무시.

2.2. GET /api/champions

  • 기능:
    • 데이터베이스에 저장된 모든 챔피언 데이터를 조회.

3. 주요 코드 설명

Prisma 테이블 정의

schema.prisma 파일에서 데이터베이스 테이블은 다음과 같이 정의:

model Champions {
  championId Int    @id @default(autoincrement()) // 챔피언 ID, 자동 증가
  image      String @unique // 챔피언 이미지 URL
  name       String @unique // 챔피언 이름
}

파일 경로 관리

  • Node.js의 path와 url 모듈을 사용하여 파일의 절대 경로를 계산:
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

JSON 데이터 읽기

  • fs/promises의 readFile을 사용해 JSON 파일을 비동기로 읽음:
const data = await fs.readFile(filePath, 'utf-8');
const champions = JSON.parse(data);

Prisma를 통한 데이터 삽입

  • Prisma의 createMany를 활용하여 데이터베이스에 JSON 데이터를 삽입:
await prisma.champions.createMany({
  data: champions.map((champion) => ({
    image: champion.image,
    name: champion.name,
  })),
  skipDuplicates: true, // 중복 데이터 무시
});

4. 발생했던 문제와 해결

  • 문제 1: 경로 설정 중 path 모듈 사용 문제.
    • 시도한 방법: 아래와 같이 path 모듈과 dirname을 사용해 파일 경로를 지정하려 했으나, 올바르게 동작하지 않음.
      import path, { dirname } from 'path';
      const __dirname = dirname('../accet/champion_data.json');
      
    • 원인: dirname은 파일 경로를 기반으로 디렉터리를 반환하는 함수인데, 문자열 경로를 직접 사용하여 오류가 발생.
  • 해결: fileURLToPath와 import.meta.url을 사용하여 현재 파일의 경로를 동적으로 가져옴.
  • import { fileURLToPath } from 'url'; import path from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const filePath = path.resolve(__dirname, '../assets/champion_data.json');

이처럼 fileURLToPath를 활용하면 ESM 환경에서도 안정적으로 파일 경로를 계산할 수 있다.

 

  • 문제 2: 경로 설정 중 accet 폴더 오타.
    • 해결: 올바른 경로(assets?)로 수정.
    • path.resolve(__dirname, '../accet/champion_data.json') → path.resolve(__dirname, '../assets/champion_data.json')

5. 배운 점

  • Router: Express의 Router로 라우팅을 캡슐화해 구조적인 코드 작성.
  • Prisma의 유용함: createMany, deleteMany를 통해 데이터 삽입 및 초기화를 간단하게 구현 가능.
  • 파일 경로 관리: ESM 환경에서 fileURLToPath와 path 모듈로 파일 경로를 안전하게 다룰 수 있다.
  • 에러 핸들링: 비동기 작업에서 try-catch를 통해 오류를 잡아 API 안정성을 높임.

 

'TIL,WIL' 카테고리의 다른 글

TIL 250102  (0) 2025.01.02
TIL 241224  (0) 2024.12.24
wil 24.12.20  (0) 2024.12.20
DNS  (1) 2024.12.18
some(), 정규식  (0) 2024.12.17