Skip to content

boostcampwm2023/web11-SSOCK

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๐ŸŽ„ web11-SSOCK

๋ฉ”์ธ ์•„์ด๋””์–ด

  • ํฌ๋ฆฌ์Šค๋งˆ์Šค์— ์‚ฌ๋žŒ๋“ค๋ผ๋ฆฌ ์†๋งˆ์Œ์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด ์–ด๋–จ๊นŒโ“
  • ๋กค๋งํŽ˜์ดํผ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ์‚ฌ๋žŒ์ด ํ•œ ๊ณณ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑ ํ•˜๋Š” ์•„์ด๋””์–ด๐Ÿ“„
  • ๋ฐ˜์‘ํ˜• 3D๋กœ ์ž…์ฒด๊ฐ์žˆ๋Š” ์Šค๋…ธ์šฐ๋ณผ ์ œ์ž‘๐Ÿ”ฎ



์Šค๋…ธ์šฐ๋ณผ์„ ์ด๋ฆฌ์ €๋ฆฌ ๊ตฌ๊ฒฝ ํ•ด๋ณด์„ธ์š” ! ๐ŸŽ„

์žฅ์‹์„ ํด๋ฆญํ•˜๋ฉด ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ’




์Šค๋…ธ์šฐ๋ณผ์„ ํด๋ฆญํ•˜๋ฉด ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€์„œ ์žฅ์‹ ํด๋ฆญ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์žฅ์‹์„ ํด๋ฆญํ•˜๋ฉด ๋ฉ”์„ธ์ง€๊ฐ€ ๋ณด์—ฌ์š”.

์ฝ์ง€ ์•Š์€ ๋ฉ”์„ธ์ง€๋Š” โ— ํ‘œ์‹œ๊ฐ€ ๋– ์žˆ์–ด์š”.



๋‚˜๋งŒ์˜ ์Šค๋…ธ์šฐ๋ณผ์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š” ! โ›„

์žฅ์‹๊ณผ ์ƒ‰๊น”์„ ์„ ํƒํ•ด ๊ฐœ์„ฑ์žˆ๋Š” ์Šค๋…ธ์šฐ ๋ณผ์„ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•ด ๋ณด์„ธ์š” ๐Ÿ”ฎ




์›ํ•˜๋Š” ์žฅ์‹๊ณผ ์ƒ‰๊น”์„ ์„ ํƒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์Šค๋…ธ์šฐ๋ณผ์˜ ์ด๋ฆ„์„ ์ง์ ‘ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด์š”.

๋งํฌ๋ฅผ ๋งˆ์Œ์„ ์ „๋‹ฌ ๋ฐ›๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ณต์œ ํ•ด์š”.



๊ณต์œ  ๋ฐ›์€ ์Šค๋…ธ์šฐ๋ณผ์„ ๊พธ๋ฉฐ์ฃผ์„ธ์š” ! ๐ŸŽ

์ด์œ ์žฅ์‹์„ ๋งŒ๋“ค์–ด ๋”ฐ๋œปํ•œ ๋ง์„ ๋‹ด์€ ๋ฉ”์„ธ์ง€๋ฅผ ๋‚จ๊ฒจ๋ณด์„ธ์š” ! ๐Ÿ’Œ




๊ณต์œ  ๋ฐ›์€ ๋งํฌ๋ฅผ ํ†ตํ•ด ์Šค๋…ธ์šฐ๋ณผ ์ฃผ์ธ์˜ ์žฅ์‹์„ ๊ตฌ๊ฒฝํ•ด์š”.

์Šค๋…ธ์šฐ๋ณผ์— ๋“ค์–ด๊ฐˆ ์žฅ์‹์„ ์ง์ ‘ ์„ ํƒํ•ด์š”.

์ „ํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์„ ๋ฉ”์„ธ์ง€์— ๋‹ด์•„ ์žฅ์‹๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด์š”.


๋ฐœํ‘œ ์˜์ƒ

์ปค๋„ฅํŠธ์žฌ๋‹จ ๋™์˜์ƒ

SSOCK ํŒ€

