๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ด๋…ธ๋ฒ ์ด์…˜์บ ํ”„/ํ”„๋กœ์ ํŠธ

์‹ค์ „ ํ”„๋กœ์ ํŠธ - ๋‚ด๋ˆ๋‚ด์—ฌ

๊ด‘๊ณ  ์—†๋Š” ์•Œ๋งน์ด๋กœ ๊ฐ€๋“ ์ฐฌ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์œ ์ €๋“ค์ด ๋‚ด ๋ˆ์œผ๋กœ ์—ฌํ–‰ํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๋‚ด๋ˆ๋‚ด์—ฌ๋ฅผ ์จ๋ณด์„ธ์š”!

๊ด‘๊ณ  ์—†๋Š” ์—ฌํ–‰ ํ›„๊ธฐ ๋‚ด๋ˆ๋‚ด์—ฌ๋กœ ๋– ๋‚˜๊ธฐ โœˆ๏ธ

Back-End Github ๐Ÿ‘€

Front-End Github ๐Ÿ‘€

๐Ÿง‘๐Ÿป‍๐Ÿ’ป๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ํŒ€์› ์†Œ๊ฐœ

 

์„œ๋น„์Šค ๊ฐœ์š”

 

๋‚ด ๋ˆ๋‚ด๊ณ  ๋‚ด๊ฐ€ ์—ฌํ–‰ํ•˜๋Š”, ์ง„์ •์„ฑ์žˆ๋Š” ๊ตญ๋‚ด ๋‹จ๊ธฐ ์—ฌํ–‰ ์ •๋ณด ๊ณต์œ  ํ”Œ๋žซํผ ์„œ๋น„์Šค

 

์„œ๋น„์Šค ์•„ํ‚คํ…์ณ 

Front-end

node.js, ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ฅธ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋™์  ์›น ํ˜ธ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ EC2์™€, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ์„œ์˜ ์—ญํ• ์„ ํ•˜๋ฉฐ ์„œ๋ฒ„๊ฐ€ SSL ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ์—†๋Š” nginx๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด https ํ™˜๊ฒฝ์œผ๋กœ ๋Š๊น€์—†๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งŽ์€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฐ€์ง„ PM2๋ฅผ ํ†ตํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ํ•˜์˜€๊ณ , ๋ฆฌ์•กํŠธ ์ƒํƒœ๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•œ Redux-toolkit์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ์ง์ ‘ ์ด๋ฏธ์ง€ ์ €์žฅ์„ ์œ„ํ•ด S3๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€๋Š” ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์ด ๋†’๊ณ  ์—๋Ÿฌ ์ฐพ๊ธฐ์— ์šฉ์ดํ•œ Axios๋กœ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•˜์˜€๊ณ  ์‚ฌ์šฉ์ž ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด Server-sent-events๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Back-end

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” AWS RDS์˜ My SQL์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , ์ด๋ฏธ์ง€ ๋ฐ ๋™์˜์ƒ์€ S3์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. JWT๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ•˜๊ณ , ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ์˜ ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ๊ณผ ์„œ๋ฒ„ ์ค‘๋‹จ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค ์ด์šฉ์„ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ๋ง‰๊ณ ์ž ๊นƒํ—ˆ๋ธŒ ์•ก์…˜์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋นŒ๋“œ ๋œ ํŒŒ์ผ์„ S3์— ์—…๋กœ๋“œ ํ•œ ํ›„, ์ฝ”๋“œ๋””ํ”Œ๋กœ์ด์—์„œ ์‚ฌ์ „์— ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ EC2 ์ž๋™ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

