Skip to content

๐Ÿ“บwedev - ๊ธฐ์ˆ  ์†Œ๊ฐœ, ๊ฐœ๋ฐœ์ž ์ปค๋ฆฌ์–ด ์กฐ์–ธ, ๊ฐœ๋ฐœ ์ปจํผ๋Ÿฐ์Šค ์˜์ƒ ๊ณต์œ  ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์›น ์„œ๋น„์Šค!

Notifications You must be signed in to change notification settings

connect-foundation/2019-10

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DEV

wedev.tv ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป

๊ฐœ๋ฐœ์ž์˜, ๊ฐœ๋ฐœ์ž๋“ค์— ์˜ํ•œ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋™์˜์ƒ ์ŠคํŠธ๋ฆฌ๋ฐ.

๐Ÿค” wedev.tv๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

wedev.tv(๋˜๋Š” wedev, ์œ„๋ฐ๋ธŒ)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋“ค์ด ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ๋™์˜์ƒ์„ ๊ณต์œ ํ•˜๊ณ , ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๋ฉฐ, ์ปค๋ฆฌ์–ด ํ”„๋กœํ•„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์ปจํผ๋Ÿฐ์Šค ๋ฐœํ‘œ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜, ๊ธฐ์ˆ  ์„ค๋ช…๊ณผ ๊ฐ™์€ ๋™์˜์ƒ์„ ํ•œ ๋ฐ ๋ชจ์•„๋ณด๊ณ , ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๊ฑด์„ค์ ์ธ ํ† ๋ก ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์˜๋„๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๋ชฉ์ฐจ

๐Ÿ’ป ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

Client

cd packages/client
npm install
npm run dev

Server

cd packages/server
npm install
npm run start:dev

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค migration

cd packages/typeorm
npm run typeorm migration:run 

๐Ÿ“š๊ธฐ์ˆ  ์Šคํƒ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Client

  • Next.js
  • TypeScript
  • react-fetching-library
  • Material-UI

Server

  • NestJS
  • TypeScript
  • TypeORM

Database

  • MySQL
  • Redis

Cloud Services

  • AWS Lambda
  • AWS Cloudfront
  • AWS Elastic Transcoder
  • AWS S3
  • AWS RDS
  • AWS ElastiCache

โ™† Git ์ปค๋ฐ‹ ๋ฐ ๋ธŒ๋žœ์น˜ ์ „๋žต

Git์„ ํ™œ์šฉํ•˜์—ฌ ํ˜‘์—…ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ commit ๋ฐ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Commit ์ „๋žต

Commit ์ œ๋ชฉ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[server ? client] | <type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<Fixes>(optional) <link>
<BLANK LINE>
  • server ์™€ client ๋‘˜ ๋‹ค ํฌํ•จ ๋  ๊ฒฝ์šฐ [server & client] ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • subject์™€ body๋ฅผ ํ•œ๊ธ€๋กœ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ์™ธ์—” ์˜์–ด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • type: ์–ด๋–ค ์˜๋„๋กœ ์ปค๋ฐ‹ํ–ˆ๋Š”์ง€๋ฅผ type์— ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
  • scope: ์ปค๋ฐ‹์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
  • subject: ์ตœ๋Œ€ 50๊ธ€์ž๊ฐ€ ๋„˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ ย ๋งˆ์นจํ‘œ๋Š” ์ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • body: ์ตœ๋Œ€ํ•œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.ย How ์™€ Why ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ~ํ•ฉ๋‹ˆ๋‹ค ๋ผ๋Š” ๋ฌธ์ฒด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • issue: ์ด์Šˆ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ด์Šˆ์˜ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ: ํ•ด๋‹น ์ปค๋ฐ‹์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ๊ณ ํ•œ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

Branch ์ „๋žต

Branch ์ด๋ฆ„์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[์œ ํ˜•]/[๋‚ด์šฉ]_[๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋‚ ์งœ]

์œ„ ํ˜•์‹์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

feature/search_api_20191219
refactor/search_api_20191220

๐Ÿ“ฑ Mobile First Approach

Wedev๋Š” UI ๋””์ž์ธ ๋‹จ๊ณ„๋ถ€ํ„ฐ Mobile First Approach ์ „๋žต์œผ๋กœ ์„ค๊ณ„๋˜๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Mobile First Approach๋ž€?

