| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 성공에 대한 거짓말
- 카카오뷰N잡
- 30일 글쓰기
- 이석증
- 카카오뷰 온라인 수익화
- 카카오뷰 성장
- HTML
- 카뷰 수익 인증
- 엑셀 프린트하기
- 원씽
- 카카오뷰 초보
- git 협업하기
- 자기관리
- 카카오뷰 탭이동
- express.js 환경 셋팅
- 실시간 통신
- 성공비법
- 위드굿즈
- 카카오뷰 수익
- Git 팀 작업
- 도서 원씽
- 위드굿즈 굿즈샵
- ppt 도형 색
- 웹기초
- Axios 라이브러리
- 카카오뷰 부업
- 책 원씽
- CSS
- ppt 다이어그램
- 엑셀 기초 함수
- Today
- Total
김데이의 개발공부
[ TIL ] Day 60, 61 - SQL 과 Prisma ORM / PostgreSQL 데이터 타입 본문
[ 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 관계 정의
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

📃 내일은 뭘 배울까 🤔
- 팀 프로젝트 작업 시작!
'코드잇 Node.js(BE) 부트 캠프 > TIL (Today I Learn) 📑' 카테고리의 다른 글
| [ TIL ] DAY 80 - 개인 프로젝트 : 실시간 통신(알림) 구현 (1) | 2026.01.19 |
|---|---|
| [ TIL ] DAY 78, 79 - 웹소켓 실시간 통신 (0) | 2026.01.16 |
| [ TIL ] Day 59 - NodeJS 아키텍쳐 / SQL 실행 순서 정리 (1) | 2025.12.17 |
| [ TIL ] Day 58 - SQL 데이터 관리 / 데이터 모델링 (0) | 2025.12.16 |
| [ TIL ] Day 57 - SQL 데이터 관리 (테이블 생성/삭제, CRUD 작업 등) (0) | 2025.12.15 |