KimJunhyeong1 / landsoundscape-frontend

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LandSoundScape

maskable_icon_x384

LandSoundScape - Fall into the beautiful landscape and the sound of your imagination

๐Ÿ™‡โ€โ™‚๏ธ Intro

โ€œFall into the beautiful landscape and the sound of your imagination.โ€

LandSoundScape๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ–ˆ์„ ๋•Œ ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์ง„์— ๊ฐ€์žฅ ์–ด์šธ๋ฆฌ๋Š” ์†Œ๋ฆฌ์™€ ํƒœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด ๋” ๋ชฐ์ž…๋„ ์žˆ๊ฒŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ํ’๊ฒฝ ์‚ฌ์ง„์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ๊ณ„ ๊ณณ๊ณณ์˜ ํ’๊ฒฝ ์‚ฌ์ง„์„ ์†Œ๋ฆฌ์™€ ํ•จ๊ป˜ ์ฆ๊ธฐ๊ณ , ์ง€๋„๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๋‚˜๋ผ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Œ์— ๋“œ๋Š” ์‚ฌ์ง„์„ ์ €์žฅํ•˜๊ณ , ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์ฃผ์ œ์— ๋งž๋Š” ์‚ฌ์ง„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์‹ ์˜ ์ถ”์–ต์ด ๋‹ด๊ธด ํ’๊ฒฝ ์‚ฌ์ง„์„ ์ƒ์ƒ์˜ ์†Œ๋ฆฌ์™€ ํ•จ๊ป˜ ๊ณต์œ ํ•ด๋ณด์„ธ์š”.

๐Ÿ’ก Motivation

sean-oulashin-KMn4VEeEPR8-unsplash (1)

์—ฌํ–‰์„ ์ž˜ ๊ฐ€์ง€ ๋ชปํ•˜๋Š” ์ง€๊ธˆ ์˜ˆ์ „์— ๊ฐ”๋˜ ํ•ด์™ธ, ๊ตญ๋‚ด ์‚ฌ์ง„์„ ์ž์ฃผ ์ฐพ์•„๋ณด๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋ณ€์˜ ํ’๊ฒฝ ์‚ฌ์ง„์„ ๋ณด์•˜์„ ๋•Œ ๋ถ€์„œ์ง€๋Š” ํŒŒ๋„ ์†Œ๋ฆฌ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋“ฏ์ด ์†Œ๋ฆฌ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ ‘๊ทผ์„ฑ์ด ์ข‹์€ ์›น์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ณ  ๋ณต์žกํ•œ ๊ณผ์ •์€ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ๊ฐ์ด ๋‹ด๊ฒจ ์‚ฌ์šฉ์ž๋Š” ๋‹จ์ˆœํžˆ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ’๊ฒฝ์— ๋” ๋ชฐ์ž…ํ•˜๊ณ , ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” โ€˜LandSoundScapeโ€™ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ฟ Feature

Group 25

๐ŸŽ– Keyword

TensorFlow.js

ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ์ด๋ฏธ์ง€๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์‚ฌ์šด๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ , ํƒœ๊ทธ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, ์ด๋ฏธ์ง€๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์‚ฌ์šด๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” โ€˜SoundNetโ€™์˜ ๊ฒฝ์šฐ TensorFlow.js์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ์ด์—ˆ๊ณ  ๊ฒฐ๊ตญ Kears ๋ชจ๋ธ์„ Json, Binary ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๋‹น ๋ชจ๋ธ๊ณผ ์ด๋ฏธ์ง€์˜ โ€˜feature vectorโ€™๋ฅผ ์ด์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ JS ๋ฌธ๋ฒ•๊ณผ TensorFlow.js๋ฅผ ํ†ตํ•ด โ€˜predictโ€™ ๋กœ์ง์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ชจ๋ธ ์ž์ฒด๊ฐ€ Python ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ์–ด ์˜ˆ์ธกํ•œ ๊ฒฐ๊ณผ์˜ ์ •ํ™•๋„๊ฐ€ ๋งค์šฐ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ •ํ™•๋„๋ฅผ ๊ทน์ ์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์ฐพ์•„์•ผ ํ–ˆ๊ณ , NodeJS์—์„œ ์ œ๊ณตํ•˜๋Š” โ€˜Child Processโ€™๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

NodeJS ๋‚ด๋ถ€์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์ด๋ฏธ์ง€์— โ€˜feature vectorโ€™๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ ํ•ฉํ•œ ์‚ฌ์šด๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์‹œ๊ฐ„์„ ๋งŽ์ด ํˆฌ์žํ•˜๊ณ , ๋Š์ž„์—†์ด ๊ณ ๋ฏผํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ๊ณ ๋ฏผ์„ ํ†ตํ•ด ํ”„๋ก ํŠธ ๋‹จ์—์„œ ์ด๋ฏธ์ง€์— ๋” ์ ํ•ฉํ•œ ์‚ฌ์šด๋“œ๋ฅผ ์ œ๊ณตํ•ด ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

