Prisma ORM이란?

Prisma는 Node.js와 TypeScript를 위한 ORM(Object-Relational Mapper)입니다.

ORM이란, 프로그래밍 코드의 객체(Object)와 관계형 데이터베이스(Relational DB)의 테이블을 서로 연결(Mapping)해주는 '번역기'와 같은 역할을 하고 있습니다.

복잡한 SQL 쿼리문(SELECT * FROM users WHERE ... 등)으로 작성하는 대신 익숙한 JavaScript/TypeScript 코드(prisma.user.findMany() 등)로 데이터베이스를 조작할 수 있게 해줍니다.


Prisma ORM의 차별점

  1. 타입 안정성 (Type-Safe) : Prisma의 가장 큰 장점이며, 데이터베이스 스키마를 기반으로 완벽한 타입이 적용된 클라이언트를 생성합니다. 코드 작성 시 자동 완성이 지원되고 존재하지 않는 컬럼에 접근하는 등의 실수를 컴파일 단계에서 막아줍니다.
  2. 직관적인 스키마 파일 (schema.prisma) : 데이터베이스의 구조를 하나의 파일에서 명확하고 읽기 쉽게 관리합니다. 이 파일만 보면 DB 전체 구조를 파악할 수 있습니다.
  3. 안전한 데이터베이스 마이그레이션 : 'prisma migrate' 명령어로 데이터베이스 구조 변경 이력을 자동으로 관리하고 안전하게 적용할 수 있습니다.

Prisma는 3가지 핵심 요소로 구성됩니다. 

요소 역할 비유
Prisma Schema 데이터베이스 구조를 정의하는 설계도 건물의 청사진
Prisma Migrate 설계도를 보고 실제 DB를 변경하는 시공사 청사진대로 건물을 짓는 일
Prisma Client 완성된 DB를 코드에서 조작하는 리모컨 완성된 건물 시설을 사용하는 리모컨

Prisma ORM 사용법

간단한 블로그의 UserPost 테이블을 만든다는 가정으로 진행합니다.

설치 및 초기 설정

  1. 필요한 패키지 설치Generated bash
    // Prisma CLI(명령어 도구) 설치
    npm install prisma --save-dev
    
    // Prisma Client(코드에서 사용할 라이브러리) 설치
    npm install @prisma/client

     

  2. Prisma 프로젝트 초기화Generated bash
          npx prisma init
    위의 명령어을 실행하면 prisma 폴더와 그 안에 schema.prisma 파일, .env 파일이 생성됩니다.

  3. .env 파일에 데이터베이스 연결 정보 입력
    .env 파일을 열어 자신의 데이터베이스 주소를 입력합니다. (예: PostgreSQL)Generated env
          DATABASE_URL="postgresql://사용자이름:비밀번호@호스트:포트/데이터베이스이름"

2단계: 데이터 모델링 (schema.prisma 작성)

prisma/schema.prisma 파일이 데이터베이스의 설계도입니다. 여기에 UserPost 모델을 정의합니다.

Generated prisma

// prisma/schema.prisma

// 데이터베이스 종류와 주소를 지정합니다.
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// Prisma Client를 생성하기 위한 설정입니다.
generator client {
  provider = "prisma-client-js"
}

// User 모델 (users 테이블)
model User {
  id    Int     @id @default(autoincrement()) // 고유 ID (기본 키), 자동 증가
  email String  @unique // 이메일 (중복 불가)
  name  String? // 이름 (선택 사항)
  posts Post[]  // 한 명의 유저는 여러 개의 Post를 가짐 (1:N 관계)
}

// Post 모델 (posts 테이블)
model Post {
  id        Int      @id @default(autoincrement())
  title     String
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id]) // User 모델과 관계 설정
  authorId  Int      // 외래 키
}

설계도를 실제 데이터베이스에 적용합니다. 터미널에 다음 명령어를 입력하세요.

      npx prisma migrate dev --name "init"
  • migrate dev: 개발 환경에서 마이그레이션을 실행합니다.
  • --name "init": 이 변경 사항에 "init"이라는 이름을 붙여 히스토리를 관리합니다.

위 명령 성공시, DB에 UserPost 테이블이 생성되고 동시에 최신 스키마에 맞는 Prisma Client가 자동으로 생성(업데이트)됩니다.

4단계: Prisma Client의 데이터 조작 (CRUD)