+ ์Šคํ”„๋ง๋ถ€ํŠธ ์„ค๋ช… + Server-sent-event ์„ค๋ช… ๋ง๋ถ™์ด๊ธฐ
์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋„ค์ด๋ฒ„์™€ ์นด์นด์˜ค ํ†ก ์˜คํ”ˆ API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ—‚ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ‘๐Ÿป ๊ด€์‹ฌ์‚ฌ ์„ ํƒ & ์ถ”์ฒœ ํŽ˜์ด์ง€

  • ํšŒ์› ๊ฐ€์ž… ํ›„ ์‚ฌ์šฉ์ž๋Š” ์—ฌํ–‰ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์„ธ ๊ฐœ๊นŒ์ง€ ์„ ํƒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ถ”์ฒœ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์—ฌํ–‰ ๊ด€์‹ฌ์‚ฌ ํƒœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ฒœ ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๋ธ”๋กœ๊ทธ ํ˜•์‹์˜ ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก ํŽ˜์ด์ง€

  • ํ˜•์‹์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๋Š” ์ž์œ ๋กœ์šด ํ˜•ํƒœ์˜ ์—ฌํ–‰ ํ›„๊ธฐ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๋„๋ก TOAST UI Editor๋ฅผ ์ด์šฉํ•ด ๋ธ”๋กœ๊ทธ ํ˜•์‹์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ—บ๏ธ ์—ฌํ–‰ ๊ฒฝ๋กœ (Kakao map API)

  • ์นด์นด์˜ค API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ–ˆ๋˜ ์žฅ์†Œ์— ๋งˆ์ปค๋ฅผ ์ฐ์–ด ์ถœ๋ฐœ์ง€-๋„์ฐฉ์ง€์™€ ํด๋ฆฌ๋ผ์ธ์„ ์ด์šฉํ•œ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ๊ฒŒ์‹œ๊ธ€ ๋‚ด์— ์—ฌํ–‰์ฝ”์Šค๋กœ ์ €์žฅ

๐Ÿป ๋‚˜์˜ ์ผ์ •

  • ์—ฌํ–‰ ์ „ ๋‚˜๋งŒ์˜ ์—ฌํ–‰ ์ผ์ •์„ ์ž‘์„ฑ ํ•˜๊ณ , ์ผ์ • ์™„๋ฃŒ์™€ ์ทจ์†Œ ๋ฒ„ํŠผ์œผ๋กœ ์ง„ํ–‰ ์ค‘์ธ ์ผ์ •๊ณผ ์™„๋ฃŒ๋œ ์ผ์ •์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌ ํ•˜๋ฉฐ ํ•„์š” ์‹œ ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฅ ์Šคํ† ๋ฆฌ ๊ธฐ๋Šฅ

  • ๋‚˜๋งŒ ๋ณด๊ธฐ ์•„๊นŒ์šด ์—ฌํ–‰์˜ ์ถ”์–ต๋“ค์„ ์˜์ƒ ๊ณต์œ ๋ฅผ ํ†ตํ•ด ๋‚ด๋ˆ๋‚ด์—ฌ ํšŒ์›๋“ค๊ณผ ํ•จ๊ป˜ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. User ๋ณธ์ธ์ด ์ƒ์‹œ ์‚ญ์ œ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋งค์ผ ํŠน์ • ์‹œ๊ฐ„์— ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ญ์ œ ๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽ‰ ์•Œ๋ฆผ ๊ธฐ๋Šฅ

  • Server Sent Events ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€์ด ์ž‘์„ฑ ๋˜์—ˆ์„ ๋•Œ, ‘์ข‹์•„์š”’๊ฐ€ ๋ˆŒ๋ ธ์„ ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์˜ ์ผ์ •์ด ์ž„๋ฐ• ํ•˜์˜€์„ ๋•Œ ๋ฆฌ๋งˆ์ธ๋” ์•Œ๋ฆผ์„ ์„œ๋น„์Šคํ•˜๊ณ , ์ง์ ‘ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์•Œ๋ฆผ์„ ์—ด๋žŒํ•˜๊ณ  ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ฎ์‹ ๊ณ  ๊ธฐ๋Šฅ

  • ๊ด‘๊ณ ์„ฑ์ด ๋ฐฐ์ œ๋œ ์ง„์งœ ์—ฌํ–‰ ํ›„๊ธฐ๋ฅผ ์ง€ํ–ฅํ•˜๋Š” ๋‚ด๋ˆ๋‚ด์—ฌ ์„œ๋น„์Šค์˜ ๊ฐ€์น˜๊ด€๊ณผ ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๋“ค์ด ๊ฒŒ์‹œ๋ฌผ์„ ํ•ด๋‹น ์‚ฌ์œ ์— ๋”ฐ๋ผ ์ง์ ‘ ์‹ ๊ณ  ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ ๊ณ  ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„์  ์‹ ๊ณ  50๊ฐœ ์ด์ƒ์ด๋ฉด ๊ฒŒ์‹œ๊ธ€์ด ์ž๋™ ์‚ญ์ œ ๋˜๋„๋ก ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