GraphQL

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐ์กด์˜ โ€˜REST APIโ€™ ๋Œ€์‹  GraphQL์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋„์ž…ํ•œ ์ด์œ ๋Š” ํ”„๋กœ์ ํŠธ ์ธก๋ฉด์—์„œ๋Š” ํ”„๋ก ํŠธ ๊ฐ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์ ์ ˆํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค ๋‹ค์‹œ ์žฌ๊ฐ€๊ณตํ•˜์ง€ ์•Š๊ณ  ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ API ๊ด€๋ จ ํ”„๋ก ํŠธ์— ๋ถ€๋‹ด์„ ๋œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต์ ์ธ ์ธก๋ฉด์—์„œ๋Š” GraphQL์ด ๊ธฐ์กด์˜ REST API์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž ๋„์ž…๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๊ณผ์—ฐ ์–ด๋–ค ์ ์ด ๋‹ค๋ฅด๊ณ , ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ผ๊นŒ๋ฅผ ๋ชธ์†Œ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

GraphQL์„ ์ฒ˜์Œ ๋„์ž…ํ•ด๋ณด์•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ์„ค๊ณ„ํ•ด ๋ณด๊ณ  ์‹ถ์–ด ๊ฐœ๋ฐœ ์ „ ์กฐ์‚ฌ๋ฅผ ๋งŽ์ด ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ํ™•์žฅ์„ฑ ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด โ€˜apollo-server-expressโ€™๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๊ธฐ์ค€(DataSoucrce)์œผ๋กœ Query, Muation, Resolver, Type์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋„๋ก ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. โ€˜Contextโ€™๋ฅผ ์ด์šฉํ•˜์—ฌ JWT Authorization ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

GraphQL์„ ๋„์ž…ํ•˜๊ณ  ๊ฐ€์žฅ ํฌ๊ฒŒ ๋Š๋‚€ ์žฅ์ ์€ โ€˜๋”ฐ๋กœ ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š๊ณ  ๊ฐ Query, Muation์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ช…์„ธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ ' ์ด์˜€์Šต๋‹ˆ๋‹ค.

โ€˜Apollo Studioโ€™๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ฐฑ์—”๋“œ์˜ Query ๋“ค์„ ๋ˆ„๊ตฌ๋‚˜ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ด ๊ฐœ๋ฐœ ๋งŒ์กฑ๋„๋ฅผ ๋†’์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

apollo

GraphQL์„ ํฐ ๋‹จ์ ์€ ํŒŒ์ผ ์—…๋กœ๋“œ์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, โ€˜apollo-server-expressโ€™, โ€˜graphql-uploadโ€™๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์˜€๊ณ  โ€˜apollo-serverโ€™, โ€˜nodeโ€™ ๋ฒ„์ „์„ ๋‚ฎ์ถ”์ง€ ์•Š๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๊ฒฝํ—˜ํ•˜๊ณ  ๋Š๋‚€ ์ ์€ 'GraphQL์ด REST API๋ณด๋‹ค ์šฐ์„ธํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹คโ€™๋ผ๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. GraphQL์ด ํšจ์œจ์ ์œผ๋กœ โ€˜Fetchingโ€™ํ•˜๊ณ , ํ…Œ์ŠคํŒ…์ด ์šฉ์ดํ•œ ์žฅ์ ์ด ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ถ€๋ถ„์—์„œ ํŠนํžˆ ๋Š๋‚€ ๊ธด ์„ธ์›” ๋™์•ˆ ์ง„ํ™”ํ•œ โ€˜REST APIโ€™์˜ ์•ˆ์ •์„ฑ๊ณผ ๋ฒ”์šฉ์„ฑ์„ ๋”ฐ๋ผ๊ฐ€์ง€๋Š” ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€˜apollo-server-expressโ€™๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ Express(REST) ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์—”๋“œํฌ์ธํŠธ์— GraphQL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ž์–ด ํŒ€, ๊ฐœ์ธ, ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ด์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PWA, ๋ฐ˜์‘ํ˜• ๋””์ž์ธ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ PWA(Progressive Web App) ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์›น์ด์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

PWA ์ ์šฉ์„ ์œ„ํ•˜์—ฌ ํ•ต์‹ฌ์ธ โ€˜Manifestโ€™ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  'ServiceWokerโ€™๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

