Git Product home page Git Product logo

nine-cloud-front's Introduction

๐Ÿก Nine Cloud - FE

award/

๋‚˜์ธ ํด๋ผ์šฐ๋“œ ๋ธŒ๋กœ์…”

๋‚˜์ธ ํด๋ผ์šฐ๋“œ์€ AI ๊ฐ์ • ์†”๋ฃจ์…˜ ๊ทธ๋ฆผ์ผ๊ธฐ ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค.
ํ•˜๋ฃจ์˜ ์ผ๊ณผ๋ฅผ ๊ทธ๋ฆผ ๊ณผ ๊ธ€๋กœ ์ •๋ฆฌํ•˜์—ฌ ๊ทธ๋‚ ์˜ ๊ฐ์ • ์ด๋ชจํ‹ฐ์ฝ˜๊ณผ ํ•จ๊ป˜ ๊ธฐ๋กํ•ด๋ณด์„ธ์š”.


โ˜๏ธ Nine Cloud

cloud nine (ํ–‰๋ณต์˜ ์ ˆ์ •)์ด๋ผ๋Š” ์†๋‹ด์—์„œ ์ฐฉ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋ณตํ•œ ๊ฐ์ •์„ ๊ธฐ๋ก (cloud), 9๊ฐ€์ง€์˜ ๊ฐ์ • ํ‘œํ˜„ ์ด๋ผ๋Š” ์ ์—์„œ ์ €ํฌ ์„œ๋น„์Šค์— ์–ด์šธ๋ฆฌ๋Š” ์†๋‹ด ๊ฐ™์•„ ๋‚˜์ธํด ๋ผ์šฐ๋“œ๋ผ๊ณ  ์„ค์ •ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.


๊ตฌ๋ถ„ ๋งํฌ ๊ตฌ๋ถ„ ๋งํฌ
ํด๋ผ์šฐ๋“œ๋‚˜์ธ ์•„์ด์ฝ˜ Nine Cloud ๋…ธ์…˜ ์•„์ด์ฝ˜ ๋ธŒ๋กœ์Šˆ์–ด
๋ฆฌ์•กํŠธ ์•„์ด์ฝ˜ FE Github ๋…ธ์…˜ ์•„์ด์ฝ˜ ํŒ€ SA
๋…ธ๋“œjs ์•„์ด์ฝ˜ BE Github ํ”ผ๊ทธ๋งˆ ์•„์ด์ฝ˜ Figma

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป FrontEnd ๊ฐœ๋ฐœ

์ฃผ์ฒ ๋ฏผ ์†ก์ง€์šฐ ํ•œ๋•์šฉ
cheolminJOO nsong113 HyperQuanx

๐Ÿ’ป ์—ญํ•  ๋‹ด๋‹น

์ฃผ์ฒ ๋ฏผ - ๋‹ฌ๋ ฅ ๋””์ž์ธ ์ปค์Šคํ…€
- ์ผ๊ธฐ ์ƒ์„ธํŽ˜์ด์ง€, ์ˆ˜์ •ํŽ˜์ด์ง€
- ๋งˆ์ดํŽ˜์ด์ง€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ์ „๋ฐ˜์ ์ธ alert ์ฐฝ ๊ด€๋ฆฌ (sweetAlert2)
- ๋Œ“๊ธ€, ์ข‹์•„์š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ํŽ˜์ด์ง€ ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ (framer-motion)
- ๋ฐฐํฌ ๊ด€๋ฆฌ(vercel), ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ(AWS S3)
[email protected]
์†ก์ง€์šฐ - ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ (์Šฌ๋ผ์ด๋“œ ๋ฐ”, react-quill)
- ๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋Šฅ (canvas)
- gpt open api ์—ฐ๊ฒฐ ๋ฐ prompt ์ž‘์„ฑ
- ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€ (infinite-scroll)
- ๊ฐœ์ธ ๊ธ€ ๋ณด๊ธฐ ํ”ผ๋“œ (infinite-scroll)
- ๋ชจ๋‹ฌ (react-portal)
[email protected]
ํ•œ๋•์šฉ - Onboarding ํŽ˜์ด์ง€
- Sign in / Sign Up ํŽ˜์ด์ง€
- OAuth 2.0 Social Login (Kakao, Google, Naver)
- Kakao ๊ณต์œ ํ•˜๊ธฐ
- Socket.io๋ฅผ ์‚ฌ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…
- Axios intercepter
[email protected]