Truble-Shooting : Front-end

 

1.  S3 Client-side Image ์—…๋กœ๋“œ

 

๋ฌธ์ œ ์ƒํ™ฉ

AWS S3๋ฅผ ์ด์šฉํ•ด client side ์—์„œ image๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์™€์ค‘ ๋ฒ„ํ‚ท์—๋Š” ๊ฐ์ฒด๊ฐ€ ์—…๋กœ๋“œ ๋˜๋‚˜ Image URL๋กœ ํด๋ผ์ด์–ธํŠธ ๋‹จ์— ๋ฐ˜ํ™˜ ๋  ๋•Œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ด๋ฏธ์ง€๊ฐ€ ๋œจ์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ์Œ.

 

๋ฌธ์ œ ์›์ธ 

ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜๋œ Image-URL๊ณผ ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ Image-URL์ด ๋‹ฌ๋ผ ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด์ง€ ์•Š์•˜๋‹ค.


ํ•ด๊ฒฐ ๊ณผ์ •

  1. ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ ์ „ ์ด๋ฏธ์ง€์˜ ํŒŒ์ผ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก new Date ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ด๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ณผ ์ •์—์„œ ํŒŒ์ผ ์ด๋ฆ„์— ํŠน์ˆ˜๋ฌธ์ž์ธ ‘+ ์™€ : ‘ ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ์ด ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ URL์ด ๋ฒ„ํ‚ท์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚˜์˜ค๋ฉด์„œ %๋กœ ์น˜ํ™˜ ๋˜์—ˆ๋‹ค.
  2. ํŒŒ์ผ ์ด๋ฆ„์—์„œ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ํŒŒ์ผ ์ด๋ฆ„์„ ํ›„๊ฐ€๊ณต ํ•ด์ฃผ์—ˆ๋‹ค.

 

2. ์„ฑ๋Šฅ ๊ฐœ์„ 

 

๋ฌธ์ œ ์ƒํ™ฉ

๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์•„์ง€๋ฉด์„œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ ค์กŒ๋‹ค.

 

๋ฌธ์ œ ์›์ธ

ํ•œ๋ฒˆ์— ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉฐ, ๋งŽ์€ ์–‘์˜ ์‚ฌ์ง„๊ณผ ๋™์–‘์ƒ ๋“ฑ์œผ๋กœ ๋กœ๋”ฉ์‹œ๊ฐ„์ด ์ง€์—ฐ๋˜์—ˆ๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ

  1. ์ด๋ฏธ์ง€์— loading = "lazy" ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ ์žˆ์ง€ ์•Š์€ ๋ถ€๋ถ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ๋‚ญ๋น„๋ฅผ ์ค„์ž„.
  2. Lazy-load๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ 'intersection-observerAPI' ๋ฅผ ์ด์šฉํ•ด ๋ฌดํ•œ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋งŒํผ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•˜์˜€๋‹ค.
  3. ์ด๋ฏธ์ง€๋ฅผ S3์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ๋•Œ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ์••์ถ•ํ•˜๋Š” browser-image-compression ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™” ํ•˜์˜€๋‹ค.
  4. ํฐํŠธ๊ฐ€ ํŒจ์น˜ ๋˜๊ธฐ ์ „์— ํ…์ŠคํŠธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” font-display๋ฅผ swap์œผ๋กœ ์„ค์ • ํ•ด ์ฃผ์—ˆ๋‹ค.

 