Mobile First Approach๋ž€, ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์ค‘์‹ฌ์— ๋‘๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๊ณ ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ํŠธ๋ž˜ํ”ฝ์—์„œ ๋ชจ๋ฐ”์ผ ์›น ํŠธ๋ž˜ํ”ฝ์ด ๋ฐ์Šคํฌํ†ฑ์˜ ๊ฒƒ์„ ์ถ”์›”ํ•œ์ง€ ์˜ค๋ž˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ˆ˜ ์ด์šฉ์ž์ธ ๋ชจ๋ฐ”์ผ ์›น์„ ์ค‘์‹ฌ์— ๋‘๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒƒ์ด ๋‹น์—ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํš ๋ฐ ๋””์ž์ธ ๊ณผ์ •์—์„œ ๋ชจ๋ฐ”์ผ ์›น ์‚ฌ์šฉ์ž์˜ UI/UX๋ฅผ ๋จผ์ € ๊ณ ๋ คํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์œผ๋กœ ๋ฐ์Šคํฌํ†ฑ ์ด์šฉ์ž์˜ UI/UX๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Mobile First ๋””์ž์ธ

Mobile First ๋””์ž์ธ์€ ์ œ์•ฝ๋œ ์ž‘์€ ํ™”๋ฉด์—์„œ ์ œํ’ˆ ๋””์ž์ธ์„ ์‹œ์ž‘ํ•ด์„œ ํƒœ๋ธ”๋ฆฟ๊ณผ ๋ฐ์Šคํฌํ†ฑ์œผ๋กœ ๋””์ž์ธ์„ ํ™•์žฅํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค. Wedev๋Š” ๋””์ž์ธ ๊ณผ์ •์—์„œ ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์—์„œ์˜ UI/UX๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ ํ›„์— ๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด์—์„œ์˜ UI/UX๋ฅผ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค.

Mobile First ์Šคํƒ€์ผ๋ง

Mobile First Approach ์ „๋žต์— ๋”ฐ๋ผ ์Šคํƒ€์ผ ๊ทœ์น™ ๋˜ํ•œ Mobile First๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

export const Container = styled.div`
  padding-top: 6.4rem;
  background-color: #383d3f;

  @media only screen and (min-width: ${BREAKPOINT}px) {
    width: 22rem;
    height: 100%;
  }
`;

์œ„์™€ ๊ฐ™์ด, ๊ธฐ๋ณธ ์Šคํƒ€์ผ์€ ๋ชจ๋ฐ”์ผ์—์„œ ์‚ฌ์šฉํ•  ์Šคํƒ€์ผ์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  media query๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ทธ ๋‚ด๋ถ€์—๋Š” ๋ฐ์Šคํฌํ†ฑ์— ์ถ”๊ฐ€๋  ์†์„ฑ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์ด ๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์œ„์™€ ๊ฐ™์ด Mobile First ์Šคํƒ€์ผ ๋Œ€์‹ ์— Desktop First ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ ์†์„ฑ์„ ์ทจ์†Œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋Ÿ‰์ด ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Mobile First ์Šคํƒ€์ผ ์ „๋žต์„ ํ†ตํ•ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽจ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง

Wedev๋Š” ์‹ค์ œ๋กœ ์šด์˜ํ•  ์„œ๋น„์Šค๋ฅผ ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)๋ฅผ ์ž˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์šฉํ•˜๋„๋ก ์šด์˜๋˜์–ด์•ผ ํ•˜๊ณ , ๊ทธ ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜๋Š” ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์•ฑ์„ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ SPA(single page application)๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด SEO์—์„œ ๋ถˆ๋ฆฌํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, SEO๋ฅผ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋น„์ถ”์–ด ๋ณผ๋•Œ, SPA์˜ ๊ฒฝ์šฐ์—๋Š” ์ดˆ๊ธฐ ์ ‘๊ทผ์‹œ์— ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•  JS ํŒŒ์ผ์„ ์ „๋ถ€ ๋‹ค์šด ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๊ธด ์‹œ๊ฐ„๋™์•ˆ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ดˆ๊ธฐ ์ ‘๊ทผ์‹œ์— UI๊ฐ€ ๋ Œ๋”๋ง html์„ ๋ฐ”๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ์—์…‹์„ ๋กœ๋”ฉํ•˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉ์ž๋Š” ๋น ๋ฅด๊ฒŒ UI ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์œผ๋กœ ๋‹ค๊ฐ€์˜ต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ wedev์—์„œ๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ create-react-app ํ”„๋กœ์ ํŠธ๋ฅผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์ด ๋˜๋„๋ก ๋ณ„๋„์˜ webpack ์„ค์ • ๋ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ next.js ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์ž ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐœ๋ฐœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์†Œ์š”๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด ๋น ๋ฅธ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” next.js๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ฅ ํด๋ผ์ด์–ธํŠธ API ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐ ์บ์‹ฑ