이제 코드에서 데이터를 자유자재로 다룰 수 있습니다.

  1. Prisma Client 인스턴스 생성
    애플리케이션에서 한 번만 생성하여 재사용하는 것이 좋습니다.
    // lib/prisma.ts
    import { PrismaClient } from '@prisma/client'
    
    export const prisma = new PrismaClient()
  2. CRUD 작업 수행
    • 데이터 생성 (Create)
      const newUser = await prisma.user.create({
        data: {
          email: "test@example.com",
          name: "김강현",
        },
      });
    • 데이터 조회 (Read)
      // 모든 사용자 조회
      const users = await prisma.user.findMany();
      
      // 특정 게시물을 작성자 정보와 함께 조회
      const post = await prisma.post.findUnique({
        where: { id: 1 },
        include: {
          author: true, // author 관계를 포함해서 가져옴
        },
      });
    • 데이터 수정 (Update)
      const updatedPost = await prisma.post.update({
        where: { id: 1 },
        data: {
          published: true,
        },
      });
    • 데이터 삭제 (Delete)
      const deletedUser = await prisma.user.delete({
        where: { email: "test@example.com" },
      });

       


정리

Prisma의 핵심 사용법을 정리했습니다.
위의 단계를 통해서 SQL 쿼리 없이 타입스크립트 코드만으로 안전하고 직관적으로 데이터베이스를 관리할 수 있습니다.

728x90

'CS' 카테고리의 다른 글

세션(Session)이란?  (1) 2025.08.03
클린 아키텍쳐(Clean Architecture)란?  (0) 2025.07.12
객체 지향이란?  (0) 2025.06.29
데이터 정규화(Normalization)란?  (0) 2025.06.26
동기화와 비동기화  (0) 2025.06.20

오늘의 목표는 프로젝트 명세서의 공유와 개발 시작을 위한 기술과 협업을 위한 기반을 정하는 것 이였습니다. 아래에 상세 내용을 공유합니다.

프로젝트 방향성 공유 및 최종 목표 확정

오늘은 프로젝트에서 모든 팀원이 동일한 목표를 향해 나아갈 수 있도록 방향성을 맞추는 데 집중했습니다.

  • 역할 분담(R&R) 확정: 5인 병렬 개발 방식을 위해 이전에 제시했던 기능별 풀스택 개발 방식을 기반으로 각 팀원의 역할과 책임 영역을 확정했습니다.
    • A : 로그인 기능, 네비게이션 배너
    • B : 프로젝트 세팅, 기능 구현
    • C : 배포, 기능 구현
    • D : Prisma ORM, 기능 구현, 네비게이션 배너
    • E : 기능 구현

데이터베이스 스키마(DB Schema) 최종 결정

프로젝트에서 중요한 자료가 될 데이터베이스 구조에 대하여 토론 했고, 최종 스키마를 확정했습니다. 이 과정에서 기술적 의도와 기획 의도 에 대한 결정을 내렸습니다.

  • 논의 1 : user_achievementscreated_at 필드
    쟁점: 업적 달성 시점을 직접 저장할 것인가(역정규화), 필요할 때마다 다른 데이터를 분석하여 계산할 것인가(정규화).
    결정 : created_at 필드를 삭제하기로 결정.
    근거 : 우리 서비스는 고도의 조회 성능 최적화보다 데이터의 중복을 없애는 '정규화' 원칙을 따르는 것이 더 합리적이라고 판단했습니다. 로직의 복잡성이 약간 증가하더라도, 데이터 무결성을 유지하는 방향을 선택했습니다.

  • 논의 2 : feedbacks 테이블의 참조 관계
    쟁점 : AI 피드백을 '챌린지' 단위로 할 것인가, '루틴' 단위로 할 것인가.
    결정 : 현재 ERD 구조(챌린지 참조)를 유지하기로 결정.
    근거: '1주일마다 루틴에 대한 피드백' 기능은 중요하지만 현재 설계상 챌린지를 통해 하위 루틴 데이터에 접근이 가능하다. 또한, 우리의 컨셉은 '챌린지'에 대한 것이므로 챌린지 단위의 종합 피드백 기능을 안정적으로 구현하는 데 집중하고, 필요시 추후에 확장하는 방향으로 합의했습니다.
    최종 스키마 생성: 위의 결정 사항을 반영하여, 모든 팀원이 동의한 최종 schema.prisma 파일을 생성할 예정입니다.
    이제 모든 백엔드 개발은 이 스키마를 기준으로 진행되며, 수정이 필요시 책임자에게 문의합니다.

기술 스택(Tech Stack) 선정 및 확정