3. Kakao map ๋ฒ”์œ„ ์žฌ์„ค์ •

 

๋ฌธ์ œ ์ƒํ™ฉ 

๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ์กฐํšŒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅํ•œ ์ง€๋„ ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•จ.

 

๋ฌธ์ œ ์›์ธ 

์นด์นด์˜ค ๋งต์—์„œ ์ œ๊ณตํ•˜๋Š” API ๋งต ์ค‘์‹ฌ์€ ๊ณ ์ •๋˜์–ด์žˆ๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ 

์œ ์ €๊ฐ€ ๋งต์„ ์‚ฌ์šฉ ํ•  ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŒŒ์•…ํ•ด ์ ์šฉํ–ˆ์œผ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์กŒ๋‹ค.

์นด์นด์˜ค ๋งต์—์„œ ์ œ๊ณตํ•˜๋Š” ์ง€๋„ ๋ฒ”์œ„ ์žฌ์„ค์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ž„.

useEffect๋ฅผ ํ™œ์šฉํ•ด ์˜์กด์„ฑ ๋ฐฐ์—ด์— GET ์š”์ฒญ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€, ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ๋ฒ”์œ„ ์žฌ ์„ค์ •์„ ์‹คํ–‰ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ„ํ—์ ์œผ๋กœ ์ง€๋„๊ฐ€ ๋กœ๋”ฉ ๋˜๋Š” ์†๋„๋ณด๋‹ค ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ ๋ฒ”์œ„ ์žฌ ์„ค์ •์ด ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

setTimeout์„ ์ด์šฉํ•ด 50ms ํ›„ ์ง€๋„ ๋ฒ”์œ„ ์žฌ์„ค์ •์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์—ˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์šฉ ์ „ ๋งต ๋ Œ๋”๋ง ๋ถ€๋ถ„

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์šฉ ํ›„ ๋งต ๋ Œ๋”๋ง ๋ถ€๋ถ„

useEffect, setTimeout ํ™œ์šฉํ•ด ์ง€๋„ ์ค‘์‹ฌ ๋ณ€๊ฒฝํ•˜๊ธฐ

์ง€๋„ ์—ฌํ–‰๊ฒฝ๋กœ ๋ฐ”๋กœ ๋ณด์ด๊ฒŒ ๊ตฌํ˜„

4. Access token ์žฌ๋ฐœ๊ธ‰

 

๋ฌธ์ œ ์ƒํ™ฉ

Access token์ด ๋งŒ๋ฃŒ ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด์šฉ์‹œ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์ด์šฉ์— ์ œํ•œ์ด ์žˆ์Œ.

 

๋ฌธ์ œ ์›์ธ

Access token์˜ ์œ ํšจ์‹œ๊ฐ„์ด 30๋ถ„์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ

 

ํ•ด๊ฒฐ ๊ณผ์ •

  1. Access token์˜ ์œ ํšจ์‹œ๊ฐ„์„ ๋Š˜๋ ค์•ผ ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์—ˆ์œผ๋‚˜ ๊ถ๊ทน์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ํŒ๋‹จ ํ•˜์— refresh token์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด access token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐ์ •.
  2. Cookie์— ์ €์žฅ๋˜์–ด์žˆ๋Š” Access token์ด ๋กœ๊ทธ์ธ 30๋ถ„ ํ›„ ๋งŒ๋ฃŒ ๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ๋Š” 29๋ถ„์ดํ›„์— ์‚ญ์ œ ๋˜๋„๋ก ์„ธํŒ…ํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ† ํฐ์„ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ค๊ณ  ์žˆ์„ ์‹œ๊ฐ„์„ ์—†๊ฒŒ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค ์ด์šฉ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
  3. 29๋ถ„ ํ›„ cookie๊ฐ€ ์‚ญ์ œ ๋˜๋ฉด useEffect ์•ˆ์— ์žˆ๋˜ setInterval ํ•จ์ˆ˜๊ฐ€ ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฐ์‹œํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์„ ๋„ฃ์–ด ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ ํ•ด ์ฃผ์—ˆ๋‹ค.

