แ„‹แ…ตแ„Œแ…ขแ„’แ…ฎแ†ซแ„Œแ…กแ„‰แ…ฉแ„‰แ…ฅแ„‰แ…กแ„Œแ…ตแ†ซแ„‰แ…ฆแ„…แ…ฉแ„แ…กแ†ฒแ„‹แ…ณแ†ซแ„‡แ…ฅแ„Œแ…ฅแ†ซ.png

๐Ÿ“ž phone: 010-2311-1090

๐Ÿ“ง Email : [email protected]


**Github | Tistory | LinkedIn**

๐Ÿ‘ฉโ€๐Ÿ’ป FrontEnd Developer

โš’ Project


๊ธ€์“ฐ๊ธฐ ๋ชจ์ž„์„ ์œ„ํ•œ ๊ธ€์“ฐ๊ธฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค

:: Mile

2 PM / 2 Design / 4 FE / 2 BE


React, Typescript, Tanstack-Query v5, Emotion

2023.12~ ing

https://github.com/Mile-Writings/Mile-Client

MILE

์œ ์ €์—๊ฒ ์—๋””ํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ธ€์„ ์“ฐ๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š”, ๋ชจ์ž„ ๊ด€๋ฆฌ์ž์—๊ฒ admin๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๊ธ€๋ชจ์ž„์„ ๋งŒ๋“ค๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐ์Šคํฌํƒ‘ ์›น ์„œ๋น„์Šค

<aside> [ React CSRํ™˜๊ฒฝ์—์„œ prerender ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์œผ๋กœ SEO๊ฐœ์„  & dynamic OG meta tag ์„ค์ •์œผ๋กœ ์„œ๋น„์Šค ์œ ์ž… ์œ ๋„]

์ƒํ™ฉ : React๋กœ ์ด๋ฃจ์–ด์ง„ ์„œ๋น„์Šค์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ํ•˜๋‚˜์˜ meta tag๊ฐ€ ์ œ๊ณต๋˜๊ณ  ์ดˆ๊ธฐ์— ํฌ๋กค๋Ÿฌ๊ฐ€ ๋นˆ index.htmlํŒŒ์ผ์„ ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์ธํ•ด ๊ฐ๊ฐ์˜ ๊ธ€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ SEO์— ์ตœ์ ํ™”ํ•˜์ง€ ๋ชปํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ํ†ตํ•œ ์ƒˆ๋กœ์šด ์œ ์ €์˜ ์œ ์ž…์ด ์–ด๋ ต๊ณ  ์œ ์ €ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์นด์นด์˜คํ†ก ๋“ฑ ์†Œ์…œ ๋ฏธ๋””์–ด์—์„œ์˜ ๋งํฌ ๊ณต์œ  ์‹œ ๊ธ€์˜ ์ œ๋ชฉ๊ณผ image๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ˆ์ฆˆ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ OG image์™€ title์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ ์œ ์ €์˜ ๊ฒฝํ—˜์„ ๊ฐœ์„ ์‹œํ‚ค๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์œ ์ €์˜ ์œ ์ž…์—๋„ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ผ์น  ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ CSR์— ํ™˜๊ฒฝ์—์„œ prerender pipeline์„ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ : CSRํ™˜๊ฒฝ์—์„œ๋Š” ๋นˆ html์„ ๋กœ๋“œํ•˜๊ณ  ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กค๋Ÿฌ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” meta tag๋Š” index.html์˜ ์ •์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ผํ•˜๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ–‰๋™ : ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ€์„ค์„ ์„ธ์šฐ๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ตฌ์ƒํ•ด๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

  1. react-helmet-async ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฉ”ํƒ€ํƒœ๊ทธ๋ฅผ ๋™์ ์œผ๋กœ ๊ฒ€์ƒ‰์—”์ง„์— ๋…ธ์ถœ
  2. NEXT JS๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ssr ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ ๋˜๋Š” vite-plugin-ssr ์„ ์‚ฌ์šฉํ•ด์„œ ssrํ™˜๊ฒฝ ๊ตฌ์ถ•
  3. prerender ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ๊ธ€ ์ƒ์„ธํŽ˜์ด์ง€์— meta tag๋ฅผ ๋™์ ์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„