Wedev์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋†’์€ ์ˆ˜์ค€์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋‚ญ๋น„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ API ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ๋…ผ์˜ ๋‹จ๊ณ„์—๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Redux, MobX ๋“ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๊ณ , API ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์ด์™ธ์—๋Š” ๋ณต์žกํ•œ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜, ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” action, state ๊ด€๋ฆฌ, ์ˆ˜ ๋งŽ์€ ๋กœ์ง๋“ค์„ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๊ฐœ๋ฐœ ๋งˆ๊ฐ์ผ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Redux, MobX์™€ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด๋ผ ํŒ๋‹จํ•˜๊ณ  ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•œ ๋Œ€์•ˆ๋“ค์„ ์ฐพ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์—๋Š” GraphQL ์ŠคํŽ™์„ ์ œ๊ณตํ•˜๋Š” API๊ฐ€ ๋งŽ์•„์ง€๊ณ  ์žˆ๋Š”๋ฐ, GraphQL API ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜ ๋งŽ์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์˜ ํ•˜๋‚˜๋Š” Apollo Client์ž…๋‹ˆ๋‹ค. Apollo๋Š” query, mutation ๋‘ ๊ฐ€์ง€ ๊ฐ„๊ฒฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋†’์€ ์ƒ์‚ฐ์„ฑ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜, ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ ๊นŒ์ง€ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ, ๋น ๋ฅธ ์‹œ๊ฐ„๋‚ด์— ๋†’์€ ์ˆ˜์ค€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•˜๋Š” Apollo์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ REST API ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์ตœ๊ทผ์— ๋งŽ์ด ์ž‘์„ฑ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ Apollo์™€ ๊ฐ™์ด ๊ฐ„๊ฒฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ์†์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ , ์›ํ•˜๋Š” ์‹œ๊ฐ„ ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. SWR, react-query, react-async, react-fetching-library์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ์—ˆ๊ณ , ์ „๋ถ€ hooks ๊ธฐ๋ฐ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์„œ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ ์–ด๋Š ์ •๋„ ์ด์Šˆ์™€ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์ด ํ•ด๊ฒฐ๋˜๊ณ , ์ •์‹ ๋ฒ„์ „์œผ๋กœ ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ํ›Œ๋ฅญํ•˜๊ฒŒ ๊ตฌํ˜„๋œ react-fetching-library๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { useQuery, Action } from 'react-fetching-library';

export const makeTaglist: Action = (page: number) => ({
  method: 'GET',
  endpoint: `https://wedev.tv/api/tags?page=${page}`,
});

const action = createTagListAction(1);
const { payload, error } = useQuery(action);

์œ„์™€ ๊ฐ™์ด http ์š”์ฒญ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” action ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , react-fetching-library๊ฐ€ ์ œ๊ณตํ•˜๋Š” useQuery์— action ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“บ ๋™์˜์ƒ ์—…๋กœ๋“œ ๋ฐ ์ธ์ฝ”๋”ฉ ํŒŒ์ดํ”„๋ผ์ธ

Wedev์˜ ๋™์˜์ƒ ์—…๋กœ๋“œ ๋ฐ ์ธ์ฝ”๋”ฉ ํŒŒ์ดํ”„๋ผ์ธ์€ ์ผ๋ จ์˜ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ €, ์‚ฌ์šฉ์ž๊ฐ€ wedev ํด๋ผ์ด์–ธํŠธ์—์„œ ์—…๋กœ๋“œํ•  ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ  ๋™์˜์ƒ ์ •๋ณด(๋™์˜์ƒ ์ œ๋ชฉ, ์ƒ์„ธ์ •๋ณด)๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

