์บ ํ์ ์ ํฌ CampUs ์ ํจ๊ป!
๋ค๋ฅธ ์ฌ๋๋ค์ ํ๊ธฐ๋ ์ํ๋ ์บ ํ ์ฅ์์ ๋ ์จ, ๊ทธ๋ฆฌ๊ณ ์บ ํ ์ฅ์์ ์ ํ, ์ด์ ๊ธฐ๊ฐ, ํธ์ ์์ค,
ํ
๋ง ํ๊ฒฝ, ์ฒดํ ํ๋ก๊ทธ๋จ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์บ ํ ์ ๋ณด๋ฅผ ํ์ฉํด ๋์๊ฒ ์๋ง๋ ์บ ํ ๊ณํ์ ์ธ์ฐ์๋ ๊ฑด ์ด๋จ๊น์?
- โ TimeLine | ํ์๋ผ์ธ
- ๐ช Architecture | ์ํคํ ์ณ
- ๐กFeature | ๊ตฌํ ๊ธฐ๋ฅ
- ๐ผ๏ธ ERD | ๋ฐ์ดํฐ ๊ตฌ์กฐ๋
- ๐ ๏ธ Stacks | ์ฌ์ฉ ์คํ
- โฝ Trouble Shooting | ํธ๋ฌ๋ธ ์ํ
- ๐ช PATCH NOTES | ํจ์น ๋ ธํธ
- ๐จโ๐ป๐ฉโ๐ปWho Made It | ์๋น์ค๋ฅผ ๊ฐ๊พผ ์ฌ๋๋ค
- ์ด ํ๋ก์ ํธ ๊ธฐ๊ฐ 11์ 4์ผ ~ 12์ 15์ผ (6์ฃผ)
- 12์ 10์ผ ๋ฐฐํฌ ๋ฐ ๋ฐ์นญ
๊ฑฑ์ ๋ง์ธ์. CampUs์์๋ ์ง์ญ ๊ฒ์์ผ๋ก ์บ ํ์ฅ ์กฐํ ์, ๊ธ์ผ๋ก๋ถํฐ ์ต๋ 8์ผ๊น์ง์ ๋ ์จ ์ ๋ณด๋ฅผ ์ ๊ณตํด๋๋ฆฝ๋๋ค.
๋ฏธ๋ฆฌ ํ์ธํ์๊ณ ๋์ฑ ๋ ์ฆ๊ฑฐ์ด ์บ ํ์ด ๋์ค ์ ์์ ๊ฒ๋๋ค.
์ ํฌ ์๋น์ค์์๋ ์์ฒด ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๊ธ์ฃผ ๋ ์จ๊ฐ ๊ฐ์ฅ ์ข์ ์ง์ญ์ ์ถ์ฒํด์ฃผ๊ณ , ํด๋น ์ง์ญ์ ์บ ํ์ฅ๋ค์
์๊ฐ์์ผ ๋๋ฆฝ๋๋ค.
CampUs์์๋ ์ง์ญ๋ณ ๊ฒ์ ๋ฟ๋ง ์๋๋ผ, ํค์๋ ๊ฒ์, ์นดํ
๊ณ ๋ฆฌ ๋ณ ์บ ํ์ฅ ์กฐํ, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ธ๊ธฐ๊ฐ ๋ง์ ์บ ํ์ฅ์
์ ๊ณตํจ์ผ๋ก์จ, ์บ ํ๋ค์ ์ ํ์ ๋ค์ฑ๋กญ๊ฒ ํด๋๋ฆฝ๋๋ค.
ํ ์์น ์กฐํ์ ๋์ํ์๋ฉด, ๋ด ์ฃผ๋ณ 30km ๋ด์ ์ด๋ค ์บ ํ์ฅ์ด ์๋์ง ํ์ธํ ์ ์์ด์!
๊ทผ๊ต์ ์์นํด์๋ ์บ ํ์ฅ ์ ๋ณด๋ ์ ๊ณตํด๋๋ ค์~
์ ํฌ CampUs์ ์ฐ๊ฒฐ๋ ์บ ํ์ฅ ์ ๋ณด๋ ์์น, ์์
๋ ์ง, ๋ฐ๋ ค๋๋ฌผ ๋ฐ์
, ๋ถ๋์์ค, ์ฃผ๋ณ์ด์ฉ์์ค ๋ฑ์ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณต๋๋ฆฌ๊ณ ์์ผ๋ฉฐ,
ํด๋น ์บ ํ์ฅ์ ์ด์ฉํ๋ ์ฌ๋๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๊ณ , ๋ฐ๋๋ก ์ฐ๊ธฐ๋ ๊ฐ๋ฅํด์!
โ๏ธ ์ด ์บ ํ์ฅ์ผ๋ก ์ด๋ฒ์ฃผ ํ ์์ผ์ ๋ ๋ ์์ ์ธ๋ฐ ๋ฐ๋ก ๋ณผ ์ ์๊ฒ ๊ด๋ฆฌํ๊ณ ์ถ์ด์
๋ง์์ ๋๋ ์บ ํ์ฅ์ ์ฐํด์ ์ฑ๊ฒจ์๋ณด๊ณ , ๋ ๋์๊ฐ ์ ๋ง๋ก ๊ฐ๊ณ ์ถ์ ์บ ํ์ฅ์ ์ฌํ์ผ์ ์ผ๋ก ๋ฑ๋กํด ๋ณด์ธ์!
CampUs๊ฐ ์ฌ๋ฌ๋ถ์ ์บ ํ์ผ์ ์ ๊ด๋ฆฌํด๋๋ฆฝ๋๋ค.
์บ ํ์ฅ / ๋ ์จAPI ์ฌ์ฉ
1. ์๊ตฌ์ฌํญ
1) ์ฌ์ฉ๊ฐ๋ฅํ ์บ ํ์ฅ / ๋ ์จ api ์ฐพ๊ธฐ
2) ์๋น์ค ๋ชฉ์ ์ ๋ง๋ api ์ ๋ณ.
2. ์ ํ์ง
์บ ํ์ฅ : ๊ณต๊ณตData / gocamping.
๋ ์จ : ๊ณต๊ณตData / openWetherAPI / accuweatherAPI
3. ์๊ฒฌ ์กฐ์จ/๊ฒฐ์
- ์บ ํ์ฅ
๊ณต๊ณตdata๋ ์ ๊ตญ ์บ ํ์ฅ๋ค์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ก ํ๋จ์ด ๋์ด goCamping api๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ .
์ดํ ์๋น์ค ๋ชฉ์ ์ ๋ง๋ ๋ฐ์ดํฐ๋ค์ ์ ๋ณํด์ ์ฌ์ฉํจ.
- ๋ ์จ
๊ณต๊ณตdata์ ๊ฒฝ์ฐ ์๋น์ค ๋ชฉ์ ์ ๋ง๋ ๋ฐ์ดํฐ๋ผ๊ธฐ ๋ณด๋ค๋ ๋ฐ์ดํฐ๋ถ์์ ์๋ง๋ api๋ก ์๊ฐ์ด ๋์์.
(์ ์ค๋, 5.0m์ง์ค์จ๋, ํ์ ํ์ง๊ฒ์ฌ ๋ฑ ๋ฐ์ดํฐ๊ฐ ์๋ณด์๋ ๋ง์ง ์๋ค๊ณ ํ๋จํจ)
accuweather์ ๊ฒฝ์ฐ ์๋ณด์ผ์ด 5์ผ๋ก openWeather๋ณด๋ค ์๋์ ์ผ๋ก ์งง์์ ์ต์ข
์ ์ผ๋ก openWeatherAPI๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ .
ํด์ธ์ api์ด๋ค ๋ณด๋ ์ขํ๊ฐ ์ค์ ์ด ์์ธ๋ก ์ง์ ๋์ด ์์ด ์๋น์ค์ ๋ง๊ฒ
์ ๊ตญ์ ํน๋ณ/๊ด์ญ์์ ๋๋ก ๋๋ ์ดํ ์ขํ๊ฐ์ค์ ์ ํตํ์ฌ ์ง์ญ์ ๋ง๋ ๋ ์จ์ ํ์ํ ๋ฐ์ดํฐ api๋ฅผ ๊ฐ์ ธ์ด
๋ํ apiCall์ด ํ๋ฃจ 1000๊ฑด์ผ๋ก ์ ํ์ด ๋์ด ์์ด, ํ๋ก ํธ์์ ๊ณ์ ํธ์ถํ๋ ๊ฒ์ด ์๋
๋ฐฑ์๋ ์๋ฒ์ api์ ๋ณด๋ค์ ๋ด์์ FE๋ BE๋ก apiํธ์ถ์ ํ๊ณ , BE๋ ์ง์ ๋ ์๊ฐ์ apiํธ์ถ์ ํ์ฌ ํจ์จ์ ์ผ๋ก ์ด์ ํจ.
๋ฐ์ดํฐ api์ฌ์ฉ / ์นด์นด์ค ๋งต ์ด์ฉ
1. ๋ฌธ์ ์ํฉ
์นด์นด์ค๋งต ์ฌ์ฉ์ X,Y์ขํ์ ์บ ํ์ฅ ์ขํ๊ฐ ๋ด๊ธฐ์ง ์๋ ์๋ฌ๊ฐ ๋ฐ์ํจ.
2. ๋ฌธ์ ํด๊ฒฐ๊ณผ์
1 ) useEffect๋ก ์นด์นด์ค๋งต์ด ์คํ์ ํ๋ค ๋ณด๋, ๋ฐฑ์๋์์ ์ขํ๊ฐ์ ๋ฐ์์ ๋ณ์๋ก
์ฒ๋ฆฌํด ์ค๋ค ํ์ฌ๋ ๋งตcomponent๋ Mount๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งต์ด ๋์ํ์ง ์๋๋ค๊ณ ํ๋จ.
2 ) useEffect์ธ๋ถ์์ ๋ณ์(X,Y)๊ฐ ๋ฐ๋๋๋ง๋ค ์ฌ ๋๋๋ง์ ํ ์ ์๋๋ก ์์กด์ฑ๋ฐฐ์ด์
๋ณ์ ๊ฐ ์ถ๊ฐ ๋ฐ ์ผ์ ๊ธฐ๊ฐ ์ดํ์ ๋ค์ ๋์ํ๋๋ก setTimeoutํจ์ ๊ตฌํ.
3 ) ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋์ํ์ง ์๊ณ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.
4 ) ๋งตcomponent์ ์ขํ ๊ฐ์ ํ๋์ฝ๋ฉ์ผ๋ก ์ซ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์ ๋์ํ๋ค๋ ๊ฒ์ ํ์ธ ํ ํ, ๋ฐฑ์๋์์ ๋ฐ์์ค๋ api๋ฐ์ดํฐ๋ฅผ ํ์ธ ํจ.
5-1 ) ํ๋ก ํธ : ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๋ฐ์์ค๋ ๊ฒ์ด ์๋ ํ๋ฒ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณ์์ ๋ด์ ํ ์ฌ์ฉํ์ฌ undefined์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋์๊ณ ๊ฒฝ๋ก๋ ๋ง์ง ์์์ ํ์ธ.
5-2 )๋ฐฑ์๋ : ๊ฒฝ๋ก ์์ ์ด ๋์์ผ๋ ํ๋ก ํธ์ ์ํต์ ํ์ง ๋ชปํ ๋ฌธ์ ๊ฐ ์์์์ ํ์ธ.
6 ) ๋ฐ์ดํฐ ๊ฒฝ๋ก ์์ ํ์ฌ ๋งต ๊ตฌํ
3. ์๊ฒฌ์กฐ์จ ๋ฐ ๊ฒฐ์
1 ) ํ๋ก ํธ ์์๋ ๊ฐ๋ฅํ๋ฉด ๋ฐ์ดํฐ๋ฅผ 2์ค์ผ๋ก ๋ฐ์์ค์ง ์๋๋ก ํ๊ธฐ๋ก ํจ.
2 ) ๋ฐฑ์๋ ์์๋ ์ฌ์ํ ๊ฒฝ๋ก๋ณ๊ฒฝ๋ ์ํต ํ ์์ ํ๊ธฐ๋ก ํจ.
openWether API request scheduling
1. ๋ฌธ์ ์ํฉ
๋ ์จ์ ๋ณด ํน์ฑ์ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๋๋๋ฏ๋ก, ์ฌ๋์ด ์ ์ํ์ง ์๋ ์๊ฐ์ ์์ฒญ์
๋ณด๋ด๋๊ฒ์ ๊ด๋ฆฌ์ ์ด์์ ์์ด ํจ์จ์ด ์ข์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ ํ์์ฑ์ ๋๋
2. ์ ํ์ง ๋ฐ ์๊ฒฌ์กฐ์จ
1) node-cron
2) node-schedule
3. ๊ฒฐ๊ณผ
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ฅ์ ๋น์ทํ์ง๋ง node-schedule์ ์ ์ง ๋ณด์ ์ธ์์ด ๋ง๊ณ object-literal ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋์ด ๋๋ฌธ์ ์ ํ
์๊ฐ : ๋งค์ผ 0์๋ง๋ค openWether API์ ์์ฒญ์ ๋ณด๋ด ๋ฐ์ดํฐ ๊ด๋ฆฌ
์ง์ญ๋ณ ๋ฐ ์ฃผ์ ๋ณ ์บ ํ์ฅ ์กฐํ์ ์ด ์บ ํ์ฅ ๊ฐฏ์ ์กฐํ / ์ฑ๋ฅ ๊ฐ์
1. ์๊ตฌ์ฌํญ
doNm:๋์ด๋ฆ, numOfRows : ํ ํ์ด์ง์ ๋ค์ด๊ฐ ๊ฐฏ์, pageNo : ํ์ด์ง ์ซ์, sort : ์ ๋ ฌ ๊ฐ
์ง์ญ๋ณ ๋ฐ ์ฃผ์ ๋ณ ์บ ํ์ฅ ์กฐํ์ doNm, numOfRows, pageNo, sort์ ๊ฐ์ ๋ฐ์
๋๋น์ ์ ๊ทผํ์ฌ ํด๋น ์ปฌ๋ผ์ ๋ชจ๋ ์บ ํ์ฅ์ ์ซ์์ ํ์ด์ง๋ค์ด์
ํด์ ์บ ํ์ฅ์ ์ ๋ณด๋ฅผ ๋ณด๋ด์ค๋ค.
2. ๋ฌธ์ ์ํฉ
Pagination์ ํตํด ์บ ํ์ฅ ์กฐํ๋ฅผ ํ๊ฒ ๋๋๋ฐ,
์ด๋ ์กฐํ๋๋ ์ด ์บ ํ์ฅ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋
์กฐํ + limit, offset ์ฝ๋์์ ์ค๋ณต๋๋ ์กฐํ ์ฝ๋๋ง ์์ฑํ์ฌ ์ด ๊ฐ์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ , ํผํฌ๋จผ์ค๊ฐ ๋๋ ค์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
3. ์ ํ์ง
1) SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์กฐํ ์ฟผ๋ฆฌ๋ฌธ๊ณผ, Pagination ์ฟผ๋ฆฌ๋ฌธ์ ๋๋์ด ๊ตฌํํ๋ค.
2) Sequelize ORM์ ์ฌ์ฉํ์ฌ ์กฐํ ์ฝ๋์ Pagination์ด ๋ค์ด๊ฐ ์กฐํ ์ฝ๋๋ฅผ ์ค๋ณต๋๊ฒ ๊ตฌํํ๋ค
4 . ์๊ฒฌ ์กฐ์จ
1๋ฒ) MySQL ์ฟผ๋ฆฌ๋ฌธ์ ์ ์ฒด์กฐํ,ํ์ด์ง๋ค์ด์
์ฝ๋๋ฅผ ๋๋์ด ์์ฑํ์ฌ ์ด ๊ฐฏ์๋ฅผ ์กฐํ ํ ๋๋ ์ ์ฒด ์กฐํ ์ฟผ๋ฆฌ๋ฌธ ์ฌ์ฉ, ํ์ด์ง๋ค์ด์
์ ๊ตฌํ ํ ๋๋ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ํฉ์ณ์ ์ฌ์ฉ
2๋ฒ) ์ํ๋ผ์ด์ฆ ORM์ผ๋ก op.like๋ก ์ ์ฒด์กฐํ์,ํ์ด์ง๋ค์ด์
์ฝ๋๋ฅผ ๋๋์ด์ ๊ตฌํ
5. ์๊ฒฌ ๊ฒฐ์
SQL ์ฟผ๋ฆฌ๋ฌธ ์ฌ์ฉํ์ฌ ์กฐํ ์ฟผ๋ฆฌ๋ฌธ๊ณผ, Pagination ์ฟผ๋ฆฌ๋ฌธ์ ๋๋์ด ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ์ฉํด๋ณธ๊ฒฐ๊ณผ ORM์ผ๋ก ์กฐํํ๊ฒ ๋ ์๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ํ ๋ ์ฝ๋๊ฐ ๋ถํ์ํ๊ฒ ๊ธธ์ด์ง๊ฒ ๋๋ฉด์
์๋๊ฐ ์ ํ๋๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ๋ถํํ
์คํธ๋ฅผ ํด๋ดค์ ๋ ์์ฒญ ์ฒ๋ฆฌ ์๋๋ฅผ ๋ณด๋ฉด
ORM์ ์ฌ์ฉํ์ ๋ ์ต๋๊ฐ์ด 179.3ms์ด์๋ ๊ฒ์ด ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด 66ms๋ก 113ms์ ๋ ๋จ์ถ ๋์๊ณ ํ๊ท ์น๋ 5ms ์ ๋ ๋จ์ถ๋ ๊ฒ์ ํ์ธํ์ฌ SQLQuery๋ฅผ ์ ํํ์ฌ ์งํํ์๋ค.
| ์ด๋ฆ | ํฌ์ง์ | Github or Email |
|---|---|---|
| ๊น์งํ | BackEnd (Leader) |
https://github.com/KJIHEON |
| ๋ฌธ์งํ | BackEnd |
https://github.com/JiHyeunM |
| ์ต์์ | BackEnd |
https://github.com/wonsunny |
| ์ด์์ | FrontEnd (Sub Leader) |
https://github.com/buddle6091 |
| ๋ฐฐ์ธ์ | FrontEnd |
https://github.com/wonstruckk |
| ๊น์ง์ | Designer |
janeblue@naver.com |