๊ฒฐ๊ณผ : OG meta tag๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…๋งŒ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๊ฑฐ๋‚˜ ssr ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœํ•œ๋‹ค๋Š” ํŒ๋‹จํ•˜์— vite ํ™˜๊ฒฝ์—์„œ puppeteer๋ฅผ ํ™œ์šฉํ•œ prerendering ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

react-helmet-async ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ์ดํ›„์— ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กค๋Ÿฌ๊ฐ€ ์ ‘๊ทผํ•œ ์ดํ›„์— meta tag๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ์„œ SNS๊ณต์œ ๋ฅผ ์œ„ํ•œ meta tag ์ถ”๊ฐ€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

react-snap์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” puppeteer์˜ ๋ฒ„์ „์ด ๋‚ฎ์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋Š” ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ dynamic prerendering์— ๋Œ€ํ•œ ์ง€์›์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜๊ณ  Create-React-App ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์„ธํŒ…์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— vite๋‚˜ rollup์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ์ด ๋งž์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋‹ค์ˆ˜ ์กด์žฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @prerenderer/rollup-plugin๊ณผ @prerenderer/renderer-puppeteer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ prerendering์— ํ•„์š”ํ•œ ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•œ dynamic route๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  prerender๋˜๋Š” html ํŒŒ์ผ์„ ์ปค์Šคํ…€ํ•˜์—ฌ meta tag๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

</aside>

<aside> [ Lighthouse์™€ vite-bundle-visualizer๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ๊ฐœ์„  ]

๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋ฉ”์ธํŽ˜์ด์ง€์˜ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ Lighthouse์™€ vite-bundle-visualizer๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ™•์ธํ•œ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ๊ธ€๋ชจ์ž„์—์„œ ์—…๋กœ๋“œ ๋˜๊ณ ์žˆ๋Š” ๊ณ ํ™”์งˆ ์ด๋ฏธ์ง€๋กœ ์ธํ•ด ์ดˆ๊ธฐ ๋ Œ๋”๋ง๋˜๋Š” ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ์™€ LCP ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ฃผ๊ณ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์—ฌ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€์˜ ํ™•์žฅ์ž๋ฅผ webP๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด LCP load time์„ 30% ๋‹จ์ถ•ํ•˜๊ณ  S3์˜ ์‚ฌ์šฉ๋Ÿ‰์„ 30% ์ ˆ๊ฐํ•˜์˜€์œผ๋ฉฐ ์ดˆ๊ธฐ ๋ Œ๋”๋ง๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ 8.0 MB โ†’ 2.6MB๋กœ ์•ฝ 75% ๊ฐ์†Œ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

  2. ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ ํฐํŠธ ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์ด ๊ฐ€์žฅ ํฐ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ์šฉ๋Ÿ‰ ๊ฐ์†Œ๋ฅผ ์œ„ํ•ด font dynamic subset์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Resource 2.1MB โ†’ 400KB ์•ฝ 80% SI 3.2s โ†’ 2.6s **์•ฝ 20%**์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Coverage ํƒญ์„ ํ™•์ธํ•˜์—ฌ ๋ฉ”์ธํŽ˜์ด์ง€์— ๋ถˆํ•„์š”ํ•œ JSํŒŒ์ผ, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” CSSํŒŒ์ผ์„ ํ™•์ธ ํ›„ ํ•ด๋‹น ๋ฒˆ๋“ค์„ route level์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ chunk๋กœ ๋‚˜๋ˆ„์–ด ํ•„์š”ํ•œ ์‹œ์ ์— ํ•ด๋‹น ์ฒญํฌ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก code splitting์„ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  2. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋กœ์ง๊ณผ useEffect๋กœ์ง์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„ below the fold ์˜์—ญ์˜ ์ด๋ฏธ์ง€๋ฅผ lazy loadingํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ FCP๋ฅผ 3.3s โ†’ 1.8s ์•ฝ 50% ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


์œ„ 4๊ฐ€์ง€๋ฅผ ํ†ตํ•ด ๋ฉ”์ธํŽ˜์ด์ง€์˜ Production ๊ธฐ์ค€ ์„ฑ๋Šฅ์ง€ํ‘œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. FCP - 3.3s โ†’ 0.5s SI - 3.2s โ†’ 0.5s Lighthouse Performance Score - 66โ†’ 99

