김데이의 개발공부

[ WIL ] Day 65~74 - 중급 프로젝트 : Prisma ORM 정리 본문

코드잇 Node.js(BE) 부트 캠프/WIL (Weekly I Learn) 📚

[ WIL ] Day 65~74 - 중급 프로젝트 : Prisma ORM 정리

theday365 2026. 1. 10. 16:36
반응형

🚀 2주 작업 핵심 📚

1. Prisma ORM 조합으로 다양한 작업 진행

기존 : 간단한 CRUD 작업으로 현재 모델에서 대부분의 작업이 해결되는 경우가 많음
중급프로젝트 : 여러 테이블을 이동하며 작업을 진행해야 하므로, 다양한 조합의 Prisma ORM을 사용 

=> 아래 여러 조합의 ORM 설명

 

2. Git 협업

  • main , dev , feature/... 3종류의 브랜치를 사용하는 GithubFlow 방식 적용 
    • 작은 규모의 프로젝트에서 작업을 효율적으로 관리하기 용이
    • main : 최종 배포가 진행되는 브랜치
      dev : 작업들이 모두 합쳐지는 개발용 브랜치
      feature/... : 실제 각 파트별로 진행되는 작업용 브랜치
  • Git rebase 방법
    1. 기존 작업 저장 : git add .git commit -m "message"
    2. 원격 레포에 저장 된 코드를 내 로컬로 가져오기 : git fetch upstream
    3. 내 로컬 작업에 신규 코드 붙여 넣기 : git rebase upstream/dev
      (작업 중인 경우, 임시 브랜치 명이 나옴, git branch로 리베이스 중임을 확인 가능) 
    4. 리베이스 중 충돌 된 작업이 있는 경우, 파일에서 정리
    5. 리베이스 한 파일 최종 저장 : git add . & git rebase --continue
      (작업 저장을 위해 CLI text edit가 나오면 "Ctrl O / enter / Ctrl X"로 저장 작업 마무리)
    6. 모두 마친 다음 git branch로 현재 브랜치 확인하여 리베이스 종료 확인
    7. 추가 작업 후 add & commit & push (기존 작업 루틴대로 진행)

 

3. Oauth vs Passport Oauth

- Oauth : 전체 모든 과정에 대해 직접 작성하여 인증/인가 구조를 구현,

               세부적인 부분까지 직접 셋팅을 진행하기에 전체 워크플로우를 이해하고, 커스텀 하기 좋음

- Passport Oauth : 이미 만들어진 구조에 자사 서비스의 정보만 입력하면 대부분의 작업을 처리 해 주므로 쉽게 구현 가능 

                               수많은 소셜/서비스에 대해 제공 해서 확장성이 편리 

 



🤔 어려웠던 개념, 다시 공부하기 📑

Prisma ORM 명령어 & 옵션

1) Create(생성) : data가 필수 옵션, 등록 할 데이터를 표기

단일 생성 (기본형) 여러 개 생성 관계 포함 생성
const nickname = req.body.nickname;
prisma.user.create({

  data: {
    email: 'test@test.com',
    name: 'JS',
    nickname
    // 등록 시 입력해야 하는 데이터 값 표기
  },

});
prisma.user.createMany({

  data: [
    { email: 'a@test.com', name:"lee" },
    { email: 'b@test.com', name:"kim"},
    // 추가로 생성 할 정보를 객체로 만들어
    // 배열로 생성하여 data로 전달
  ],

});
prisma.post.create({

  data: {
    title: 'hello',
    user: {
      connect: { id: 1 },
       // user정보를 함께 생성하고, 
       // 해당 로우의 id를 연결
    },
  },

});

 

 

2) Read(조회) : where 옵션이 거의 기본으로 사용되고, select / include / orderBy 등 여러 조합을 사용하면 무긍무진한 조회 방식을 만들 수 있음

- 일반 조회

단일 조회 여러 개 조회 관계형 조회
prisma.user.findUnique({
  where: { id: 1 },
  // 이때 where에 들어갈 값은
  // pk 혹은 unique 값만 가능
});
prisma.user.findMany({
  where: {
    role: 'ADMIN',
    // enum으로 입력한 경우 특정 값 설정
    // 또는 수치 값은 이상,이하 등 적용
  },
}); 
prisma.user.findUnique({
  where: { id: 1 },
  include: {
    poststrue,
  },
  // include를 통해 함께 불러 올 테이블선언
});

 