프로젝트의 개발과 효율적인 유지보수를 위해 트렌드를 반영한 기술 스택을 최종 확정했습니다. 이는 개발 속도와 애플리케이션의 성능에 대하여 중요한 기반이 될 것 입니다.

  • 코어 프레임워크 & 언어 : Next.js TypeScript를 채택하여, 서버사이드 렌더링의 이점과 타입 안정성을 모두 확보했습니다.
  • 개발 환경 및 툴체인 : Bun을 공식 런타임 및 패키지 매니저로 사용하여, 빠른 개발 환경을 구축하기로 했습니다.
  • UI 및 스타일링 : Tailwind CSS를 통한 빠른 UI 개발과 Ant Design의 컴포넌트 라이브러리를 병행하여 사용하기로 결정했습니다.
  • 상태 관리 : 클라이언트 상태는 Zustand로 서버 상태(API 데이터)는 TanStack Query(React Query)로 관리하여 복잡성을 낮추고 성능 최적화를 목표로 삼았습니다.
  • 백엔드 및 데이터베이스 : Next.js API Routes Prisma ORM, 그리고 PostgreSQL을 사용하여 타입 세이프하고 안정적인 백엔드 시스템을 구축을 목표로 했습니다.
  • 인증 및 배포 : NextAuth.js로 간편하게 인증 기능을 구현하고, Vercel을 통해 원클릭 배포 및 CI/CD 환경을 구성 예정입니다.

3개발 환경 및 협업 규칙(Convention) 수립

효율적인 병렬 개발과 코드 품질 유지를 위해, 프로젝트의 기술적/협업적 기반을 논의중입니다.

  • 공통 UI 컴포넌트 논의
    디자인 기획을 바탕으로 앱 전체에서 반복적으로 사용될 버튼, 입력창, 헤더 등 공통 UI 컴포넌트를 개발 우선순위를 논의 예정입니다.

  • 팀 컨벤션 확정
    Git 브랜치 전략: issue#번호 형식으로 브랜치를 생성하고, 작업 전 반드시 이슈를 등록하는 규칙을 수립했습니다. 명확한 이슈 관리를 위해 템플릿 사용을 의무화 했습니다.
    커밋 메시지: 통일된 형식의 커밋 메시지 템플릿을 사용하기로 했습니다.
    머지 전략: 스쿼시 머지(Squash and Merge) 방식을 사용하기로 했습니다. 팀원은 주말을 이용해 스쿼시 머지의 장단점과 사용법에 대해 각자 학습하기로 했습니다.

정리

 데이터베이스 설계부터 협업 컨벤션까지 프로젝트의 기반을 다졌습니다.

준비는 끝나가며, 각자 분배받은 역할에 따라 확정된 컨벤션과 스키마를 바탕으로 기능 개발에 가까워졌습니다.

728x90

프로젝트 기획 구체화 및 문서화

오전에 진행된 회의 내용을 바탕으로, 다시 설계한 기획안을 문서로 정리하는 작업을 했습니다.
초기 아이디어부터 시작해, 서비스의 핵심이 될 기능들을 명확히 정의했습니다.

  • 페이지별 기능 명세서 초안 작성
    로그인, 챌린지 등록, 메인 대시보드, 마이페이지 등 각 페이지의 핵심 목표와 주요 기능을 정의했습니다.
    유즈케이스를 정의하고 개발 범위를 설정하는 기준점이 되었습니다.

  • 유즈케이스 정의
    사용자 관점에서 "무엇을 할 수 있는가"를 기준으로 시스템을 기능 단위로 분해했습니다.
    (예: 회원 관리 시스템, 챌린지 관리 시스템 등)
    각 기능이 어떤 페이지와 연관이 되어 있는지 연결하여 전체적인 서비스 흐름을 시각화했습니다.

데이터베이스 구조 설계 (ERD)

기획된 기능을 구현하는 데 필요한 데이터 구조를 설계했습니다. 초기 ERD를 그리고 논리적으로 맞지 않는 부분을 찾아 수정하는 과정을 진행하고 있습니다.

  • 초기 ERD 설계 및 문제점 분석
    초기 모델의 참조 관계 오류(achievements, reviews 테이블)를 발견, 사용자의 행동을 기록하는 것이 핵심임을 팀원에게 전달.

  • routines_completions 테이블 도입
    • '언제, 어떤 루틴을 수행했는가'를 기록하는 핵심 테이블을 추가하여 회고/인증샷/업적 등 모든 파생 기능의 데이터를 위한 테이블을 생성 했습니다.

기술 스택 선정 

프로젝트의 빠른 개발과 효율적인 유지보수를 위해, 트렌드를 반영한 기술 스택을 팀원에게 제안했습니다.

  • 프론트엔드: Next.js, TypeScript, Tailwind CSS, Zustand
  • 런타임/툴체인: Bun (고속 개발 환경 구축)
  • 백엔드 & DB: Next.js API Routes, PostgreSQL, Prisma (타입 세이프 ORM)
  • 인증/배포: NextAuth.js, Vercel