์ฟ ํ‚ค ์œ ํšจ์‹œ๊ฐ„์„ 29๋ถ„์œผ๋กœ ์„ธํŒ… ํ•˜๊ธฐ

๋กœ๊ทธ์ธ ์ƒํƒœ์ผ ๋•Œ, ์ฟ ํ‚ค๊ฐ€ ์—†์œผ๋ฉด(๋กœ๊ทธ์ธ 29๋ถ„ ๋’ค) reToken ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰

ํ† ํฐ ์š”์ฒญ์ด ์ž˜ ๊ฐ€๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด retoken ํ•จ์ˆ˜ ์‹คํ–‰์‹œ alert ์ฐฝ ๋„์›Œ์คŒ

 

ํŠœํ† ๋ฆฌ์–ผ ํŽ˜์ด์ง€

 

 

๊ฐœ์„  ํ•  ๊ฒƒ & ๋ณด์™„ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ

 

์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•

AWS CLOUDFRONT + LAMBDA@EDGE๋ฅผ ํ™œ์šฉํ•œ IMAGE RESIZING

lighthouse ์ง€ํ‘œ์— ์„ฑ๋Šฅ์„ ๋ณด๋ฉด browser-image-compression ๋งŒ์œผ๋กœ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋งŒ์กฑํ• ๋งŒ ํ•˜๋‹ค๊ณ  ๋А๊ปด์ง€์ง€ ์•Š์•„ 

CloudFront ์™€ Lambda@EDGE๋ฅผ ํ™œ์šฉํ•œ Image resizing ์„ ์‹œ๋„ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.


๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ์ตœ์ ํ™”
๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๋ถ€๋ถ„์—์„œ ์ง€๋„๊ฐ€ ์—๋””ํ„ฐ๋ฅผ ๊ฐ€๋ ค์„œ ๊ธ€ ์ž‘์„ฑ์ด ๋ถˆํŽธํ–ˆ๋˜ ์ ์„ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ˆ˜์ •ํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์— ์ž˜ ๋งž๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

 

 

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