PWA ์ •์ฑ…์—์„œ ๊ฐ•์กฐํ•˜๋Š” ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ ๋งž์ถ”๊ธฐ ์œ„ํ•ด โ€˜Lighthouseโ€™๋ฅผ ํ†ตํ•ด ์ €์˜ ์›นํŽ˜์ด์ง€ ์ ์ˆ˜๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ์ง€์†ํ•ด์„œ ๋ณด์•ˆํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ฐ”์ผ ์•ฑ, ํฌ๋กฌ ์•ฑ์œผ๋กœ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, โ€˜WorkBoxโ€™๋ฅผ ์ด์šฉํ•˜์—ฌ GraphQL ์ฟผ๋ฆฌ๋“ค์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜์‹œํ‚จ ํ›„ ํ•ด์‹œํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์บ์‹ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€, ์‚ฌ์šด๋“œ ํŒŒ์ผ ๋˜ํ•œ โ€˜ServiceWokerโ€™์— ์บ์‹ฑํ•˜์—ฌ ์˜คํ”„๋ผ์ธ์—์„œ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์ด ์•„๋‹ ๋•Œ๋Š” โ€˜networkFirstโ€™์ „๋žต์„ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ Sync๋ฅผ ๋งž์ถ”๋Š” ๋ฐ ์ดˆ์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ํ™”๋ฉด ํฌ๊ธฐ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ์„œ๋น„์Šค์˜ ํŠน์„ฑ์ƒ ๋งŽ์€ ๊ธฐ๊ธฐ๋ฅผ ์ง€์›ํ•ด์•ผ ํ–ˆ๊ณ , โ€˜Media Queryโ€™, ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ์— โ€˜Global Styleโ€™์„ ์ด์šฉํ•˜์—ฌ ๋Œ€์‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์กด์˜ โ€˜pxโ€™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์œ„๋ฅผ ์ •ํ–ˆ์ง€๋งŒ, ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์—์„œ ํ•„์ˆ˜์ ์ธ โ€˜remโ€™์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์ง„์„ ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด์—์„œ๋Š” ๋ชจ๋ฐ”์ผ๊ณผ ๋ฐ์Šคํฌํƒ‘์˜ ํ™”๋ฉด ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ ํ™”๋ฉด์— ๋งž๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฐฐ์น˜๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ž Foundation

'landSoundScape' ํ”„๋กœ์ ํŠธ์—์„œ ์ ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ๊ธ€๋กœ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ—“ Schedule

1์ฃผ์ฐจ (22.06.27 ~ 07.01) ๊ธฐํš

2์ฃผ์ฐจ (22.07.02 ~ 07.10) ๊ฐœ๋ฐœ

  • ๋ฉ”์ธ ๊ธฐ๋Šฅ(TensorFlow) ์ž‘์—…
  • ํ”„๋ก ํŠธ, ๋ฐฑ์—”๋“œ ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ
  • AWS S3๋ฅผ ์ด์šฉํ•œ ์ •์ ํŒŒ์ผ ์—…๋กœ๋“œ

3์ฃผ์ฐจ (22.07.11 ~ 07.15) ๊ฐœ๋ฐœ ๋ฐฐํฌ

  • ๋ฉ”์ธ ๊ธฐ๋Šฅ ์—…๊ทธ๋ ˆ์ด๋“œ
  • Netlify๋ฅผ ์ด์šฉํ•œ ํ”„๋ก ํŠธ ํ™˜๊ฒฝ ๋ฐฐํฌ
  • AWS Elastic Beanstalk๋ฅผ ์ด์šฉํ•œ ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ (Node, Python) ํ™˜๊ฒฝ ๋ฐฐํฌ

๐Ÿ“ Installation

Frontend (React)

  1. ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด ๋ฐ›์€ ํ›„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด ์ž…๋ ฅ
yarn

yarn start
  1. ํ™˜๊ฒฝ์„ค์ • (.env file)์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
REACT_APP_GOOGLE_CLIENT_ID=<YOUR_GOOGLE_CLIENT_ID>
REACT_APP_API_SERVER_URL=<YOUR_SERVER_URL>

Backend (apollo-server-express)

  1. ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด ๋ฐ›์€ ํ›„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด ์ž…๋ ฅ
yarn

yarn start
  1. ํ™˜๊ฒฝ์„ค์ • (.env file)์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
MONGODB_URI=<YOUR_MONGODB_DATABASE_URL>

JWT_SECRET=<YOUR_JWT_TOKEN_SECRET>

AWS_ACCESS_KEY=<YOUR_AWS_ACCESS_KEY>
AWS_SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
AWS_S3_REGION=<YOUR_S3_REGION>
AWS_S3_BUCKET_NAME=<YOUR_S3_BUCKET_NAME>

PYTHON_PATH=<YOUR_PYTHON_INSTALL_PATH>

๐Ÿ“š Stack

Frontend

  • PWA
    • ServiceWorker
    • WorkBox
  • React
    • VAC Pattern
  • React Query (Sever state)
  • Recoil (Client state)
  • GraphQL Request
  • D3.js
  • Styled Compontent
  • Jest