5인 병렬 개발을 위한 역할 분담 및 일정 수립

8월 25일 배포라는 타이트한 목표를 달성하기 위해, 5인의 팀원이 효율적으로 협업할 수 있는 구체적인 실행 계획 제안했습니다.

  • 기능별 풀스택 개발 전략 제안
    이전 프로젝트의 문제점(백엔드 수정으로 인한 지연)을 해결하기 위해, 각 팀원이 특정 기능의 프론트/백엔드를 모두 책임지는 방식을 제안했습니다.

  • 역할 및 책임(R&R) 분배
    인증, 챌린지 관리, 메인 대시보드, 소셜, 피드백/업적 등 5개의 기능으로 나누어 각 팀원에게 역할을 제안했습니다.

  • API/백엔드 중복 개발 방지 전략 수립
    '데이터 오너십' 규칙을 제안했습니다. 테이블별 주 담당자를 지정하고, 필요한 데이터는 해당 담당자에게 공식적으로 API를 요청하는 것을 지정했습니다. 이는 병렬 개발 시 발생할 수 있는 충돌을 예방하는 안전장치 입니다.
  • 개발 일정
    8월 24일 QA 시작, 25일 배포를 목표로 한 주차별 상세 계획을 수립했습니다.

정리

오늘은 기획을 구체적인 설계도(ERD, 기능 명세서)와 개발 일정, 역할 분담으로 만든 의미 있는 하루였습니다.
모든 팀원이 같은 생각으로 각자의 기능을 구현할 수 있습니다.

 

내일은 공통 데이터베이스, 공통 컴포넌트, 컨벤션에 대한 논의를 이어갈 예정입니다

728x90

프로젝트에 대하여 계속 이야기를 나누며 프로젝트의  방향을 상세화했습니다. 내용은 다음과 같습니다.

프로젝트 목표

본 프로젝트는 사용자가 '챌린지' 기반으로 목표를 설정하고, 매일의 '루틴'을 수행하며 성장하는 과정을 기록하는 서비스입니다. 소셜 기능(팔로우, 프로필 공유)과 AI 기반 피드백을 통해 사용자에게 동기를 부여하고, 꾸준한 습관 형성을 돕는 것을 목표로 합니다.

추가적으로, 짧은 개발시간의 상황임을 고려해JoyRide 라이브러리를 활용한 사용자 온보딩 가이드, Antd를 활용한 효율적인 UI 구축을 고려하였습니다.

핵심 페이지별 기능 명세

사용자의 흐름에 따라 각 페이지에서 제공되는 핵심 기능과 연결된 유즈케이스는 다음과 같습니다.

① 회원가입 / 로그인 페이지

  • 목표 : 사용자가 서비스에 쉽고 빠르게 진입할 수 있도록 한다.
  • 주요 기능
    • 카카오, 구글 계정을 이용한 간편 회원가입 및 로그인
    • 로컬 이메일/비밀번호를 이용한 회원가입 및 로그인
  • 유즈케이스 : SignUpUsecase, LogInUsecase

② 챌린지 등록 페이지

  • 목표 : 사용자가 자신만의 도전 과제를 직관적으로 생성하도록 돕는다.
  • 주요 기능
    • 테마 설정 : '건강', '자기개발' 등 카테고리 선택
    • 루틴 설정 : 챌린지에 포함될 세부 루틴을 직접 입력
    • 커스터마이징 : 챌린지를 대표할 이모티콘(스티커) 및 캘린더 표시 색상 선택
  • 유즈케이스: AddChallengeUsecase

③ 메인 페이지 (나의 챌린지 대시보드)

  • 목표 : 오늘 해야 할 일을 명확히 인지하고 즉각적으로 수행 및 기록하게 한다.
  • 주요 기능
    • 사용자 캘린더 : 루틴 수행 여부에 따라 일별 진척도가 색상으로 표시
    • 테마별 루틴 목록 : 등록된 챌린지들이 테마별로 정리되어 표시
    • 핵심 인터랙션
      루틴 체크 : 오늘의 할 일을 완료했음을 표시
      회고 제출:  간단한 소감을 기록하고 루틴 수행 후 인증샷을 게시
  • 관련 유즈케이스: GetChallengeListUsecase, AddFullfillmentImageUsecase, AddRoutineReviewUsecase