- 조건 조회

필드 제한한 조회 검색 데이터 필터링에 대한 조건 정렬 조건을 추가한 조회
prisma.user.findUnique({
  where: { id: 1 },
  select: {
    id: true,
    email: true,
    // id, email 필드만 결과로 전송
  },
});
prisma.user.findUnique({
  where: {
    id: 1,
    email: { contains: '@gmail.com' },
    // id, email 같은 유니크 값으로 필터링

    age: { gte: 20, lt: 30 },
    // 수치에 대한 값 필터링 적용 
    // lt - 미만 , lte - 이하 
    // gt - 초과, gte - 이상

    OR: [
      { role: 'ADMIN' },
      { role: 'MANAGER' },
    ],
    // 여러 조건을 조합한 결과 필터링 
    // AND, OR, NOT 3가지 사용 가능
  }

});
prisma.post.findMany({
  orderBy: { 
     createdAt: 'desc'
      // 정렬 오름차순, 내림차순 지정 
      // 정렬 할 필드와 차순을 적음
  },

  skip: 0,
  take: 10,
  // 생략할 데이터 수 & 가져 올 데이터 수
  // 주로 페이징 리스트 표기법에 사용
});

 

 

3) Update(수정) : 특정 값을 찾아 신규 값을 입력해야 하므로 기본으로 where 옵션, data 옵션이 사용

단일 수정 여러개 수정 관계 수정 유무 확인 후 수정 / 생성
prisma.user.update({
  where: { id: 1 },
  data: {
    name: 'new name',
  },
});
prisma.user.updateMany({
  where: { role: 'USER' },
  data: { active: false },
});
prisma.post.update({
  where: { id: 1 },
  data: {
    tags: {
      connect: { id: 3 },
    },
  },
});
prisma.tag.upsert({
  where: { 
    email: 'react@test.com'
    // 해당 값을 찾음
  }, 
  update: { 
    name: 'feReact'
    // 값이 있으면 업데이트 실행
  },          
  create: {                             
    email: 'react@test.com',
    name: 'feReact',
    // 값이 없으면 신규 값 생성
  },
});

 

 

4) Delete(삭제) : 어떤 데이터를 삭제하는 지에 대해 기준을 where 옵션에 적용,

                           해당 데이터가 삭제되며 관계된 데이터를 삭제 하고 싶은 경우 스키마 모델링 시 " onDelete: Cascade" 설정

단일 삭제 여러개 삭제
prisma.user.delete({
  where: { id: 1 },
});
prisma.user.deleteMany({
  where: { active: false },
});

 

 

5) 옵션에서 사용 가능한 여러 조건

  • in / notIn : 해당 값을 포함 할지, 안할지 설정 
  • mode: 'insensitive'  : 대소문자를 무시하고 텍스트 필터링 할 때 사용하는 조건
  • startsWith / endsWith / contains : "시작하는 문자, 마지막 문자, 해당 문자 포함" 에 대한 설정 
  • some / none / every : "값이 있다 / 없다 / 전부다" 에 대한 설정으로 보통 존재 여부(true/false)값이 필요할 때 사용
  • _count / _avg / _sum / _min / _max : "갯수 / 평균 / 합계 / 최소값 / 최대값"을 계산할 때 사용
where: {
  // 포함, 미포함 설정
  status: { in: ['TODO', 'IN_PROGRESS'] },
  
  // 문자열 필터링 설정
  title: {
    contains: 'react', // 문자 포함
    mode: 'insensitive', // 대소문자 구분 없이
  },
  
  // 관계형 테이블에 대한 조건 추가
  include: {
    comments: {
      where: { isDeleted: false },
      orderBy: { createdAt: 'desc' },
      take: 5,
    },
  },
  
  _count: {id: true}, // 데이터의 최종 총 갯수 계산
  _avg: { age: true }, // 데이터의 특정 필드 평균값 계산
}


where: {
  comments: {
    some: {}, // 댓글이 1개라도 있는지 확인
  },
}

 

팀 작업
팀 작업

반응형