</aside>

<aside> [ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋กœ UX ๊ฐœ์„ ]

๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด ๋ถˆ์•ˆ์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ข‹์•„์š” ๊ธฐ๋Šฅ์˜ ๋Š๋ฆฐ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ข‹์ง€ ์•Š์€ ์œ ์ € ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์—ฌ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜์—ฌ UX๋ฅผ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„๊ณผ์ • ์ค‘ Tanstack query ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ setQueryData ๋ฉ”์†Œ๋“œ๋ฅผ ๊นŠ๊ฒŒ ๊ณ ์ฐฐํ•˜๋ฉฐ ์–ด๋–ค ์›๋ฆฌ๋กœ ํ•ด๋‹น ๋กœ์ง์ด ์ž‘๋™ํ•˜๋Š”์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿ”—ย ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ (feat setQueryData ๋œฏ์–ด๋ณด๊ธฐ)

</aside>

<aside> [ Tanstack query key ๊ตฌ์กฐ ๊ฐœ์„  ]

๊ธฐ์กด์˜ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ๊ณผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ํ‚ค ์œ„๊ณ„, ํœด๋จผ ์—๋Ÿฌ๋กœ ๋ฐœ์ƒํ•˜์˜€๋˜ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด **๐Ÿ”—query key factory๋ฅผ ๋„์ž…**ํ•˜์—ฌ React Query key๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ Hierarchy ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์—ˆ๊ณ  ์•„๋ž˜ 4๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ Query key๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ํ‚ค
  2. ํ™•์‹คํ•œ ์œ„๊ณ„
  3. ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค ๊ตฌ์กฐ
  4. ๊ณต๋™๋ฐฐ์น˜(Colocation)

์ด๋ฅผ ํ†ตํ•ด ํ‚ค์˜ ์œ„๊ณ„๋ฅผ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด ํ‚ค์˜ ์„ธ๋ถ„ํ™”์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์—๋„ ์‰ฝ๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ  ๋” ์šฉ์ดํ•œ ์ˆ˜๋™ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

</aside>

<aside> [ presigned URL ๋„์ž…์œผ๋กœ ๊ณ ํ™”์งˆ ์ด๋ฏธ์ง€ ํ™”์งˆ์ €ํ•˜ ๋ฐ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ ]

์„œ๋ฒ„์— ๊ณ ํ™”์งˆ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ์— ํ™”์งˆ์ด ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ์™€ ๋”๋ถˆ์–ด ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ s3๋กœ ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” presigned URL ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์—ฌ ์ด๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๋ชจ๋“  ๋กœ์ง์— ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์—ฌ ์ด๋ฅผ ์ปค์Šคํ…€ํ›…์œผ๋กœ ๋งŒ๋“ค์–ด ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์—†์• ๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿ”—ย PR ๋งํฌ

</aside>

<aside> [ MSW๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ณ‘๋ชฉํ˜„์ƒ ๊ฐœ์„  ๋ฐ ์„œ๋ฒ„์˜์กด์„ฑ ๊ฐ์†Œ]

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

</aside>

<aside> [ FE Lead Developer ]

ํ”„๋ก ํŠธ์—”๋“œ ํŒ€ ๋ฆฌ๋”๋กœ์„œ ์ฃผ๋„์ ์œผ๋กœ ํ˜‘์—…์— ์ฐธ์—ฌํ–ˆ์œผ๋ฉฐ ๊ณต์œ ํ•˜๋Š” ํŒ€ ๋ฌธํ™”๋ฅผ ๋งŒ๋“ค์–ด ๋„์ž…ํ•ด์•ผํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ธ์…˜์„ ์ง„ํ–‰ํ•ด์„œ ํŒ€์› ๋ชจ๋‘์—๊ฒŒ ๊ณต์œ ํ•˜๋Š” ๋ฌธํ™”, ์Šคํ”„๋ฆฐํŠธ ๋์— ์„œ๋กœ๊ฐ€ ๋งˆ์ฃผํ•œ ํŠธ๋Ÿฌ๋ธ”์„ ๊ณต์œ ํ•˜๊ณ  ํšŒ๊ณ ํ•˜๋Š” ๋ฌธํ™”๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค. Pn๋ฃฐ์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ ๊ณผ์ •์—์„œ ๋ช…ํ™•ํ•œ ์˜์‚ฌ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์˜€๊ณ , PR์ด ์ปค์ง€๋Š” ๊ฒƒ์ด ๋น ๋ฅธ ๋ฆฌ๋ทฐ์™€ ๋ฐ˜์˜์„ ์–ด๋ ต๊ฒŒ ํ•˜์—ฌ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR size labeling์„ ๋„์ž…ํ•˜๋Š” ๋“ฑ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ํŒ€ ์ปจ๋ฒค์…˜์„ ๋งŒ๋“ค์–ด๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