๐ŸŽˆ ์ฃผ์š”๊ธฐ๋Šฅ ์†Œ๊ฐœ

์†Œ์…œ ๋กœ๊ทธ์ธ ๋‹ฌ๋ ฅ ํŽ˜์ด์ง€ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ
์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฉ”์ธ ์ผ๊ธฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

AI open api ๋ฌดํ•œ์Šคํฌ๋กค ์ฑ„ํŒ…๋ฐฉ
AI ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฑ„ํŒ…๋ฐฉ

๐Ÿ—‚๏ธ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

์„œ๋น„์Šค์•„ํ‚คํ…์ฒ˜


โ›ณ๏ธ FE ๊ธฐ์ˆ  ์„ ์ •


๐ŸŒŸ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

TypeScript ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋ฉฐ, ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ์‚ฌ์ „์— ์ฐพ์•„๋‚ด๊ณ  ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  JavaScript ๋ฒ„๊ทธ์˜ 15%๊ฐ€ ์‚ฌ์ „์— TypeScript๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Axios ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ HTTP ์š”์ฒญ์„ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„๋Š” ์ธํ„ฐ์…‰ํ„ฐ(interceptor)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜
์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜์—ฌ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
React Router React Router๋Š” SPA(Single Page Application)์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€ ๋ฆฌ๋กœ๋“œ ์—†์ด URL์„ ๋ณ€๊ฒฝํ•˜๊ณ , ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งค๋„๋Ÿฌ์šด ํŽ˜์ด์ง€ ์ „ํ™˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ์— ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
React Query ๊ฐ„ํŽธํ•œ API ๋ฐ ์ž๋™ํ™”๋œ ์บ์‹ฑ, ์žฌ์‹œ๋„, ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์žฌ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐ
๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋ฉฐ, UI์™€ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์–ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Recoil Recoil์€ Redux์™€ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Redux์™€ ๋‹ค๋ฅด๊ฒŒ ์ง์ ‘ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜์—ฌ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Styled Components ๊ฐ ์ปดํฌ๋„ŒํŠธ์— ๊ณ ์œ ํ•œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šคํƒ€์ผ๋ง์ด ๋”์šฑ ๋ชจ๋“ˆํ™”๋˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ฃผ๋ฉฐ ๋™์  ์Šคํƒ€์ผ๋ง์— ์šฉ์ดํ•˜์—ฌ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Socket.io ์›น ์†Œ์ผ“(WebSocket)๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ์ข…๋ฅ˜์— ๋งž์ถฐ ํ˜ธํ™˜๋˜๋Š” ๊ธฐ์ˆ ์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Intersection observer ์ธํ”ผ๋‹ˆํ‹ฐ ์Šคํฌ๋กค ๊ตฌํ˜„์„ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค ์Šคํฌ๋กค๋งˆ๋‹ค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋ทฐํฌํŠธ์™€ ๋Œ€์ƒ ์š”์†Œ ๊ฐ„์˜ ๊ต์ฐจ ์—ฌ๋ถ€๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์Šคํฌ๋กค ์œ„์น˜์™€ ์ƒ๊ด€ ์—†์ด ์š”์†Œ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๋•Œ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด ์›น ํŽ˜์ด์ง€์˜ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
sweetAlert2 ๊ธฐ์กด์˜ ๋”ฑ๋”ฑํ•œ alert์ฐฝ ๋Œ€์‹ ์—, ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋“ค์–ด๊ฐ€๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ๋””์ž์ธ์˜ alert ์ฐฝ์„ ๋„์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค
๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ ์ปค์Šคํ…€์„ alert์ฐฝ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณธ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
browser-image-compression ์ด๋ฏธ์ง€๋ฅผ ์••์ถ•ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์••์ถ•์„ ์ง„ํ–‰ํ•˜๋ฉฐ ์ƒ๋‹นํ•œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ์••์ถ•๋ฅ ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋‹ฌ๋ ฅ ์›” ๋ณ€๊ฒฝ ์‹œ, ๋‹ฌ๋ ฅ ๋ฐ์ดํ„ฐ ํ‘œ๊ธฐ ์˜ค๋ฅ˜ ์—๋Ÿฌ [์ฒ ๋ฏผ] - ๋ฌธ์ œ์˜ ๋””ํ…Œ์ผ
์˜ค๋Š˜์ด 2024๋…„ 1์›” 4์ผ์ด๋ผ๋ฉด 2023๋…„์˜ ๋ชจ๋“  ๋‹ฌ๋ ฅ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ๋‹ฌ๋ ฅ์ด 4์ผ, ์ฆ‰ ์˜ค๋Š˜ ๋‚ ์งœ๊นŒ์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ
์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ค˜์•ผ ์ œ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ตฌํ˜„์ด ๋ ๊นŒ ์†์ฝ”๋”ฉ์œผ๋กœ ๋ฉ”๋ชจ์žฅ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ ์–ด๋†“๊ณ  ์ •๋ฆฌํ•œ ๋‹ค์Œ, ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
- ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์˜ค๋Š˜ ์ผ,์›”,๋…„๋„์˜ ๋ฐ์ดํ„ฐ์™€, ๋‹ฌ๋ ฅ์ด ๋ฐ”๋€” ๋•Œ ์ผ,์›”,๋…„๋„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜๋กœ ์ •๋ฆฌํ•˜๊ณ  ์ด ๋ณ€์ˆ˜๋“ค์„ ์ด์ „ ๋‹ฌ, ์ด๋ฒˆ ๋‹ฌ,์ดํ›„ ๋‹ฌ๋“ค์— ๋Œ€ํ•ด ๊ตฌ๋ถ„์„ ํ•  ์ˆ˜ ์žˆ๋Š” const์— ๋Œ€์ž…์‹œ์ผœ ๋งŒ๋“ค๊ณ , ์ด๋“ค์„ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์— ์ ์šฉํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ReactQuill ๋ณด์•ˆ ์—๋Ÿฌ [์ฒ ๋ฏผ] - ๋ฌธ์ œ์˜ ๋””ํ…Œ์ผ
ReactQuill์€ ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋ฉด ํƒœ๊ทธ๊ฐ€ ๊ฐ™์ด ๋ถ™์–ด์„œ ์ถœ๋ ฅ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ dangerouslySetInnerHTML์œผ ์„ธํŒ…์„ ํ•ด์•ผ ํƒœ๊ทธ๋Š” ๋น ์ง€๊ณ  ๊ธ€์ž๋“ค๋งŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ DOM์— HTML์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์ดํŠธ๊ฐ„ ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ(XSS)์— ์ทจ์•ฝํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ์•…์„ฑ ์œ ์ €๊ฐ€ ํŽ˜์ด์ง€์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋“ฑ ๋น„์ •์ƒ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ ๊ตฌ๋ฉ์ด ์ƒ๊น๋‹ˆ๋‹ค.
- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ
dangerouslySetInnerHTML์„ ์“ฐ์ง€ ์•Š๊ณ , ํƒœ๊ทธ ์—†์ด ๊ธ€์ž๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ? ๋ผ๊ณ  ๊ตฌ์ƒ์„ ํ•ด๋ดค๋Š”๋ฐ ๋”ฑํžˆ ๋ณด์ด์ง€ ์•Š์•„, dangerouslySetInnerHTML์€ ์“ฐ๋Š”๋ฐ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
- ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
DOMPurify๋ผ๋Š” HTML์„ sanitize ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ DOMPurifiy์— ๋‚ด๋ถ€ํ•จ์ˆ˜์ธ sanitize ์•ˆ์— ์ธ์ž๋กœ ์ถœ๋ ฅํ•  ๊ธ€์ž๋ฅผ ๋„ฃ์œผ๋ฉด XSS ๊ณต๊ฒฉ์„ ๋ง‰๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€ ์••์ถ• ํ›„ ์„œ๋ฒ„์— ์ „๋‹ฌ ํ•  ๋•Œ '๋‹ค์Œ'์„ ๋‘๋ฒˆ ํด๋ฆญํ•ด์•ผ ํ•˜๋Š” ์ด์Šˆ [์ง€์šฐ] - ๋ฌธ์ œ์˜ ๋””ํ…Œ์ผ
์ด๋ฏธ์ง€๋ฅผ ์••์ถ• ํ›„ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋‘๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ์ „๋‹ฌ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ํด๋ฆญ์—์„œ๋Š” ์••์ถ•์ด ๋˜๊ณ  ๋‘๋ฒˆ์งธ ํด๋ฆญ์—์„œ ์ „์†ก์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ
๋ฒ„ํŠผ์„ ๋‘๊ฐœ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์œ ์ €ํ•œํ…Œ ๋”๋ธ”ํด๋ฆญ ํ•ด๋‹ฌ๋ผ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์œ ์ €์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์ด ๊ฒƒ์„ ๋œ ๋ถˆํŽธ๊ฐ์œผ๋กœ ๋‹ค๊ฐ€์˜ค๊ฒŒ ์ „๋‹ฌํ• ๊นŒ ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ ‘์ ์œผ๋กœ ์œ ์ €์—๊ฒŒ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ถˆํŽธ๊ฐ์œผ๋กœ ์ดˆ๋ž˜ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ž๋™ํ™” ํ• ๊นŒ ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ๋•Œ ๋งˆ์šฐ์Šค๋ฅผ ๋•Œ๊ณ  1000ms ์žˆ๋‹ค๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€ ์••์ถ• ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” debounce๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋Šฅ์„ ํด๋ฆญํ•˜๊ธฐ ์œ„ํ•ด์„œ ์›€์ง์ด๋Š” ์†๋„๊ฐ€ ํ‰๊ท  1์ดˆ ๋ฏธ๋งŒ์ด๊ณ  ๊ทธ๋ฆผ ๊ทธ๋ฆฐ ํ›„ '๋‹ค์Œ'๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ๊นŒ์ง€ 1์ดˆ ์ด์ƒ์ด ๊ฑธ๋ฆฐ ๋‹ค๋Š” ๋ฐ์—์„œ ์ฐฉ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋กœ, '๋‹ค์Œ'๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ๋งŒ ๋ˆŒ๋Ÿฌ๋„ ์••์ถ•์ด ์ง„ํ–‰๋œ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ post์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌดํ•œ์œผ๋กœ api ์š”์ฒญ์ด ๊ฐ€๋Š” ๋ฌดํ•œ์Šคํฌ๋กœ [์ง€์šฐ] - ๋ฌธ์ œ์˜ ๋””ํ…Œ์ผ
'๋ฌดํ•œ์ •'์Šคํฌ๋กค์ด ๋˜์–ด ๊ณ„์† ํ†ต์‹  ์š”์ฒญ์„ ํ•˜๊ณ , ์ฒ˜์Œ ์š”์ฒญ์„ ํ•˜๊ณ  ๋” ์š”์ฒญ์„ ์•ˆํ•˜๊ธฐ๋„ ํ•˜๊ณ , ํ˜น์€ Null๋กœ ์š”์ฒญ์„ ํ•˜๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ
1. InfiniteScroll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  useInfiniteQuey๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋กœ๋Š” ๋ฌดํ•œ get ์š”์ฒญ์ด ๋ณด๋‚ด์กŒ์Šต๋‹ˆ๋‹ค.
2. InfiniteScoll์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  useInfiniateQuery์˜ getNextPageParam๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋กœ๋Š” ๋ฐ”๋‹ฅ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ๋Š”์ง€ ์ฒซ๋ฒˆ์งธ ๋กœ๋”ฉ๋งŒ ํ•˜๊ณ  ๋‘๋ฒˆ์งธ ํŽ˜์ด์ง€๋Š” ๋กœ๋”ฉ์„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
3. api์˜ return ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. return์—์„œ data์ด์™ธ์—๋„ nextPage์™€ isLast๋ฅผ ๋ฆฌํ„ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ getNextPageParam์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
api๋ถ€๋ถ„์—์„œ data์ด์™ธ์—๋„ nextPage์™€ isLast๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ useInfiniteQuery์˜ getNextPageParam๋ถ€๋ถ„์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. react-intersection-observer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ด€์ฐฐํ•˜๋Š” ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ref๋กœ ์„ค์ •ํ•œ ํ›„ ํ•ด๋‹นํ•˜๋Š ๊ฐ์ฒด๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋ฉด inView๋ฅผ true๋กœ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. ์ €์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— div๋ฅผ ๋งŒ๋“ค๊ณ  color๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. useInfiniteQuery๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŠนํžˆ fetchNextPage๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ inView๊ฐ€ true์ด๊ณ  hasNextPage๊ฐ€ true์ด๋ฉด fetchNextPage๋ฅผ ํ•˜๋„๋ก useEffect์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๊ด€๋ จ [๋•์šฉ] - ๋ฌธ์ œ -
1. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„๊ณผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ„์‚ฐํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ๋‹ค๋ฆ„
2. ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๋กœ์ง ์ž‘์„ฑ ์ค‘์— ๋ชจ๋“  ์—๋Ÿฌ ์‚ฌํ•ญ์—์„œ Token ์žฌ๋ฐœ๊ธ‰์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฒ„๋ฆฌ๋Š” ์˜ค๋ฅ˜์™€ ์—๋Ÿฌ์ฝ”๋“œ๊ฐ€ Server์™€ ์•ˆ ๋งž๋Š” ์˜ค๋ฅ˜.
- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ -
1. ์ฒ˜์Œ์—๋Š” Server์—์„œ empireTime(๋งŒ๋ฃŒ์‹œ๊ฐ„)์ด๋ผ๋Š” ๊ฐ’์„ ๋ณด๋‚ด์ฃผ๋„๋ก ์š”์ฒญํ•˜์˜€์Šต๋‹ˆ๋‹ค. Server์—์„œ๋Š” ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด Unix time์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ Front์—์„œ ํ˜„์žฌ์‹œ๊ฐ„์„ Unix time์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋กœ์ง์„ ๋งŒ๋“ค๊ณ  (๋งŒ๋ฃŒ์‹œ๊ฐ„ - ํ˜„์žฌ์‹œ๊ฐ„)์œผ๋กœ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ณ  setTimeout()์„ ์‚ฌ์šฉํ•ด์„œ Front์—์„œ ์‹œ๊ฐ„์„ ์žฌ์„œ ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ์ž๋™์ ์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์„ ํ•˜๋„๋ก ๋กœ์ง์„ ์ƒ๊ฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„๊ณผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ„์‚ฐํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๊ณ  ์ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ† ํฐ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ๋ถˆํ•„์š”ํ•œ ์„œ๋ฒ„์š”์ฒญ์ด ๊ณ„์† ์ƒ๊ธฐ๋ฉฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ํ”„๋ก ํŠธ์—์„œ ์ €์žฅํ•˜๋ฉด ๋ณด์•ˆ์—๋„ ์ทจ์•ฝํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ด ๋ฐฉ๋ฒ•์„ ๋ฒ„๋ฆฌ๊ณ  ๋งŒ๋ฃŒ๊ฐ€ ๋œ ์ดํ›„์— ์„œ๋ฒ„ ์š”์ฒญ์„ ํ•œ๋‹ค๋ฉด ์ž๋™์ ์œผ๋กœ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ URL๋กœ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด Axios intercepter๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
2. ์ผ๋‹จ ์‹คํ—˜์„ ์œ„ํ•ด Token ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๊ทน๋‹จ์ ์œผ๋กœ ์งง๊ฒŒ ์„ค์ •ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค. Token์ด ๋งŒ๋ฃŒ๋œ๋‹ค๋ฉด ๋Œ€์ฒด์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ 401๋ฒˆ์ด๋‚˜ 419๋ฒˆ ์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค๋Š” ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ Server์™€ ์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ๋งž์ถฐ๋ณด์•˜์Šต๋‹ˆ๋‹ค. 401๋ฒˆ์€ ๋‹ค๋ฅธ๊ณณ์—์„œ๋„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์–˜๊ธฐ๋ฅผ ๋“ฃ๊ณ  Token ๋งŒ๋ฃŒ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ 419๋ฒˆ์œผ๋กœ ํ†ต์ผํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ์…‰ํ„ฐ ๋กœ์ง์—๋Š” 419๋ฒˆ ์—๋Ÿฌ์ฝ”๋“œ๊ฐ€ ๋œฌ๋‹ค๋ฉด /token์œผ๋กœ ์ด๋™๋˜๋„๋ก ์„ค์ •ํ•ด์ฃผ๊ณ  ํ—ค๋”์— RefreshToken์„ ๋‹ด์•„์„œ Server์— ํ† ํฐ ์žฌ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๊ฒฐ๊ณผ -
ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด 419๋ฒˆ ์—๋Ÿฌ์ฝ”๋“œ๊ฐ€ ๋œจ๊ณ  ์ž๋™์œผ๋กœ /token์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ RefreshToken์„ ๋Œ€์กฐํ•œ ํ›„ ์ƒˆ๋กœ์šด AccessToken์„ ๋ฐœ๊ธ‰ํ•ด์คŒ.
Socket.io [๋•์šฉ] - ๋ฌธ์ œ -

