김데이의 개발공부

[ TIL ] Day 60, 61 - SQL 과 Prisma ORM / PostgreSQL 데이터 타입 본문

코드잇 Node.js(BE) 부트 캠프/TIL (Today I Learn) 📑

[ TIL ] Day 60, 61 - SQL 과 Prisma ORM / PostgreSQL 데이터 타입

theday365 2025. 12. 19. 18:42
반응형

🗓️ 수업 일자 : 2025.12.19

✨ 오늘의 수업 평가 :  [ PROJECT ] 실습 러버 👩‍💻🛠️ 실습 꿀잼 🍯😝

 

어제 병원에 다녀오느라 하루 빼먹어서 오늘 아주 초집중 해서 실습 작업!!! 

사실 수요일(17일)에 SQL Schema 짜는데 Prisma와 구조가 비슷한듯 다른 부분이 많아 좀 멘붕 온 상태로 덮어두었는데,

오늘 다시 보니 조금씩 실마리가 보여서 다행이었다 휴~ 🤓

 

ERD 작업도 처음 하는건데 생각보다 쉽게 풀려서 조금 여유가 생기는 하루다!

내일은 주말이지만 시간 내서 실습 문제 풀어서 제출하면 이번 미션도 잘 끝낼거 같다😉

 

👩‍💻 [개인 / 팀 프로젝트] 오늘 작업 내용 💻

- 개인 프로젝트 작업 : SQL schema 마무리 , ERD 작업(with mermaid)

- 팀 프로젝트 작업 : 미션 내용 보고 주제 선정 

 

 

📝  오늘 배운 내용  

- SQL과 Prisma ORM

- PostgreSQL 데이터 타입

- Mermaid 문법 정리

 


1. SQL과 Prisma ORM

SQL Schema와 Prisma Schema 주요 기능 비교

  SQL Schema Prisma Schema
목적 DB의 정식 구조 정의
  데이터 무결성, 데이터 저장
DB 구조 정의 및 개발자 사용 코드 연결
개발 편의성, 타입의 안정성
관계 정의 - 양방향 관계 정의 안함
- 다대다 작업 시 중간 테이블 명시 필요
- 관계로 인한 배열 권장 안함
- 양방향 관계 정의 필요
- 다대다 작업을 암시적 선언 가능
- 관계 표현용 배열 관계 사용 (ORM 접근용)
PK 단일 / 복합 PK 설정 및 사용이 간단 복합 PK 사용 가능하지만, 주로 단일 PK 위주로 사용

 

 

개발 작업 시 실제 SQL 쿼리문 사용 특징

  • Prisma ORM으로 표현 안 되는 요청에 대해 실제 SQL 쿼리를 적용
  • 주로 .ts 파일에 문자열(SQL)로 선언 후 "export / import" 로 불러와 사용
  • 성능 최적화가 중요한 구간에서 사용

 

1) 쿼리 자체를 구문에서 바로 실행하는 방식

product.service.ts

await prisma.$queryRaw`
  SELECT * FROM products WHERE price > ${price}
`;

 


2) 문자열로 선언하여 불러오는 방식

product.query.ts

export const FIND_PRODUCTS_COMPLEX = `
  SELECT * FROM products WHERE price > ${price}
`;


======================

product.service.ts

import { FIND_PRODUCTS_COMPLEX } from '../product.query';

const result = await prisma.$queryRawUnsafe(FIND_PRODUCTS_COMPLEX);

 

 

 

3) 각 파일별로 내용을 완전 분리하는 방식

src/sql/getProducts.sql  // 확장자가 .spl
  
SELECT * FROM products WHERE price > ${price};
  
  
=================================================
  
product.service.ts
  
import fs from 'fs';
// fs는 Node.js에 기본으로 들어있는 파일 시스템(File System) 모듈
// 파일을 읽고 / 쓰고 / 삭제하는 역할

const query = fs.readFileSync(
  'src/sql/getProducts.sql',
  'utf-8'
);

await prisma.$queryRawUnsafe(query);

 

 

 

2. PostgreSQL 데이터 타입 

공식 문서 : https://www.postgresql.org/docs/current/datatype.html

 