์‚ฌ์šฉ๊ธฐ์ˆ 
๊ธฐ์ˆ  ์„ค๋ช…
CI/CD
GitAction/CodeDeploy๋ฅผ ์‚ฌ์šฉ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„๋ฅผ ์ž๋™ํ™” ํ•˜์—ฌ FE์™€ BE์˜ ๋น ๋ฅธ ํ˜‘์—…์œผ๋กœ ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ์„ ์‹œ๋„ํ•˜์—ฌ ์„œ๋ฒ„ ์ค‘๋‹จ ์‹œ, ๊ณ ๊ฐ์ด ์„œ๋น„์Šค ์ด์šฉ์— ์ฐจ์งˆ์ด ์—†๋„๋ก ์ž๋™ ๋ฐฐํฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
NGINX
๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ๋งค๋ฒˆ ๋™์ผํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ํ•„์š” ์—†์ด ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•˜๋Š” ์บ์‹œ, ํŽธ๋ฆฌํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ, Let's encrypt๋ฅผ ์ด์šฉํ•œ ๋ฌด๋ฃŒ,์‰ฌ์šด ๋ฐœ๊ธ‰์˜ ์ด์ ์ด ์žˆ๋Š” Https๋ฅผ ์ ์šฉ ํ–ˆ์Šต๋‹ˆ๋‹ค.
SSE
๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ธ ์•Œ๋žŒ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์— ์žˆ์–ด ์›น์†Œ์ผ“๋ณด๋‹ค ํ•ธ๋“œ ์…ฐ์ดํฌ ๋ฐœ์ƒ๋Ÿ‰์ด ์ ์–ด ํ•ฉ๋ฆฌ์  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ UX์  ์ธก๋ฉด์—์„œ ์ž์‹ ์˜ ๊ฒŒ์‹œ๊ธ€์— ๋‹ค๋ฅธ ์œ ์ €์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐœ์ƒ ์‹œ, ๋‚˜์˜ ์ผ์ •์ด ๋‹ค๊ฐ€์˜ฌ ๋•Œ ์‹ค์‹œ๊ฐ„ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ฃผ์–ด ํ™œ๋ฐœํ•œ ์‚ฌ์ดํŠธ ์ด์šฉ์„ ์œ ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
Flyway
๋ฐฐํฌ ํ›„ ์œ ์ € ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ DB๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ ๊ธฐ์กด mysql DB๋ฅผ dropํ•˜์ง€ ์•Š๊ณ , ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
react-intersection-observer
์ปจํ…์ธ ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ๋ถˆ๋Ÿฌ์™€์„œ ํ‘œ์‹œ ํ•ด์ฃผ์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์กŒ์„ ๋•Œ ์ปจํ…์ธ ๋ฅผ ํšจ์œจ์  ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ์— ๋ฌดํ•œ์Šคํฌ๋กค์„ ์ ์šฉ ํ–ˆ์Šต๋‹ˆ๋‹ค.
Redux-toolkit
์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ณ , ์ „์—ญ์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Redux๋ณด๋‹ค ์ฝ”๋“œ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
SCSS
ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์กŒ์„ ๋•Œ CSS๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.
Axios
response timeout (fetch์—๋Š” ์—†๋Š” ๊ธฐ๋Šฅ) ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋ฉฐ Promise ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์ด fetch๋ณด๋‹ค ๋›ฐ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์›น ์•ฑ์„ ์—ผ๋‘ํ•œ ๋‚ด๋ˆ๋‚ด์—ฌ ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
EC2
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •๋ณด๋ฅผ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด๋Š” ๋™์  ํŽ˜์ด์ง€ ๊ตฌํ˜„์„ ์œ„ํ•˜์—ฌ ๋™์  ์›น ํ˜ธ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ EC2๋กœ Front-end ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
browser-image-compression
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๋‹จ ์„œ๋ฒ„๋กœ ์ €์žฅ๋˜๋Š” ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

 

 

 


 

 

Nginx ์‚ฌ์šฉ ๋กœ๋“œ๋งต

ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์‚ฌ์ด์— ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ๋ฒ„์Šคํ”„๋ก์‹œ ์„œ๋ฒ„์— ์š”์ฒญ์„ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ๋’ท๋‹จ์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•ด ๋ณด์•ˆ์ด ํ•œ์ธต ๊ฐ•ํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์— SSL์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด HTTPS๋ฅผ ์ ์šฉํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. WAS์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€๋กœ ๋Š˜์–ด๋‚˜๋„ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์„ ์ถ”๊ฐ€๋กœ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ  ์„œ๋ฒ„๊ฐ€ SSL ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ๋„ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” Nginx๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ„๋‹จํ•œ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰, Nginx ํ™˜๊ฒฝ ์„ค์ •์„ ์œ„ํ•ด Certbot์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  : ๋ณด์•ˆ์„ฑ์ด HTTP๋ณด๋‹ค ๋†’์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ์‹ฌํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐ๋„ท์—์„œ ๋‘ ์ฐธ์—ฌ์ž ๊ฐ„์˜ ํ†ต์‹ ์„ ๋ณดํ˜ธํ•˜๊ณ , ์ •๋ณด๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š๊ณ  ๋ชฉ์ ์ง€๊นŒ์ง€ ๋„๋‹ฌํ•˜๊ฒŒ ํ•˜๋ฉฐ ์›น์‚ฌ์ดํŠธ์˜ ์ง„์œ„ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

SSE 