์„œ๋ฒ„์—์„œ ์ง€์ •ํ•ด์ค€ URL๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋Š” ํ˜„์ƒ.



์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ด์ค€ URL๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์ด ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.



๋ถ„๋ช… ์—”๋“œํฌ์ธํŠธ๋ฅผ /community/chat/socket.io๋กœ ์„ค์ •ํ•ด๋†“์•˜๋Š”๋ฐ ๋ง‰์ƒ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ๋ณด๋ฉด ์„ค์ •ํ•œ ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ธ๋ ฅ -


ํ˜น์‹œ path ์„ค์ •์„ ๋”ฐ๋กœ ํ•ด์ค€๋‹ค๋ฉด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„๊นŒ ํ•ด์„œ ๊ธฐ์กด์— ํ•˜๋˜ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ path ์„ค์ •์„ ์ง‘์–ด๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

- ๊ฒฐ๊ณผ -

๊ฒฐ๊ตญ Server์™€ ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•˜์˜€๊ณ  ์ฑ„ํŒ… ๊ธฐ๋Šฅ๊นŒ์ง€๋„ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ์ตœ์ ํ™”

1. ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™”
react-icons๋Š” ์ข…๋ฅ˜๋ณ„๋กœ jsํŒŒ์ผ์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ํ•˜๋‚˜์˜ ์•„์ด์ฝ˜์„ ์‹คํ–‰ํ•˜๋ฉด ๊ทธ ์•„์ด์ฝ˜์ด ์†ํ•œ js ํŒŒ์ผ์ด ์‹คํ–‰๋ผ์„œ ๊ด€๋ จ ์—†๋Š” ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ๋“ค๋„ ํ•จ๊ป˜ ๋นŒ๋”ฉ ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @react-icons/all-files๋ฅผ ์„ค์น˜ํ–ˆ๊ณ , ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„์ด์ฝ˜๋งˆ๋‹ค js ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๋นŒ๋”ฉ ์‹œ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ์‹คํ–‰ ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
2. React.lazy๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ผ์šฐํŒ… code splitting / webPํ™•์žฅ์ž๋กœ ๋ณ€๊ฒฝ
- React.lazy๋Š” React์—์„œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์ž‘์€ ์ฒญํฌ(chunk)๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ์ฒญํฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์—ฌ ๋” ๋น ๋ฅธ ๋กœ๋”ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