Backend

  • Node.js
  • Apollo Server Express
  • TensorFlow.js
  • JWT authorization
  • MongoDB - Atlas
  • AWS S3
  • Jest
  • Python 3.7
    • Numpy
    • Scipy

API: GraphQL

Depoly: Netlify, AWS Elastic Beanstalk

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ: Yarn

๐Ÿ”— Github Repositories

Frontend

GitHub - KimJunhyeong1/landsoundscape-frontend

Backend

GitHub - KimJunhyeong1/landsoundscape-backend

๐Ÿš€ Outro

๋งค์ฃผ ์ง„ํ–‰ํ–ˆ๋˜ ๊ณผ์ œ, 2๋ฒˆ์˜ ํ…Œ์ŠคํŠธ, ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฑฐ์ณ ๋งˆ์ง€๋ง‰ ์ง€๊ธˆ์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ์–ด๋Š ํ•˜๋‚˜ ์‰ฌ์šด ๊ฒƒ์ด ์—†์—ˆ๊ณ  ๋งค๋ฒˆ ๊ณ ๋น„๊ฐ€ ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค.

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

์ด๋ฒˆ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํšํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ โ€˜TensorFlowโ€™ ๊ด€๋ จ PoC์—์„œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๊ณ , ์‹ค์ œ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋„ ์ œ๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์— ์ ํ•ฉํ•œ ์‚ฌ์šด๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ์ •ํ™•๋„๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด NodeJS์—์„œ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด ๋ณด๋Š” โ€˜Child Processโ€™๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฒŒ ์ฃผ์–ด์ง„ ๋„๊ตฌ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ž์‹ ๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜, ๋ฐฑ์—”๋“œ๋ฅผ AWS EB์— ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์—์„œ NodeJS์—์„œ โ€˜Child Processโ€™๋ฅผ ํ†ตํ•ด Python ํ™˜๊ฒฝ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ฐฑ์—”๋“œ ๋ฐฐํฌ ๊ณผ์ •์œผ๋กœ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ์ง์žฅ์—์„œ โ€˜Linuxโ€™๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ์‚ด๋ ค EB(Linux) ํ™˜๊ฒฝ์— ํ•„์š”๋กœ ํ•˜๋Š” Python ํ™˜๊ฒฝ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ Extensions Command๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๋ง‰๋ง‰ํ–ˆ์ง€๋งŒ ์ œ๊ฐ€ ๋จธ๋ฆฟ์†์œผ๋กœ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜์˜€์„ ๋•Œ ์ด๋ฃจ๋งํ•  ์ˆ˜ ์—†๋Š” ์„ฑ์ทจ๊ฐ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

GraphQL์„ ์ฒ˜์Œ ๋„์ž…ํ•˜์˜€๊ณ  ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, GraphQL์˜ ๋‹จ์ ์ธ ํŒŒ์ผ์—…๋กœ๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” โ€œ์™œ ๋‚ด๊ฐ€ ๊ธฐ์กด์˜ ์ž˜ ์“ฐ๋˜ REST API๋ฅผ ์“ฐ์ง€ ์•Š์•˜์„๊นŒ.. ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋‹ค๋ฉด ์ˆ˜์›”ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜์˜€์„ ํ…๋ฐโ€ฆโ€๋ผ๊ณ ์ˆ˜๋„์—†์ด ํ›„ํšŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ธฐ์กด์˜ ์‚ฌ์šฉํ•˜๋˜ โ€˜apollo-serverโ€™์—์„œ โ€˜apollo-server-expressโ€™ ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ โ€˜graphql-uploadโ€™๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์—…๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋กœ๋งŒ ์ ‘ํ–ˆ๋˜ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ  ์Šคํƒ์˜ ์žฅ๋‹จ์ ์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๊นจ์šฐ์น˜๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

์ด๋ฒˆ์— PWA์™€ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์„ ๋„์ž…ํ•˜์—ฌ ์ €์—๊ฒŒ ์กด์žฌํ–ˆ๋˜ ๊ทธ๋Ÿฐ ๋‘๋ ค์›€์„ ๋–จ์ณ๋‚ด๊ณ  ๊ฐœ๋ฐœ์ž๋กœ์„œ ํ•œ ๋ฐœ์ง ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ณผ์ •์—์„œ ์‹ ๊ฒฝ ์ผ๊ณ , ์•ž์œผ๋กœ๋„ ๋” ๋‹จ๋‹จํ•œ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๊ฐ–์ถ”๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ œ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์ง€์‹๊ณผ ๊ธฐ๋ณธ๊ธฐ์— ๋Œ€ํ•œ โ€˜์ฆ๋ช…โ€™์ด์—ˆ๊ณ , ์•ž์œผ๋กœ ๋Š์ž„์—†์ด ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์€ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

About


Languages

Language:JavaScript 93.6%Language:HTML 6.4%