UX์  ์ธก๋ฉด์—์„œ ์ž์‹ ์˜ ๊ฒŒ์‹œ๊ธ€์— ๋‹ค๋ฅธ ์œ ์ €์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐœ์ƒ ์‹œ, ๋‚˜์˜ ์ผ์ •์ด ๋‹ค๊ฐ€์˜ฌ ๋•Œ ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ฃผ์–ด ํ™œ๋ฐœํ•œ ์‚ฌ์ดํŠธ ์ด์šฉ์„ ์œ ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. websocket๊ณผ SSE๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๊ณผ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ด๋ผ๋Š” ์ฐจ์ด์ ์ด ์žˆ๋Š”๋ฐ  ์ด ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์ด ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. 

websocket์€ ๋ฆฌ์–ผํƒ€์ž„์ด ํ•„์š”ํ•œ ์ฑ„ํŒ…, ์ฃผ์‹ ํŠธ๋ ˆ์ด๋”ฉ ๋“ฑ์—์„œ ์“ฐ์ด๊ณ  SSE๋Š” ๋น„๊ต์  ์‹ค์‹œ๊ฐ„์ผ ํ•„์š” ์—†๋Š” ์•Œ๋žŒ์„ ์ค„ ๋•Œ ๋งŽ์ด ์ด์šฉ ๋ฉ๋‹ˆ๋‹ค.

 

intersection Observer API ,  ๋ฌดํ•œ ์Šคํฌ๋กค

 

Intersection Observer๋Š”  Web API์ค‘ ํ•˜๋‚˜๋กœ ์ง€์—ฐ๋กœ๋”ฉ(lazy-loading), ๊ด‘๊ณ  ์ˆ˜์ต์„ ์œ„ํ•œ ๊ด‘๊ณ  ๊ฐ€์‹œ์„ฑ ์ฐธ๊ณ , ํŠน์ • ์œ„์น˜์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฌดํ•œ์Šคํฌ๋กค์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„ onScroll์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์›น์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์‹œํ‚ค๋Š” ์ฃผ๋ฒ”์ธ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์ฐฐํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ๊ฐ์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์„œ ์Šคํฌ๋กค์„ ํ•ด๋„ ๊ณ„์† ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

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



Redux-toolkit

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

 

์นดํ…Œ๊ณ ๋ฆฌ vs ํƒœ๊ทธ 

์นดํ…Œ๊ณ ๋ฆฌ๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์„น์…˜๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ๋ฒ”์œ„๋ฅผ ์žก๊ณ  ํ•˜์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฒŒ์‹œ๊ธ€์„ ๋‚˜๋ˆ„๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ ํƒœ๊ทธ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ƒ๊ด€์—†์ด ๊ธ€์„ ์ฐพ๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์‹์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์„ ํƒ์„ ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ์„ ํƒํ•ด์„œ ๋ฐ”๋กœ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜๋Š”๊ฒŒ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ด ํƒœ๊ทธ๋ฅผ ์ ์šฉ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

EC2

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •๋ณด๋ฅผ ์š”์ฒญ ํ–ˆ์„ ๊ฒฝ์šฐ์— ์„œ๋กœ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๋™์  ํŽ˜์ด์ง€ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋™์  ์›น ํ˜ธ์ŠคํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋Š” EC2 ๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

CloudFront ์™€ Lambda@Edge๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•

๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ ๋ถ€๋ถ„์„ ๋งก์œผ๋ฉด์„œ ํœด๋Œ€์ „ํ™”๋กœ ์ฐ์€ ์‚ฌ์ง„์„ ์ง์ ‘ ์—…๋กœ๋“œ ํ•  ๋•Œ์™€ ์˜จ๋ผ์ธ์—์„œ ์ˆ˜์ง‘ํ•œ ์ด๋ฏธ์ง€๋“ค์„ ์—…๋กœ๋“œ ํ•  ๋•Œ ์šฉ๋Ÿ‰ ์ฐจ์ด๋ฅผ ๋น„๊ต ํ•ด ๋ณด๋‹ˆ, ๊ฐ™์€ ์‚ฌ์ด์ฆˆ์˜ ์ด๋ฏธ์ง€์—ฌ๋„ ๊ทธ ์ฐจ์ด๊ฐ€ 10๋ฐฐ 20๋ฐฐ ๋งŽ๊ฒŒ๋Š” 100๋ฐฐ๊นŒ์ง€๋„ ๋‚œ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์„ ๊ฑฐ์น˜์ง€ ์•Š์€ ํœด๋Œ€ํฐ ์•จ๋ฒ”์— ์ €์žฅ๋œ ์‚ฌ์ง„๋“ค์„ ์ด๋ฏธ์ง€ ์ปดํ”„๋ ˆ์…˜๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ๋ฆฌ์‚ฌ์ด์ง•์„ ํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค์—์„œ ์š”๊ตฌํ•˜๋Š” ํ•ด์ƒ๋„๊ฐ€ ๊ฐ๊ธฐ ๋‹ฌ๋ผ ์ด๋Ÿฐ ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฆฌ์‚ฌ์ด์ง• ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Lambda@Edge ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์บ์‹œ ์„œ๋ฒ„ CloudFront ๋ฅผ ์ด์šฉํ•˜๋ฉด ์„œ๋น„์Šค ์ตœ์ ํ™”์— ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ์ด๋ผ ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค.

 

SCSS ์„ ํƒ ๋ฐฐ๊ฒฝ

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์„ ํ•˜๋ฉด์„œ css, styled-components๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šคํƒ€์ผ๋ง ํ•ด ์™”์Šต๋‹ˆ๋‹ค. css๋Š” ํŒŒ์ผ์ด ๋”ฐ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์žˆ๊ณ , ์„ ํƒ์ž๊ฐ€ ๋งŽ์•„์ ธ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํ•  ๋•Œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๊ณ  styled-components๋Š” class-name์ด ์—†์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด ์ง€๊ณ  props๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์žˆ์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ styled-components์™€์˜ ๊ตฌ๋ถ„์ด ํž˜๋“ค์—ˆ๊ณ , ์–ด๋–ค styled-components๊ฐ€ ์–ด๋–ค ํƒœ๊ทธ ์†์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ๋ฐ”๋กœ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํƒ€์ผ๋ง ํ• ์ง€ ๋ฆฌ์„œ์น˜ ํ•˜๋˜ ์ค‘ SCSS๊ฐ€ CSS์™€ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ํด ์ˆ˜๋ก ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ , ๋งŽ์€ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์„œ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜ ๋์— ์‚ฌ์šฉ ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. 
ํŠนํžˆ ์ฝ”๋“œ๋ฅผ ์ค‘์ฒฉ์‹œ์ผœ์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ•˜๋‹ค๋Š”์ ์ด ์ด์šฉํ•˜๋ฉด์„œ SCSS๊ฐ€ ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค

 

PM2

 ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ–ˆ์„ ๋•Œ ์„œ๋น„์Šค ์ œ๊ณต ๋„์ค‘ ๊ฐ‘์ž๊ธฐ ์„œ๋ฒ„๊ฐ€ ์ค‘์ง€ ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆํŽธ๊ฐ์„ ๋А๋ผ์ง€ ์•Š๋„๋ก ๋ฌด์ค‘๋‹จ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Node.js์˜ ํ”„๋กœ์„ธ์Šค ๋งค๋‹ˆ์ €์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ์žˆ๊ณ  ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋ฉฐ ํŠนํžˆ ๊ฐ™์€ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Strong-PM๊ณผ ๋น„๊ตํ•ด GitHub star์ˆ˜๊ฐ€ ์›”๋“ฑํžˆ ๋†’์•„์„œ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. 


Node.js 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๊ณ  Dom์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” Front-end ํ”„๋ ˆ์ž„์›Œํฌ์ธ React๋ฅผ ๋” ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

font-display: swap

swap ์˜ต์…˜์€ FOUT์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์šฐ์„  ํด๋ฐฑ ํฐํŠธ๋กœ ๊ธ€์ž๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , ์›น ํฐํŠธ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ์›น ํฐํŠธ๋ฅผ ์ ์šฉํ•œ๋‹ค. ์›น ํฐํŠธ ๋กœ๋”ฉ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.