④  - 1 마이 페이지 (나의 기록 보관소)

  • 목표 : 자신의 활동 기록을 돌아보며 성취감을 느끼고, 추가적인 동기를 얻는다.
  • 주요 기능
    • 종합 프로필 : 내 정보, 팔로워/팔로잉 현황, 획득한 업적(스티커) 표시
    • 상세 활동 내역
      루틴 : 진행중인 챌린지에 대한 달성 현황 소
  • 관련 유스케이스: GetProfileUsecase, UpdateProfileUsecase, GetUsersArchivmentListUsecase, GetGPTReviewAnalysisUsecase, GetGPTReviewFullfilmentUsecase

④  - 2 타인 페이지

  • 목표 : 다른 사용자와 교류하며 선의의 경쟁 및 소셜 동기부여를 유도한다.
  • 주요 기능
    • 프로필 정보 조회 : 상대방의 프로필, 팔로워 수, 스티커 등 확인
    • 챌린지 진척도 보기 : 상대방이 진행 중인 챌린지와 달성 현황 확인
    • 팔로우 : 관심 있는 사용자를 팔로우하여 교류
  • 유즈케이스 : GetProfileUsecase (타인), GetFollowUsecase, DeleteFollowUsecase

⑤ 유저 검색 페이지

  • 목표 : 함께 챌린지를 진행할 친구나 다른 사용자를 쉽게 찾을 수 있도록 한다.
  • 주요 기능
    • 닉네임을 기반으로 사용자 검색
  • 유즈케이스 : GetSearchUserUsecase

 ⑥ 피드백 페이지 

  • 목표: 함께 챌린지를 진행할 친구나 다른 사용자를 쉽게 찾을 수 있도록 한다.
  • 주요 기능
  • 피드백 : AI가 분석해 준 감성/동기부여 피드백 확인
  • 챌린지 분석 : 진행 중인 챌린지에 대한 분석
  • 유즈케이스 : GetSearchUserUsecase, GetGPTReviewAnalysisUsecase, GetGPTReviewFullfilmentUsecase

시스템별 유스케이스 정리

회의를 통해 정의된 모든 유스케이스는 다음과 같이 각 시스템별로 명확하게 분류되어 개발될 예정입니다.

  • 회원 관리 : SignUp, LogIn, GetProfile, UpdateProfile, DeleteUser
  • 챌린지/루틴 관리 : Add/Delete/Update/Get (Challenge & Routine)
  • 소셜 시스템 : Follow/Unfollow, SearchUser, GetUserAchievement
  • 리뷰/피드백 시스템 : AddReview, AddImage, GetGPTFeedback

정리

이 글은 프로젝트의 전체적인 청사진 역할을 하며, 각 페이지의 기능과 그에 해당하는 유즈케이스가 연결되어 있어 디자인, 프론트엔드 개발, 백엔드 개발을 동일한 목표 설정에 맞추어 효율적으로 개발할 수 있는 자료가 됩니다.

 

'습관 챌린지 앱'은 아이디어 회의를 거쳐, 시스템별 유스케이스 정의, 그리고 최종 페이지별 기능 명세서까지 완성되었습니다.

이후 ERD 작성, 데이터 테이블 설계의 과정을 진행할 예정입니다.

728x90

'어떻게 하면 좋은 습관을 꾸준히 이어갈 수 있을까?'라는 아이디어로 '해빗(Habit)' 프로젝트를 진행하게 되었습니다.

'해빗' 서비스 소개

'해빗'은 과학적인 습관 형성 원리에 기반하여 사용자의 꾸준한 성장을 돕는 서비스입니다. 저희는 **'21일'**과 **'66일'**이라는 습관 형성의 중요한 이정표를 중심으로, 사용자가 지치지 않고 목표를 달성하는 경험을 제공하고자 합니다.

핵심 기능

  • 체계적인 챌린지 : 모든 습관은 21일 챌린지로 시작하며, 성공 시 66일 챌린지로 이어져 습관의 완전한 내재화를 돕습니다.
  • 성장 기록 : 전용 캘린더와 마이페이지를 통해 자신의 습관 여정과 성과를 한눈에 확인할 수 있습니다.
  • AI 코치의 피드백 : 달성률에 따라 AI가 격려와 피드백을 전달하여 꾸준한 동기를 부여합니다.
  • 소셜 기능 : 팔로우, 팔로워 기능으로 다른 사용자들과 함께 응원하며 성장할 수 있습니다.

각 기능에 대한 세부 명세를 정의하고 백엔드 설계를 마쳤습니다. 탄탄한 설계로 안정적이고 사용할 수 있는 서비스를 만들어가겠습니다.

728x90