J034 J064 J082 J074 J160
๊น€์ฐฌ์šฐ ์„œ๋ฏผ์•„ ์˜ค์Šน์—ฝ ์†กํ˜„์šฐ ์ตœ์ง„์ˆ˜
Front-End Front-End Front-End Back-End Back-End
์ž˜ ๋ถ€ํƒ๋“œ๋ ค์š”
์—ฐ๋ง
-๋‚ญ๋งŒ์‚ฌ๋ƒฅ๊พผ-
๋‚˜๋„ 3D์‚ฌ์ดํŠธ,,
ํ•  ์ˆ˜ ์žˆ๋‹ค,,๐Ÿ”ฅ
์•ˆ๋…•ํ•˜์„ธ์š”
์ €๋Š” ์˜ค์Šน์—ฝ์ž…๋‹ˆ๋‹ค
๋ˆ„๊ตฐ๊ฐ€๋Š”
ํ•ด์•ผํ•˜์ž–์•„๐Ÿคฏ
Back-End ๋ฐฑ๋ฆฐ์ด
์ตœ์ง„์ˆ˜์ž…๋‹ˆ๋‹ค

๊ธฐ์ˆ ์Šคํƒ

๋ถ„๋ฅ˜ ๊ธฐ์ˆ  ์Šคํƒ

๊ณตํ†ต

ํ”„๋ก ํŠธ์—”๋“œ

๋ฐฑ์—”๋“œ

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €

๋ฐฐํฌ

ํ˜‘์—…

๐Ÿ”ง ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ

๊ธฐ์ˆ ์  ๋„์ „

ํ”„๋ก ํŠธ์—”๋“œ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ์ค‘์ ์ ์œผ๋กœ ์ƒ๊ฐํ•œ ๋ถ€๋ถ„์€ ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์ด ์‚ฌ์šฉํ•  ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์ž ์˜€์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ ์—”๋“œ ํŒ€์› ๋ชจ๋‘ React ์— ์ต์ˆ™ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ์–ด๋ ค์šด ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„๋ณด๋‹ค๋Š” ๊ธฐ์ดˆ์ ์ธ ๋ถ€๋ถ„์— ์ถฉ์‹คํ•˜๊ฒŒ ํ•™์Šตํ•˜์—ฌ ๊ตฌํ˜„์„ ํ•ด๋‚˜๊ฐ€๋Š”๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์—์„œ์˜ ํ˜ธํ™˜์„ฑ

๊ฐœ๋ฐœํ™˜๊ฒฝ์„ PC ํ™˜๊ฒฝ์—์„œ ํฌ๋กฌ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ฐ˜์‘ํ˜•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ”„๋กœํ† ํƒ€์ž…์„ ์™„์„ฑ ํ›„, ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ์—์„œ์˜ UI๋ฅผ ํ™•์ธํ•ด๋ณด๊ณ  ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ ์™€์ค‘, 3D ๋ชจ๋ธ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ์˜ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์˜€๊ณ , Three.js ์˜ ๋ชจ๋ธ๋ง์˜ Mesh ๋ฅผ ์กฐ์ ˆํ•˜๊ณ  rAF ๊ธฐ๋ฐ˜์ธ useFrame ์„ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฌถ์–ด ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๊ฐค๋Ÿญ์‹œ S10 ๊ธฐ์ค€ GPU ๋ฅผ 98% ์—์„œ 70% ๊ฐ€๋Ÿ‰์œผ๋กœ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๋‚ฎ์ถ”์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, ์•„์ดํฐ IOS 17 ๋ฒ„์ „ ์ดํ›„๋กœ ์‚ฌํŒŒ๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ธฐ์กด ํ™”๋ฉด์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” 100vh ์—์„œ ์ง์ ‘ ๋ Œ๋”๋ง ๋˜๋Š” ํ™”๋ฉด์„ ๊ณ„์‚ฐํ•ด ์นด์นด์˜คํ†ก, ์ธ์Šคํƒ€๊ทธ๋žจ๊ณผ ๊ฐ™์€ ์ž„๋ฒ ๋“œ ์›น๊นŒ์ง€ ์ ์ ˆํ•˜๊ฒŒ ๋ Œ๋”๋ง ๋ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธ100vh ๊ธฐ๊ธฐ๋ฌธ์ œ