์–‘์‹์ด ์ œ์ถœ๋˜๋ฉด, ๋จผ์ € ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์˜์ƒ์„ s3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, s3 ๋ฒ„ํ‚ท์— ์ž„์‹œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณตํ•ด์„œ ๋™์˜์ƒ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, aws์—์„œ ์ œ๊ณตํ•˜๋Š” presigned url์„ ํ™œ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ ์•ฑ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Presgined url์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” aws IAM ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค id์™€ secret์„ ์ œ๊ณตํ•ด์•ผํ•˜๋Š”๋ฐ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ ์•ฑ์— ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— presigned url์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ณ„๋„์˜ lambda ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ๋Š” lambda๋กœ๋ถ€ํ„ฐ presinged url์„ ๋ฐœ๊ธ‰ ๋ฐ›๊ณ , ํ•ด๋‹น url์— ๋Œ€ํ•ด ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ณ ์œ ํ•œ ๊ฐ’์˜ id๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋™์˜์ƒ ํŒŒ์ผ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ธ์ฝ”๋”ฉ๊ณผ์ •์—์„œ ๋™์˜์ƒ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ, ์„ ํƒํ•œ ํŒŒ์ผ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ •๋ณด๋Š” ์„œ๋ฒ„์— ์ „์†กํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ redis์— ๊ธฐ๋กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์›๋ณธ ์˜์ƒ์ด s3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ ๋˜๋ฉด, ๋˜ ๋‹ค๋ฅธ lambda ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด lambda ํ•จ์ˆ˜๋Š” ๋ฐฉ๊ธˆ ์—…๋กœ๋“œํ•œ ๋™์˜์ƒ์˜ url์„ transcoder์— ์ „๋‹ฌํ•˜์—ฌ ์ธ์ฝ”๋”ฉ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Transcoder๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋™์˜์ƒ url์„ ํ†ตํ•ด ์ธ์ฝ”๋”ฉ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด 480p, 720p, 1080p ํ•ด์ƒ๋„์˜ ์˜์ƒ๊ณผ ๊ฐ ํ•ด์ƒ๋„์˜ ์˜์ƒ ์ •๋ณด๋ฅผ ๋‹ด์€ .mpd ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง€๋Š” DASH ํ‘œ์ค€์˜ manifest ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์™€๊ฐ™์ด ์ธ์ฝ”๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด, ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค์„ s3 ๋ฒ„ํ‚ท์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ธ์ฝ”๋”ฉ ์ž‘์—… ์ƒํƒœ๋ฅผ ๋ฐ”๋ผ๋ณด๋˜ SNS ์„œ๋น„์Šค๊ฐ€ ์ธ์ฝ”๋”ฉ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ๊ฐ์ง€ํ•˜๋ฉด, ์„œ๋ฒ„์— ์ธ์ฝ”๋”ฉํ•œ ๋™์˜์ƒ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉด ๋™์˜์ƒ ๊ฒฝ๋กœ์— ํฌํ•จ๋œ id๋ฅผ ํ†ตํ•ด redis์— ๊ธฐ๋กํ–ˆ๋˜ ๋™์˜์ƒ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋™์˜์ƒ manifestํŒŒ์ผ์˜ url๊ณผ ํ•จ๊ป˜ ๋™์˜์ƒ ์ •๋ณด๋ฅผ mysql์— ๊ธฐ๋กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ฦ› ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ณ

AWS Lambda๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ณ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฆฌ์Šค๋ž€ ํด๋ผ์šฐ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” FaaS์˜ ์ผ์ข…์ธ๋ฐ, ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜์—ฌ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์ด ์ƒ์„ฑ๋˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ข…๋ฃŒ๋˜๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ณ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์šฉ์„ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์ธํ”„๋ผ ๊ด€๋ฆฌ๋‚˜ ๋ณด์•ˆ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜, ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•ด auto scaling๊ณผ ๊ฐ™์ด ์„œ๋ฒ„๋ฅผ ์ฆ์„คํ•˜๋Š” ํ…Œํฌ๋‹‰์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ณ์˜ ๊ฒฝ์šฐ์—๋Š” ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํŠน์„ฑ์ƒ ๋ณ„๋„์˜ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ

Wedev ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„ํ‚คํ…์ณ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ cloudfront๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋ฉด cloudfront์—์„œ ์„ค์ •๋œ lambda@edge๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. lamdba@edge๋Š” ์‚ฌ์šฉ์ž์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์œ„์น˜์—์„œ lambda ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ํŽ˜์ด์ง€๊ฐ€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ssr์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ static ํŒŒ์ผ์€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  s3์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„

