From 99f6b8ac454567209a36337fea980e06fa1e10b4 Mon Sep 17 00:00:00 2001 From: sojung0628 Date: Fri, 7 Nov 2025 00:29:25 +0900 Subject: [PATCH] week 06 workbook --- week06/keyword/keyword.md | 59 +++++++++++++++++++++++++++++++++++++++ week06/mission/mission.md | 37 ++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 week06/keyword/keyword.md create mode 100644 week06/mission/mission.md diff --git a/week06/keyword/keyword.md b/week06/keyword/keyword.md new file mode 100644 index 0000000..2d3c4c1 --- /dev/null +++ b/week06/keyword/keyword.md @@ -0,0 +1,59 @@ + + +- ORM + + Object-Relational Mapping + + ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•จ. + + ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•จ. + + ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์— ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•จ. + +- Prisma ๋ฌธ์„œ ์‚ดํŽด๋ณด๊ธฐ + - ex. Prisma์˜ Connection Pool ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• + + Prisma ์ž์ฒด๋Š” Connection Pool์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„์˜ connection pool ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. MYSQL์˜ ๊ฒฝ์šฐ์—๋Š” Prisma๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ mysql2 ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. .env ํŒŒ์ผ์˜ DATABASE_URL์— ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Prisma Client๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๋‹จ 1๋ฒˆ๋งŒ ์ƒ์„ฑํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋ฉด Pool ๋ˆ„์ˆ˜์™€ ์—ฐ๊ฒฐ ๊ณผ๋‹ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. + + - ex. Prisma์˜ Migration ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• + + Migration์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ๋ฒ„์ „์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ(ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋“ฑ)์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Prisma์—์„œ ํฌ๊ฒŒ 2๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ด€๋ฆฌํ•œ๋‹ค. + + 1. prisma/schema.prisma ์ˆ˜์ • ์Šคํ‚ค๋งˆ ํŒŒ์ผ์—์„œ ๋ชจ๋ธ(ํ…Œ์ด๋ธ”)์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค. + 2. ๋ช…๋ น์–ด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ ๋ฐ ์ ์šฉย `npm exec prisma migrate dev`ย ์ด ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ SQL migration ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋กœ์ปฌ DB์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ž๋™ ์ ์šฉํ•œ๋‹ค. +- ORM(Prisma)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข‹์€ ์ ๊ณผ ๋‚˜์œ ์  + - ์žฅ์  + + ORM์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊ฐœ๋ฐœ์†๋„ ๋˜ํ•œ ๋นจ๋ผ์ ธ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์— ๋„์›€์ด ๋œ๋‹ค. + + - ๋‹จ์  + + ORM์€ ์ถ”์ƒํ™”๋œ ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋ฉฐ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. + +- ๋‹ค์–‘ํ•œ ORM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ + + **ex. Sequelize** + + Sequelize๋Š” JavaScript/TypeScript์—์„œ ์‚ฌ์šฉํ•˜๋Š” Node.js์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜๋˜๊ณ  ๋„๋ฆฌ ์“ฐ์ด๋Š” ORM ์ค‘ ํ•˜๋‚˜์ด๋‹ค. Sequlize์˜ ํŠน์ง•์œผ๋กœ๋Š” ๋ชจ๋ธ ์ •์˜๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ํ•ด์ฃผ์–ด์•ผํ•˜๊ณ , ์ฟผ๋ฆฌ ์ž‘์„ฑ์€ ์ฒด์ธ ๊ธฐ๋ฐ˜ ORM ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. Prisma์— ๋น„ํ•ด ํƒ€์ž… ์ง€์›์ด ๋ถˆ์•ˆ์ „ํ•˜๊ณ , ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ sequelize-cli๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ์‚ฌ์šฉ ๋‚œ์ด๋„๊ฐ€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ์˜ค๋ž˜๋œ ๋งŒํผ ๋ฌธ์„œ์˜ ์–‘์ด ๋ฐฉ๋Œ€ํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ๋ฐœํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๊ณ ์žˆ๋‹ค. + + **ex. TypeORM** + + TypeORM์€ node.js์—์„œ ์‹คํ–‰๋˜๊ณ  typeScript๋กœ ์ž‘์„ฑ๋œ ๊ฐ์ฒด ๊ด€๋ฆฌํ˜• ๋งคํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Entity ํด๋ž˜์Šค ์ค‘์‹ฌ์ด๊ณ  TypeScript์— ์ตœ์ ํ™”๋˜์–ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Entity, Column)์œผ๋กœ ๋ชจ๋ธ์„ ์ •์˜ํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค. ๋˜ํ•œ NestJS์™€์˜ ํ˜ธํ™˜์ด ๋›ฐ์–ด๋‚˜๋‹ค. ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ‰์˜์„ฑ ๋ฐ ๊ด€๊ณ„ ์„ค์ •์ด Prisma๋ณด๋‹ค ๋ถˆํŽธํ•˜๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ–๊ณ ์žˆ๋‹ค. + +- ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ API ์ฐพ์•„๋ณด๊ธฐ + - ex. https://docs.github.com/en/rest/using-the-rest-api/using-pagination-in-the-rest-api?apiVersion=2022-11-28 + + ์„œ๋น„์Šค์—์„œ ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ณด๋‚ธ๋‹ค๋ฉด ์ž‘์—…์˜ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ ค์ง€๊ณ  ์„œ๋ฒ„์—๋„ ๋ถ€๋‹ด์ด ์ปค์งˆ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ๋ณด๋‚ด๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. + + GitHub์—์„œ๋Š” per_page์™€ page ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฉ์‹์„ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ per_page๋Š” ํ•œ ๋ฒˆ์— ๋ฐ›์„ ํ•ญ๋ชฉ ๊ฐœ์ˆ˜(์ตœ๋Œ€ 100๊ฐœ), page๋Š” ๋ช‡ ๋ฒˆ์งธ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ• ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ex) ?per_page=10&page=1 โ†’ ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€์˜ 10๊ฐœ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. + + Link ํ—ค๋”์— next, prev, last, first ๊ฐ™์€ ๋งํฌ๋“ค์ด ์žˆ์–ด์„œ API ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‘๋‹ต ํ—ค๋”์— ๋‹ค์Œ ์š”์ฒญ ์ฃผ์†Œ๋ฅผ ๊ฐ™์ด ๋ณด๋‚ด์„œ ๋‹ค์Œ ํŽ˜์ด์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค. + + - ex. https://developers.notion.com/reference/intro#pagination + + Notion API์€ Cursor ๊ธฐ๋ฐ˜์˜ Pagination ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. start_cursor๋Š” โ€œ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ• ์ง€โ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํฌ์ธํ„ฐ์ด๊ณ , has_more๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” boolean ๊ฐ’์ด๋‹ค. next_cursor๋Š” ๋‹ค์Œ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” start_cursor ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ์š”์ฒญ์„ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ , start_cursor๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  has_more๊ฐ€ false๊ฐ€ ๋  ๋•Œ ๊นŒ์ง€ next_cursor๋ฅผ start_cursor๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. \ No newline at end of file diff --git a/week06/mission/mission.md b/week06/mission/mission.md new file mode 100644 index 0000000..4411c52 --- /dev/null +++ b/week06/mission/mission.md @@ -0,0 +1,37 @@ +1. ๊ธฐ์กด์— ๊ตฌํ˜„ํ–ˆ๋˜ API์˜ Repository ํ•จ์ˆ˜๋“ค์„ ๋ชจ๋‘ Prisma ORM์„ ์ด์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”. + + ํ–ˆ์–ด์—ผ + +2. ๋‚ด ๋ฆฌ๋ทฐ ์กฐํšŒ + + GET + + ![image.png](attachment:b65db8cf-b0e5-4646-b390-a9f41e4ad7da:image.png) + + cursor๋ฅผ 1๋กœ ์„ค์ •ํ–ˆ์„ ๋•Œ + + ![image.png](attachment:c9156a93-acd1-4ce0-b554-6ea8e0e639c8:image.png) + +3. ํŠน์ • ๊ฐ€๊ฒŒ ๋ฏธ์…˜ ์กฐํšŒํ•˜๊ธฐ + + ![image.png](attachment:b26fe73e-b58e-42b7-a117-fadef2472ecd:image.png) + +4. ๋‚ด๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๋ฏธ์…˜ ๋ชฉ๋ก + + ![image.png](attachment:20754108-9f51-4c19-a388-5ebe9f22385f:image.png) + + ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋Ÿฐ์‹์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์„ ๋•Œ, ๋‚ด๊ฐ€ ์ง„ํ–‰์ค‘์ธ ๋ฏธ์…˜ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด is_progress๊ฐ€ 1์ธ ์• ๋“ค๋งŒ ์กฐํšŒํ•˜๊ฒŒ๋” ํ•จ. + + ![image.png](attachment:1bcd9914-d682-4b0c-a373-07864e784a9e:image.png) + + user-id๋ฅผ 1๋กœ ํ•ด์„œ ํ•ด๋‹น ์œ ์ €์˜ ๋ฏธ์…˜ ์ค‘ ์ง„ํ–‰์ค‘์ธ ๋ฏธ์…˜๋งŒ ์กฐํšŒํ•จ. + +5. ๋‚ด๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๋ฏธ์…˜์„ ์ง„ํ–‰ ์™„๋ฃŒ๋กœ ๋ฐ”๊พธ๊ธฐ + + ๋…ธ์ง„ํ–‰ โ†’ ์ง„ํ–‰ + + ![image.png](attachment:ce7d5820-8e51-4453-a493-7d2f33f09062:image.png) + + ์ง„ํ–‰ โ†’ ์™„๋ฃŒ + + ![image.png](attachment:a5e78745-3fc3-4f30-8240-b465bf21a4d5:image.png) \ No newline at end of file