๋‹ค์Œ์œผ๋กœ ๋งค๋ฒˆ ๋ฐฐํฌํ•ด์„œ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ CSS ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ์— ์–ด๋ ค์›€์ด ์žˆ์–ด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ๊ธ€ ํฌ๋กฌ ์Šค๋งˆํŠธํฐ ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ (์•ˆ๋“œ๋กœ์ด๋“œ)
  • ์œ ๋ฃŒ ํ”„๋กœ๊ทธ๋žจ
  • vite ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ์—ฐ๊ฒฐ

์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๊ณ  ๊ทธ์ค‘์— ๊ฐ€์žฅ ์ ‘๊ทผ์„ฑ์ด ์ข‹์€ vite ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ์—ฐ๊ฒฐ์„ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

vite.config.ts ์˜ host๋ฅผ ์„ค์ •ํ•ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


react-components

  • ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”

SSOCK ํŒ€ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์„ค๊ณ„ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์˜ ๊ฐ„๋žตํ•œ ์‹œ๊ฐํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


react-components

ํฌ๊ฒŒ Three.js ๋กœ ๋ Œ๋”๋งํ•œ Canvas ์ปดํฌ๋„ŒํŠธ์™€ UI ๋ฅผ ๊ตฌ๋ถ„์ง€์–ด ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3D ๋ชจ๋ธ์„ ๋ Œ๋”๋ง ํ•˜๋Š”๊ฒƒ์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์ด ์žˆ์—ˆ๊ณ , ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋“ค์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์–ด (์œ„ ์†Œ๊ฐœ GIF ์˜ˆ์‹œ๋กœ ์žฅ์‹์ด ๋‹ค์‹œ ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ) ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋ถ€์ •์  ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฆฌ๋ Œ๋”๋ง์— ์‚ฌ์šฉ๋˜๋Š” useState ํ›…์„ UI ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ ค ์‹œ๋„ํ•˜์˜€๊ณ , ๊ทธ๋กœ์ธํ•ด Canvas ์ปดํฌ๋„ŒํŠธ์™€์˜ depth ์ฐจ์ด์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด React ์— ๊ธฐ๋ณธ๊ธฐ์— ์ถฉ์‹คํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  useContext ํ›…์„ ์‚ฌ์šฉํ•ด ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ผ์šฐํŒ…๋œ ํŽ˜์ด์ง€๋“ค์˜ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ •์˜ํ•ด์ฃผ๊ณ  Provider ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ์‹ธ Canvas ์™€ UI ๋ชจ๋‘ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋กœ์ธํ•ด Canvas๋กœ ๋ Œ๋”๋ง๋œ ์žฅ์‹ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ์ฒ˜๋ฆฌ๋ฅผ UI ์—์„œ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ์–ด Canvas ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šธ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๊ณ ๋ ค๋ฅผ ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ์ง€์•Š์€ ๋ฉ”์„ธ์ง€์˜ ๊ฒฝ์šฐ Canvas ์—์„œ 3D ๋ชจ๋ธ โ— ๋กœ ๋ Œ๋”๋ง ํ•˜์˜€๋Š”๋ฐ, ์žฅ์‹์„ ํด๋ฆญํ•˜์˜€์„๋•Œ UI ์™€ Canvas ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง์„ ๋™์‹œ์— ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๊ณ , ๋ฉ”์„ธ์ง€๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค 3D ๋ชจ๋ธ์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด ๋‹ค์‹œ ๋–จ์–ด์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ์ปดํฌ๋„ŒํŠธ์˜ props ๋ฅผ ๋น„๊ตํ•ด ์ด์ „ ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๋Š” React.memo ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.


React.memo ์ ์šฉ ์ „ React.memo ์ ์šฉ ํ›„

๐Ÿ˜ง useContext ์ƒํƒœ๊ด€๋ฆฌ

๐Ÿ“ React.memo ๋ฅผ ํ†ตํ•œ ์ตœ์ ํ™”

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™”

๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ์บ ํ”„ ์ฑŒ๋ฆฐ์ง€๋•Œ ์ฝ์—ˆ๋˜ ํ•จ๊ป˜ ์ž๋ผ๊ธฐ ์ฑ…์„ ์ฝ๊ณ  ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3์ฃผ์ฐจ ๋ถ€ํ„ฐ ํ”„๋กœํ† ํƒ€์ž…์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด์„œ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์ž…์žฅ๊ณผ ์‚ฌ์šฉ์ž๋“ค์˜ ์ž…์žฅ ์ฐจ์ด๊ฐ€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ˆ˜์šฉํ•œ ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ ๊ฐœ์„ 