Wedev ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„ํ‚คํ…์ณ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋จผ์ €, ์„œ๋ฒ„ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋žŒ๋‹ค๋Š” ์—ฐ๊ฒฐ๋œ API Gateway๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, API Gateway ์•ž์— cloudfront๋ฅผ ๋†“๊ณ , cloudfront ์ฃผ์†Œ์— ์—ฐ๊ฒฐ๋œ wedev.tv ๋„๋ฉ”์ธ์„ ํ†ตํ•ด ์œ ์ €๊ฐ€ ๋žŒ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋žŒ๋‹ค ํ•จ์ˆ˜๋Š”, VPC๋‚ด๋ถ€์— ๊ตฌ์„ฑ๋œ private subnet ๋‚ด๋ถ€์— ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ณธ private subnet์—๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ์„ ์œ„ํ•œ mysql๊ณผ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•œ redis๊ฐ€ ํ•จ๊ป˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์„œ ๋žŒ๋‹ค๊ฐ€ ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋–„๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ 3์ž API์— ์ ‘๊ทผํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Wedev ์•ฑ์€ github์˜ 3์ž ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค๊ฐ€ ์™ธ๋ถ€ API์— ์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, NAT ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋งŒ์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋žŒ๋‹ค์—๊ฒŒ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•ด ์คŒ์œผ๋กœ์จ ์™ธ๋ถ€ API์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”‘ ์ธ์ฆ ์•„ํ‚คํ…์ณ ๊ตฌ์„ฑ

  • ๊นƒํ—™ ์ธ์ฆ ํŽ˜์ด์ง€
  • ๊นƒํ—™ ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ•˜๊ฒŒ๋˜๋ฉด Callback URL ๋กœ Redirect
  • Callback URL์— ๋Œ€ํ•œ ์‘๋‹ต์€ Auth Module์ด ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค
  • ์ธ์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด github ์œผ๋กœ ๋ถ€ํ„ฐ code๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ›์Šต๋‹ˆ๋‹ค
  • Auth Module์€ ์–ป์€ code๋กœ Third Party Module ์—๊ฒŒ Github AccessToken์„ ๋‹ฌ๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. Third Party Module๋Š” ๋งŽ์€ api์™€ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค
  • ๋Œ€๋ฆฌ์ธ์˜ ์„ฑ๊ฒฉ์„ ๋„๋Š” Third party Module์€ ๋“ค์–ด์˜จ ์š”์ฒญ์— ๋งž๊ฒŒ Github API module๋กœ ๋ถ€ํ„ฐ ์ฃผ์ž…๋ฐ›์€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  • GitHub API Module์€ ๋ฐ›์€ code๋ฅผ ํ†ตํ•ด์„œ Github Api๋ฅผ ์ด์šฉํ•ด Access Token์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค
  • Auth Module์€ ์‘๋‹ต๋ฐ›์€ Access Token์„ ํ† ๋Œ€๋กœ GitHub API์—๊ฒŒ GIthub ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์š”์ฒญ๊ณผ์ •์€ Auth Module -> Third Party Module -> GitHub API Module -> GitHub API ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ›์€ user ์ •๋ณด๊ฐ€ ์šฐ๋ฆฌ DB์— ์žˆ๋Š”์ง€ AuthService๊ฐ€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ user ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด, ํšŒ์›๊ฐ€์ž…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์›๊ฐ€์ž…์„ ์œ„ํ•ด์„œ Access Token์„ ํฌํ•จํ•œ User ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•ฉ๋‹ˆ๋‹ค
  • ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ํผ์„ ์ž‘์„ฑํ•ด์„œ ์ œ์ถœ์„ ํ•ฉ๋‹ˆ๋‹ค
  • User Module์ด ์ด ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด ์ฟ ํ‚ค์— ๋…น์•„์ ธ ์žˆ๋Š” Access token ๊ณผ ์•„๋ฐ”ํƒ€ ๋“ฑ์˜ GIthub user ์ •๋ณด์™€ ํ•จ๊ป˜ ๋””๋น„์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์›๊ฐ€์ž…์ด ๋˜๋ฉด ๋กœ๊ทธ์ธ์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค
  • user-serializer ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด์„œ ์„ธ์…˜ ํ…Œ์ด๋ธ”์— ํšŒ์›์ •๋ณด๋ฅผ serialize ํ•˜๊ณ , ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” id๋ฅผ ์ฟ ํ‚ค์— ๋…น์—ฌ์„œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค
  • ๊ทธํ›„ user-serializer๊ฐ€ Serialize ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ’์„ ์ •์ œ๋ฅผ ํ•ด์„œ user-session-module์—๊ฒŒ insert๋ฅผ ํ•˜๋ฉด user-session-module์ด ElastiCache์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค

About

๐Ÿ“บwedev - ๊ธฐ์ˆ  ์†Œ๊ฐœ, ๊ฐœ๋ฐœ์ž ์ปค๋ฆฌ์–ด ์กฐ์–ธ, ๊ฐœ๋ฐœ ์ปจํผ๋Ÿฐ์Šค ์˜์ƒ ๊ณต์œ  ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์›น ์„œ๋น„์Šค!

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published