</aside>

์ตœ์ ์˜ ํšŒ์˜์‹œ๊ฐ„ ๋„์ถœ ์„œ๋น„์Šค

:: ASAP

2 PM / 2 Design / 2 FE / 2 BE


React, Typescript, Recoil, styled-components

2023.06~2023.10,

2024.06~ 2024.08

https://github.com/ASAP-as-soon-as-possible/ASAP_Client

๋ชจ๋“  ํšŒ์˜์˜ ์‹œ์ž‘, ASAP

ํšŒ์˜์‹œ๊ฐ„์„ ์žก์„ ๋•Œ์˜ ๋น„์šฉ์„ ์ค„์ด๊ณ  ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ฐ”์ผ ์›น ์„œ๋น„์Šค

<aside> [ ์ผ์ƒ์ƒํ™œ์˜ ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•˜์—ฌ ๋ˆ„์ ์‚ฌ์šฉ์ž 500๋ช… ์œ ์น˜ ] ํŒ€ํ”„๋กœ์ ํŠธ์™€ ํ˜‘์—…์—์„œ ํŒ€ ๊ตฌ์„ฑ์›๋“ค์˜ ํšŒ์˜์‹œ๊ฐ„์„ ์„ ์ •ํ•˜๋Š”๋ฐ์— ๋ถˆํŽธํ•จ์„ ๋Š๊ปด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋„ˆ์‹ญ์„ ๊ฐ€์ง€๊ณ  ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ์ง€์†์ ์œผ๋กœ ์œ ์ € ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ UX๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์ง€๊ธˆ๊นŒ์ง€ ์•ฝ 500๋ช… ์˜ ๋ˆ„์  ์‚ฌ์šฉ์ž๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

</aside>

<aside> [ ์ˆ˜๋™ ๋ฐฐํฌ ํ”Œ๋กœ์šฐ ์ž๋™ํ™” ] github actions์˜ workflow๋ฅผ ํ†ตํ•ด CI๋‹จ๊ณ„์—์„œ Lint์™€ ๋นŒ๋“œํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐํฌ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถ”์—ˆ๊ณ  ๊ธฐ์กด์— vercel ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ณผ๊ธˆ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ•˜๋˜ ๋ฐฐํฌ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” workflow๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ๊ธฐ์กด์— ๋ฒˆ๊ฑฐ๋กœ์› ๋˜ ์ˆ˜๋™ ๋ฐฐํฌ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

</aside>

<aside> [ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ํ™˜๊ฒฝ ๋Œ€์‘ ] ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋Œ€์‘์„ ํ•˜์—ฌ ์œ ์ €์—๊ฒŒ ์ ์ ˆํ•œ ํ…์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค€ ํ›„ web share API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

</aside>

<aside> [ ๋ฐ˜์‘ํ˜• ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ ] ๊ธฐ์กด ๊ณ ์ •๋œ ์‚ฌ์ด์ฆˆ๋กœ ์ธํ•ด ํฐ ํ™”๋ฉด์˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ๋‚˜ ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์šฉ ์œ ์ €์˜ ๋ถˆํŽธ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์šฉํ•˜์—ฌ ๋ฐ˜์‘ํ˜• ์›น ์„œ๋น„์Šค๋กœ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

</aside>

๐ŸŽฏ Experience


๐Ÿง‘โ€๐Ÿซย 2024 ์นด์นด์˜ค ํ…Œํฌ ์บ ํผ์Šค WEB ์‹ค์Šต์ฝ”์น˜ (2024.06~ 2024.08)