ํ”ผ๋“œ๋ฐฑ ์ˆ˜์šฉ ์ „ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์šฉ ํ›„

๋งค์ฃผ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์™„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๋ฐฑ์—”๋“œ ๊ธฐ์ˆ ์  ๋„์ „

์ €ํฌ ๋ฐฑ์—”๋“œ ํŒ€์›์ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ์ค‘์ ์ ์œผ๋กœ ์ƒ๊ฐํ•œ ๋ถ€๋ถ„์€ย ๋งŽ์€ ์ด์šฉ์ž๋“ค์„ ๊ณ ๋ คํ•œ ์„œ๋ฒ„ ๊ตฌ์„ฑ ๋ฐ ํšจ์œจ์ ์ธ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค

๋ฐฑ์—”๋“œ ํŒ€์› ๋ชจ๋‘ย ์‹ค์ œ ๋ฐฐํฌ ๋ฐ Nest.js๊ฐ€ ์ฒ˜์Œ์ด์—ˆ๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๋“ค์„ ๋„์ž…ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ธฐ์กด์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ  ์Šคํƒ์„ ๋” ๊นŠ์ด์žˆ๊ฒŒ ๊ณต๋ถ€ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์žก์•˜์Šต๋‹ˆ๋‹ค

  • ์ธํ”„๋ผ ์„ค๊ณ„

NCP๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ์ธํ”„๋ผ ๊ตฌ์กฐ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฐฑ์—”๋“œ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๊ฒƒ์ด ์ €ํฌ์˜ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.

VPC์•ˆ์— Nginx๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์›น์„œ๋ฒ„๋ฅผ ๊ณต๊ฐœ ์„œ๋ธŒ๋„ท์— ๋นผ์ฃผ๊ณ  WAS์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋ฅผ ๋น„๊ณต๊ฐœ ์„œ๋ธŒ๋„ท์— ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„๊ณต๊ฐœ ์„œ๋ธŒ๋„ท์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์™ธ๋ถ€์ ‘๊ทผ์„ ๋ง‰์•„์คŒ์œผ๋กœ 1์ฐจ ๋ณดํ˜ธ๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

CI/CD๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐฑ์—”๋“œ์„œ๋ฒ„๊ฐ€ ๋น„๊ณต๊ฐœ ์„œ๋ธŒ๋„ท์— ํฌํ•จ๋˜์–ด์žˆ์–ด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ๋ฐฐํฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” VPC๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด๋ผ ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉด๋ฐ€ํ•œ ๊ฒ€์‚ฌ ํ›„ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜๊ณ  ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ NAT ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์„œ ์™ธ๋ถ€์—์„œ์˜ incoming ํ†ต์‹ ์€ ์ฐจ๋‹จํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ์„œ๋ฒ„์—์„œ์˜ outgoing ํ†ต์‹ ์€ ์—ด์–ด์ฃผ์–ด์„œ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์•…์„ฑ ์‚ฌ์šฉ์ž ์˜ˆ๋ฐฉ

์œ ์‚ฌํ•œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜๋‹ˆ, DDOS ๊ณต๊ฒฉ์œผ๋กœ ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋น„์šฉ์ด ๋‚˜์˜ค๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ด๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ip๋ณ„๋กœ rate-limiting์„ ์ ์šฉํ•˜์—ฌ ์š”์ฒญ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋ชฐ๋ฆฌ๋Š” ip๋ฅผ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค

  • ์ฟผ๋ฆฌ ์ตœ์ ํ™”

TypeORM์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ํŽธ๋ฆฌํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜์— ์˜์กดํ•˜๊ฒŒ ๋˜์–ด ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ „์†ก๋˜๊ณ  ์„ค๊ณ„๋˜๋Š” ์ง€ ๋ช…ํ™•ํ•˜์ง€๊ฐ€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ์ฟผ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ ํ•„์š”ํ•˜๋‹ค๋ฉด rawQuery๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ์„œ๋น„์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰


๋” ์ž์„ธํ•œ ๊ธฐ๋ก์€ ๋…ธ์…˜๊ณผ ์œ„ํ‚ค๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.