Chapter 8. Data Types

Chapter 8. Data Types Table of Contents 8.1. Numeric Types 8.1.1. Integer Types 8.1.2. Arbitrary Precision Numbers 8.1.3. Floating-Point Types 8.1.4. Serial …

www.postgresql.org

 

🔢 숫자형

데이터 타입 설명
INTEGER 일반적인 정수 타입
BIGINT 아주 큰 정수용 타입
REAL 일반적인 소수(부동소수점) 타입
SERIAL 자동으로 증가하는 정수형 문법

 

 

🔠 문자형

데이터 타입 설명
TEXT 일반적인 가변형 문자 타입
CHARACTER(n)
CHAR(n)
길이가 정해진 고정형 문자 타입
CHARACTER VARYING(n)
VARCHAR(n)
가변형 문자 타입, 최대 길이만 설정

 

 

🗓️ 날짜 / 시간형

데이터 타입 설명
TIMESTAMP 날짜 및 시간 (지역 시간대 미표기)
TIMESTAMPZ 날짜 및 시간 (지역 시간대 표기)
DATE 년,월,일 표기
TIME 하루 중 시간 (시간대 미표기)
TIMEZ 하루 중 시간 (지역 시간대 표기)

 

 

⭕❌ 논리형

데이터 타입 설명
BOOLEAN
BOOL
논리형 참 / 거짓

 

 

🌐 기타 형식

데이터 타입 설명
MONEY 통화 금액 
JSON 텍스트 JSON 데이터
JSONB 바이너리 JSON 데이터, 분해된 JSON
UUID 범용 고유 식별자

 

+추가 JSON vs JSONB 

  JSON  JSONB 
특징 - 작성한 그대로 문자열 저장
- 공백 , 순서 모두 유지
- 조회가 느리고 인덱스 사용 불가
- 파싱해서 구조로 저장
- 순서, 공백 모두 제거
- 조회가 빠르고 인덱스 사용 가능
- 실무 표준 ✅
코드 예시 INSERT INTO test (data) VALUES ('{ "a": 1, "b": 2 }');
저장 결과 { "a": 1, "b": 2 } {"b":2,"a":1}

 

 

3. Mermaid 문법 정리

Mermaid란?

  • 마크다운 스타일의 텍스트 정의를 렌더링 하여 다이어그램으로 생성
  • 자바스크립트 기반의 다이어그램 및 차트 도구
  • 공식 홈페이지 : https://mermaid.js.org/

 

Mermaid 표 작업

erDiagram
  %% 기본 구조
  테이블명 {
      타입 컬럼명 속성
    }

  %% 샘플 구조
  User {
        Int id PK
        String email UK
        String nickname
        String password
    }
    
    Product {
        Int id PK
        String name
        String description
        Int price
        String image
        Int userId FK
    }
    
    Article {
        Int id PK
        String title
        String content
        String image
        Int userId FK
    }
    
%% 관계 정의는 아래에서 자세히 :)
User ||--o{ Product : "sells"
User ||--o{ Article : "writes"

Mermaid 테이블 정의 샘플 코드 결과값
Mermaid 테이블 정의 샘플 코드 결과값

 

 

 

Mermaid 관계 정의 

erDiagram
  %% 기본 구조 
  "테이블 명 A" 관계 "테이블명 B" : "둘 사이의 관계 명칭(주로 동사)"

  %% 1:1 관계
  CUSTOMER ||--|| DELIVERY_ADDRESS : has

  %% 1:N 관계(0 허용)
  CUSTOMER ||--o{ ORDER : places 
  
  %% 1:N 관계(1개 이상)
  ORDER ||--|{ ORDER_ITEM : includes

  %% N:M 관계 (중간 테이블 : TAG_LIST)
  PRODUCT ||--|{ TAG_LIST : maps
  TAG ||--|{ TAG_LIST : maps

Mermaid 관계 정의 샘플 코드 결과값
Mermaid 관계 정의 샘플 코드 결과값

 

 

 


 

📃 내일은 뭘 배울까 🤔

- 팀 프로젝트 작업 시작! 

반응형