- WebP ์ด๋ฏธ์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JPEG ๋ฐ PNG๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ์••์ถ•์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ๋†’์€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•ด webP๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.
3. Profiler๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” / compressor.js๋กœ ์ด๋ฏธ์ง€ ์••์ถ•
- ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ธ€์“ฐ๋Š” ๊ณณ์ด๋‚˜ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๋ถ€๋ถ„์€ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์ด๊ฑฐ๋‚˜ ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ๋งˆ๋‹ค ํ—ค๋”๋‚˜ ๋ชจ๋“  ๋ ˆ์ด์•„์›ƒ์ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ React.memo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์บ์‹ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

- ๋งˆ์ง€๋ง‰์œผ๋กœ compressor.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 0.02mB๋กœ ์••์ถ• ํ›„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋‹ˆ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ์‹œ๊ฐ„์ด ์ตœ๋Œ€ 50% (6ms->3ms)๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—ฃ๏ธ ์œ ์ € ํ”ผ๋“œ๋ฐฑ & ๋ฐ˜์˜

ํŽ˜์ด์ง€ ์ด๋™ ๊ฐœ์„  [์ฒ ๋ฏผ] - ๋ฌธ์ œ -
๋ฉ”์ธํŽ˜์ด์ง€์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€์—์„œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™์ด ๋˜๋Š”๋ฐ, ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋ฌด์กฐ๊ฑด ๋ฉ”์ธ์œผ๋กœ ๊ฐ€์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€์—์„œ ์ด๋™ํ•œ ์‚ฌ์šฉ์ž๋Š”
๋‹ค์‹œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ํด๋ฆญํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

