[GCP] Cloud Build & Cloud Run ์„ ํ™œ์šฉํ•œ CI/CD ์ž๋™ํ™”
ยท
๐Ÿ’ป CS/ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…
๋„์ž…https://cloud.google.com/sql/docs/postgres/connect-instance-cloud-shell?hl=ko ๋น ๋ฅธ ์‹œ์ž‘: Cloud Shell์—์„œ PostgreSQL์šฉ Cloud SQL์— ์—ฐ๊ฒฐ | Cloud SQL for PostgreSQL | Google Cloud Documentati์˜๊ฒฌ ๋ณด๋‚ด๊ธฐ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. Cloud Shell์—์„œ PostgreSQL์šฉ Cloud SQL์— ์—ฐ๊ฒฐ ์ด ํŽ˜์ด์ง€์—์„œ๋Š” PostgreSQL ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฐ๊ฒฐํ•˜๋Š”docs.cloud.google.com GCP ๋ฅผ ํ™œ์šฉํ•œ ํ”„๋ก ํŠธ-๋ฐฑ์—”๋“œ-DB 3๊ณ„์ธต ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ฐ€ ๋งŒ๋“  ์›น์•ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์— ๊ด€ํ•ด ์ •๋ฆฌํ•ด..
HTTP Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
ยท
๐ŸŒ WEB
๐Ÿ“ฆ Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต์€ Express์—์„œ multer ๊ฐ™์€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์“ฐ๋ฉด ์†์‰ฝ๊ฒŒ ๋๋‚˜๋Š”๋ฐ์š”. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ , ์ง์ ‘ multipart/form-data๋ฅผ ํŒŒ์‹ฑํ•ด๋ณด๋ฉด์„œ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. 1. ์™œ multipart/form-data์ธ๊ฐ€?์ผ๋ฐ˜์ ์ธ HTML ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ application/x-www-form-urlencoded ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํŒŒ์ผ ์—…๋กœ๋“œ์ฒ˜๋Ÿผ ๋Œ€์šฉ๋Ÿ‰ ์ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋ฉด ๋‹จ์ˆœ URL ์ธ์ฝ”๋”ฉ์œผ๋กœ๋Š” ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ multipart/form-data์ž…๋‹ˆ๋‹ค.์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒํŠธ๋ฅผ ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋‹ด..
Node.js๋กœ ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ: Cluster์™€ Worker Threads
ยท
๐ŸŒ WEB
๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฌ๋””๋Š” ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๊ตฌํ˜„ํ•˜๊ธฐNode.js๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌํƒœ๊นŒ์ง€๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” HTTP ์›น ์„œ๋ฒ„๋ฅผ ๋‹ค๋ฃจ์—ˆ๋Š”๋ฐ์š”. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์š”์ฒญ์˜ ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•œ๋‹ค๋ฉด, ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์•„์‰ฝ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด๋ผ๋ฉด ๊ตณ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜ํ‰ ํ™•์žฅํ•  ํ•„์š”๋„ ์—†๊ธฐ์— ์žˆ๋Š” ์ž์›์„ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ๊ฐ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค/ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋ณด๊ณ  ๊ฐ ๋ฐฉ์‹์„ ๋น„๊ต ๋ถ„์„ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 1. cluster ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด CPU ์ฝ”์–ด ์ˆ˜๋งŒํผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ2. Worker Threads ๊ธฐ๋ฐ˜ ์ž‘์—… ..
์›น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น„๊ต์™€ ํ™œ์šฉ๋ฒ•
ยท
๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)
์›น ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๊ฐ•ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ๋ฒ„ํŠผ ํ˜ธ๋ฒ„ ํšจ๊ณผ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์‹œ๊ฐํ™”๊นŒ์ง€, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Transition/Transform/Opacity, Keyframes, requestAnimationFrame(rAF), Web Animations API(WAAPI) ๋„ค ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์ ‘๊ทผ๋ฒ•์„ ๋น„๊ตํ•˜๊ณ , ์‹ค์ œ๋กœ ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์“ฐ๋ฉด ์ข‹์€์ง€ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1. CSS Transition + Transform / Opacity https://developer.mozilla.org/ko/docs/Web/CSS/CSS_transitions/Using_CSS_transitions CSS ํŠธ๋žœ์ง€..
HTTP ํŒจํ‚ท ๋ถ„์„ํ•˜๊ธฐ
ยท
๐ŸŒ WEB
net ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด HTTP ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ1. net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„ ์ƒ์„ฑ ์šฐ์„  ๊ฐ€์žฅ ๋จผ์ € HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์›น์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.net ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  server.listen ์œผ๋กœ ์ง€์ •๋œ PORT ์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ listen ํ•˜๋ฉฐsocket.on ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import net from 'net';// ๊ธฐ๋ณธ HTTP ์„œ๋ฒ„ ์„ค์ •const PORT = 80;const HOST = '0.0.0.0';/** * net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„ * Express ๋“ฑ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ net ๋ชจ๋“ˆ๋กœ HTTP ์„œ๋ฒ„ ๊ตฌํ˜„ */const server = net.createServer((socket) => { console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ..
HTTP ํŒจํ‚ท ๊ตฌ์กฐ, ์š”์ฒญ ํ—ค๋”/๋ฐ”๋””
ยท
๐ŸŒ WEB
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€(ํŒจํ‚ท) ํ˜•ํƒœ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ๊ธฐ์ค€์œผ๋กœ ๋œฏ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.1. ํŒจํ‚ท ๊ตฌ์กฐ (๋„คํŠธ์›Œํฌ ๊ณ„์ธต ๊ด€์ )L2 (๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต): Ethernet ํ—ค๋” (MAC ์ฃผ์†Œ, CRC ๋“ฑ)L3 (๋„คํŠธ์›Œํฌ ๊ณ„์ธต): IP ํ—ค๋” (์ถœ๋ฐœ์ง€ IP, ๋ชฉ์ ์ง€ IP ๋“ฑ)L4 (์ „์†ก ๊ณ„์ธต): TCP ํ—ค๋” (์ถœ๋ฐœ์ง€ ํฌํŠธ, ๋ชฉ์ ์ง€ ํฌํŠธ, ์ˆœ๋ฒˆ, ACK ๋“ฑ)L7 (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต): HTTP ๋ฉ”์‹œ์ง€ (์‹ค์ œ ์š”์ฒญ)์šฐ๋ฆฌ๊ฐ€ ๋ณดํ†ต "HTTP ์š”์ฒญ ํŒจํ‚ท"์ด๋ผ ๋งํ•  ๋•Œ๋Š” L7 HTTP ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.2. HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๊ตฌ์„ฑHTTP ์š”์ฒญ์€ ํฌ๊ฒŒ Request Line, Headers, Body ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (1) Request Line..
Webpack Tree Shaking ๋™์ž‘ ์›๋ฆฌ
ยท
๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)
ํŠธ๋ฆฌ์…ฐ์ดํ‚น(Tree Shaking)ํŠธ๋ฆฌ์…ฐ์ดํ‚น(Tree Shaking)์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด์—์š”. ๋งˆ์น˜ ๋‚˜๋ฌด๋ฅผ ํ”๋“ค์–ด ๋ถˆํ•„์š”ํ•œ ์žŽ์„ ๋–จ์–ด๋œจ๋ฆฌ๋“ฏ, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(Dead Code)๊ฐ€ ๋ฒˆ๋“ค ํŒŒ์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•ด์š”.์˜ˆ๋ฅผ ๋“ค์–ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŠน์ • ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ๋„ ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋ผ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์„ ์ ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋งŒ ๋ฒˆ๋“ค์— ๋‚จ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”. ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด์ œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์˜ ์ฃผ์š” ํŠน์ง•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณผ๊ฒŒ์š”.ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝํŠธ๋ฆฌ์…ฐ์ดํ‚น์€ ์ •์  ๋ถ„์„(Stati..
Webpack + Babel + TypeScript ์„ค์ • ๊ฐ€์ด๋“œ
ยท
๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)
์˜ค๋Š˜์€ Vanilia JS ๋ฅผ ํ™œ์šฉํ•œ SPA ํ”„๋กœ์ ํŠธ์—์„œ Babel + TypeScript + Webpack ์„ ์„ค์ •ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Babel์ด๋ž€? https://babeljs.io/ BabelCurrent Sponsors We're a small group of volunteers that spend their free time maintaining this project, funded by the community. If Babel has benefited you in your work, becoming a contributor or sponsoring might just be a great way to give back!babeljs.io ๊ณต์‹๋ฌธ์„œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†Œ๊ฐœ๊ฐ€ ๋‚˜์™€์žˆ..