- ํ•ด๊ฒฐ -
boolean ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ „์—ญ state๋ฅผ ๋งŒ๋“ค์–ด, ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™๋˜๋ฉด ๊ฐ’์„ false๋กœ ๋ฐ”๊พธ๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€์—์„œ ์ด๋™๋˜๋ฉด ๊ฐ’์„ true๋กœ ๋ฐ”๊พธ๋Š” ๋กœ์ง์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค
์ƒ์„ธํŽ˜์ด์ง€์—์„œ ๋งŒ์•ฝ ์ด ๊ฐ’์ด true๋ฉด ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€๋กœ ๊ฐ€๊ฒŒ๋” ํ•˜๊ณ , false๋ฉด ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๊ฐ€๊ฒŒ๋” ๋กœ์ง์„ ์žฌ๊ตฌ์„ฑ ํ–ˆ์Šต๋‹ˆ๋‹ค.
input range ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„  [์ง€์šฐ] - ๋ฌธ์ œ -
input range๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ๊ฐ์ •์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด input range์˜ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์–ด์–ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆํŽธ๊ฐ์„ ์ดˆ๋ž˜

- ํ•ด๊ฒฐ -
input range์˜ value๊ฐ’์„ ์ „์—ญ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ recoil์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋‹ˆ ํŽ˜์ด์ง€ ์ด๋™ ํ›„ ๋‹ค์‹œ ๋Œ์•„์™€๋„ value๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์นด์นด์˜ค ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ [๋•์šฉ] - ํ”ผ๋“œ๋ฐฑ -
"๋‚˜์˜ ๊ฐ์ • ์ผ๊ธฐ๋ฅผ ์ธ์Šคํƒ€๋‚˜ ์นด์นด์˜ค๋กœ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค"

- ํ•ด๊ฒฐ -




Kakao develop์—์„œ ๊ณต์œ ํ•˜๊ธฐ๋ฅผ ์œ„ํ•œ ์„ธํŒ…์„ ํ•ด์ฃผ์—ˆ๊ณ  ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ผ ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค.


nine-cloud-front's People

Contributors

cheolminjoo avatar hyperquanx avatar nsong113 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.