April 25, 2020
์ด๋ฒ์ฃผ์๋ ์๋์ฐจ๊ฒฝ์ฃผ๊ฒ์ ๋ฏธ์ ์ ์งํํ๋๋ฐ, mvcํจํด์ผ๋ก ๋์์ธํ๋ ๊ฒ๊ณผ ๋ชจ๋ ๋ก์ง์ ๋จ์ ํ ์คํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ฌ์ ๋ฏธ์ ์ด์๋ค. ์ด๋ฒ ๋ฏธ์ ๋ถํฐ๋ vanillaJS๊ฐ ์๋ ๋ฆฌ์กํธ์ ํ์ ์คํฌ๋ฆฝํธ๋ก ์งํํด๋ณด์๋ค. UIํ ์คํธ๋ ์์ง ํ๊ธฐ๊ฐ ๊น๋ค๋ก์์ ์ด๋ฒ ๋ฏธ์ ์์๋ ์ ์ธํ์๊ณ ๋จ์ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํด์ ๋ทฐ๋จ์ ์ฝ๋(์ปดํฌ๋ํธ)์ ๋ก์ง๋ถ๋ถ์ ์ฝ๋(๋ชจ๋)์ ๋ถ๋ฆฌํด์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฌ๋ฌ๋์์ธํจํด์ ๋น๊ตํด๋ณด๊ณ , ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํด๋ณด๋ฉฐ, ์ฝ๋๋ฅผ ์ด๋ค ์์ผ๋ก ์ง์ผํ ์ง, ์๊ฐํด๋ณด์๋ค.
MVC ํจํด์ Model + View + Controller ๋ฅผ ํฉ์น ์ฉ์ด๋ก, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
์ถ์ฒ: https://beomy.tistory.com/43
์ฆ, action์ด Controller์ ์ ๋ฌ๋๋ฉด action์ ๋ฐ๋ผ Model์ ์ ๋ฐ์ดํธํ๊ณ View๋ฅผ ํตํด ๊ทธ๊ฒ์ ์ถ๋ ฅํ๋ค.
MVC ํจํด์ ์๋ฒ ์ธก ๋์์ธํจํด์ผ๋ก, ์น์ ๊ฒฝ์ฐ์ ์ ์ฉ ์์ผ๋ณด์๋ค. โํด๋ผ์ด์ธํธ(ํ๋ก ํธ)์์ ์์ฒญ์ controller์ ์ ๋ฌ > action์ ๋ฐ๋ผ Model์ ์ ๋ฐ์ดํธ > View๋ก ์ ๋ฌ(?) > View๋ ๋ค์ ์๋ต์ ํด๋ผ์ด์ธํธ(ํ๋ก ํธ)์ ์ ๋ฌ.(?)โ ํ์ง๋ง ์ด๋ด ๊ฒฝ์ฐ, View๋ ํด๋ผ์ด์ธํธ(ํ๋ก ํธ)์์ ๊ตฌํ๋๋ ๊ฒ์ด์ง ์๋ฒ์ธก์ ๊ณผ์ฐ View๊ฐ ์๋์ง ์๋ฌธ์ด ๋ค์๋ค.
๊ทธ๋์ ๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ MVCํจํด์ ๊ฐ์ฒด์งํฅ ์์คํ ์ด UI๋ฅผ ๊ฐ์ง ์ ์๋๋ก ์ค๊ณ๋ ํจ๋ฌ๋ค์์ด๋ฉฐ, ์น ์๋น์ค์ ์๋ฒฝํ ๋์ ํ๋ คํ๋ ๊ฒ์ ์ณ์ง ์๋ค๋ ๊ฒฌํด๊ฐ ์์๋ค. https://softwareengineering.stackexchange.com/questions/324730/mvc-and-restful-api-service MVC๋ฅผ ์ ๋๋ก ๋ฐ๋ฅด๊ณ ์๋์ง ๋ณด๋ค๋ MVC ํจํด์ ์ด์ (์ฝ๋๋ฅผ ์ญํ ์ ๋ง๊ฒ ๋๋๋ ๊ฒ)์ ์ดํดํ๊ณ ๊ทธ๊ฒ์ ๊ณ ๋ คํ ์ค๊ณํ๋ ๊ฒ์ด ๋ ์ค์ํ์ง ์๋ ์๊ฐ์ด ๋ค์๋ค.
MVVM ํจํด์ MVC์์ ํ์๋ ํจํด์ผ๋ก Model + View + View Model ๋ฅผ ํฉ์น ์ฉ์ด์ด๋ค. MVVM ํจํด์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
์ถ์ฒ: https://beomy.tistory.com/43
View์ action์ด ์ ๋ฌ๋๋ฉฐ, ํ๋ก ํธ์๋์ธก์์ ์ฃผ๋ก์ฌ์ฉ๋๋ ํจํด์ด๋ค.
โView์์ action๋ฐ์ > View๊ฐ View Model๋ก action ์ ๋ฌ > View Model์ Model์ ์
๋ฐ์ดํธํ๊ณ ์๋ต์ ๋ค์ ๊ฐ์ ธ์ด > View Model์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํ์ฌ View๋ฅผ ๊ฐฑ์ โ ์ด๋ ๊ฒ model ์ ๋ณํ์ ๋ฐ๋ผ, view๋ฅผ ๋ฐ๋ก๋ฐ๋ก ์
๋ฐ์ดํธ ํด์ฃผ๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. Angular, vuejs ์ ๊ฒฝ์ฐ์๋ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์, ๋ฆฌ์กํธ๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ด์ฉํ๋ค.
๊ธฐ์กด์ MVC๋ชจ๋ธ์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฐฉ์์ ๋ชจ๋ธ์ ๋ณํ์ ๋ฐ๋ผ ๋ฐ๋ก๋ฐ๋ก ๋ทฐ๊ฐ ๋ณํ๊ธฐ ๋๋ฌธ์ ์์คํ ์ด ๋ณต์กํด์ง ์๋ก ์์ธก ๋ถ๊ฐ๋ฅํ ์ํฉ๋ค์ด ์๊ธฐ๊ณ ๋ฐ์ดํฐ๋ค์ด ๊ผฌ์ฌ๋ฒ๋ฆด ์ ์๋ค๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์์๋ค.
์ ๋ฐ์ดํธํ Model๋ค์ด ๋ค์์ด๊ณ , ์๋ก ์์กด์ฑ์ด ์ฝํ์์ ๊ฒฝ์ฐ ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค.
FLUX ํจํด์ MVC์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋จ์ ์ ํด๊ฒฐํ๊ณ ์ ํ์ด์ค๋ถ์์ ๊ณ ์ํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
๋ฐฉ์์ ๋์์ธ ํจํด์ด๋ค. ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ถ์ฒ: https://taegon.kim/archives/5288
์ฆ, โAction์ด dispatch > dispatcher๋ action์ ๋ง๊ฒ store๋ฅผ ์ ๋ฐ์ดํธ > View๋ store์ ๋ณํ๊ฐ ๊ฐ์ง๋๋ฉด view์ ๋ฐ์ดํธโ ์ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค. ๋ํ์ ์ผ๋ก React์ Redux๊ฐ fluxํจํด์ ์ฌ์ฉํ๋ฉฐ, Vuex๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ fluxํจํด์ ์๊ฐ์ ๋ฐ์ ๋ง๋ค์ด์ก๋ค๊ณ ํ๋ค.
2020๋ 4์ 26์ผ, ์ ์ค ์คํ๋ผ์ธ ์คํฐ๋์์ ์ฝ๋๋ฆฌ๋ทฐ ๋ฐฉ์์ ๋ํด์ ๋ค์ ์ ์์๋ค. ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํด์ฃผ์๋ ๋ถ์ ๋ฐ๋ฅด๋ฉด mvc๋ชจ๋ธ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์์์ ์ผ๋ก ํ์คํ์ค ์ฝ๋์ ํ๋ฆ๋๋ก ์ฝ์ด๋ด๋ ค๊ฐ์ ๋ค๊ณ ํ์๋ค. ์๋ฅผ๋ค์ด, โ์ปจํธ๋กค๋ฌ๋ฅผ ์คํ > ์ธํ์ ๋ฐ๊ณ ์๋์ฐจ๋ฐฐ์ด์ ์์ฑ > ๋ชจ๋ธ์ ๋ถ๋ฌ์ค๊ณ ์ ๋ฐ์ดํธ > ์ถ๋ ฅโ ์ด๋ฐ์์ผ๋ก ๋ง์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๋ ํ๋ฆ์ด ์ ์ดํด๋๊ณ ์ค๊ฐ์ ํ๋ฆ์ด ๋๊ธฐ์ง ์์ผ๋ ค๋ฉด ํจ์(๋ฉ์๋)๋ช , ๋ณ์๋ช ์ง๋ ๊ฒ๋ ์ค์ํ๊ฒ ๊ตฌ๋๋ฅผ ๋๋ผ๊ฒ ๋์๋ค.
์์์ ์ธ๊ธํ๋ ์ฌ๋ฌ ๋์์ธํจํด์ ๊ฒฝ์ฐ๋ ๊ณตํต์ ์ผ๋ก๋ action์ด ์กด์ฌํ๋ค. ํ๋ก ํธ์ ๊ฒฝ์ฐ ๋ทฐ๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ๊ณ ์ฌ๋ฌ action๋ค์ด ๋ฐ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ action์ ์ฒ๋ฆฌํ๋ ๋ก์ง ํ๋ํ๋๋ฅผ ํ๋ฆ์ ํ๊ณ ๊ฐ๋ฉด์ ์ดํดํ๊ธฐ ์ฝ๊ณ , ํ๋ฆ์ด ๋๊ธฐ์ง ์๋๋ก ์ค์ค๋ก ์ ๊ฒํ๋ ์ฐ์ต๋ ๋ง์ด ํด๋ด์ผ๊ฒ ๋ค๊ณ ๋๋ผ๊ฒ ๋์๋ค.
racing Car ๋ฏธ์
์ mvcํจํด์ผ๋ก ๋์์ธํ๋ ๊ฒ๊ณผ ๋ชจ๋ ๋ก์ง์ ๋จ์ ํ
์คํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ฌ์ ๋ฏธ์
์ด์๋๋ฐ, ๋๋ java๊ฐ ์๋๋ผ javascript์๊ธฐ ๋๋ฌธ์ MVVM๊ณผ FLUX ๋ชจ๋ธ์ ์ฌ์ฉํด์ ๋์์ธํด๋ณด์๋ค. ์ ํํ ๋์
์ํค๋ ๊ฒ์ ์ด๋ ต๊ฒ ์ง๋ง, containers ํด๋์ App.tsx๋ฅผ View Model
๋ก ์ฌ์ฉ์์ View์์ action์ ์ ๋ฌ๋ฐ๋ ์ญํ ์, components์ Processes.tsx์ Result.tsx๋ฅผ ๋ณ๊ฒฝ๋ View๋ฅผ ์ถ๋ ฅํ๋ View
์ ์ญํ ์ ํ๋๋ก ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก modules๋ผ๋ ํด๋์๋ Model
์ ์ญํ ์ ํ๋ ํจ์๋ค์ ๋ชจ๋ํํ๋ก ๋ชจ์๋์๋ค. ๊ทธ๋ฆฌ๊ณ React hooks ๋ฅผ ํตํด์ FLUXํจํด์ ๊ตฌํํด๋ณด์๋ค.
์ด๋ฒ ๋ฏธ์ ์ ๊ฒ์์ ์ธ ์์๊น์ง ์ถ๊ฐํด์ ์๋ง๋ฒ ํ๋ก์ ํธ์๋ ์ถ๊ฐํด๋ณด์๋ค. ์๋ง๋ฒํ๋ก์ ํธ/racingcar
java-racingCar-1
โโโ src
โ โโโ components
โ โ โโโ Processes.tsx (์คํ๊ณผ์ ๋ง ์ถ๋ ฅ)
โ โ โโโ Result.tsx (์คํ๊ฒฐ๊ณผ๋ง ์ถ๋ ฅ)
โ โโโ containers
โ โ โโโ App.test.tsx
โ โ โโโ App.tsx (๋ฉ์ธ ์ปจํ
์ด๋)
โ โโโ modules
โ โ โโโ Car.test.ts
โ โ โโโ Car.ts (Car ๊ฐ์ฒด)
โ โ โโโ formValidator.test.ts
โ โ โโโ formValidator.ts (์ฌ์ฉ์ ์ธํ ๊ฒ์ฆ)
โ โ โโโ racingCar.test.tsx
โ โ โโโ racingCar.tsx (์๋์ฐจ ๊ด๋ จ ํจ์)
๊ทธ๋ฆฌ๊ณ jest
๋ฅผ ์ด์ฉํด์ ๋ชจ๋๋ค์ ์ ๋ ํ
์คํธ๋ฅผ ์ํํ ํ
์คํธ์ฝ๋๋ ์์ฑํด์ฃผ์๋ค. ํ
์คํธ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์์ง๋ ์ต์์น ์์์ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค. ์ ๋ฒ ์๋ฆฌ์ฆ์์ ํฌ์คํ
ํ๋ ํ
์คํธ ์ฝ๋ ์์ฑ ํ์ ์ด๋ฒ์ฃผ ์คํ๋ผ์ธ ์คํฐ๋์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ถ๊ฐํด์ ๋ค์ ์ ์ด๋ณด๋ คํ๋ค.
1๏ธโฃ ํ ์คํธ ์ด๋ฆ์ ํ๊ธ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข๋ค. ์์ ํ ์คํธ๋ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ํ๋ก๊ทธ๋จ์ด ๋ณต์กํด์ง๋ฉด ํ ์คํธ๋ช ๋ ๊ธธ์ด์ง ๊ฒ์ด๊ณ ๊ฐ๊ฐ ํ ์คํธ๋ง๋ค ์ดํดํ๊ธฐ ์ฝ๊ณ ์๋ฏธ๋ฅผ ์ ์ ๋ฌํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
2๏ธโฃ ํ ์คํธ๋ ๊ฐ์ฅ ์์ ๋จ์์ ๊ธฐ๋ฅ๋ถํฐ ํ ์คํธํ๋ค. ์๋ฅผ๋ค์ด, A,B๊ฐ C๋ผ๋ ๊ธฐ๋ฅ์ ์์กด๋ ๊ฒฝ์ฐ, A,B๋ฅผ ํ ์คํธํ๊ณ ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด C์์ A,B๊ฐ ํฌํจ๋์ง ์์ ๊ธฐ๋ฅ๋ง ํ ์คํธํ๋ฉด ๋๋ค.
3๏ธโฃ ํ๋์ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ค. ํ ์คํธ๋ผ๋ฆฌ ์์กดํด์๋ ์๋๋ค.
4๏ธโฃ ํ ์คํธ๋ ํ๋์ ๊ฐ๋ ๋ง ํ ์คํธ ํ๋ค. ์ด๋ฒ ๋ฏธ์ ์ ๊ฒฝ์ฐ, ์๋์ฐจ๊ฐ ๊ฐ๋์ง ์๊ฐ๋์ง ํ ์คํธํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ๋ ๊ฒฝ์ฐ ํ๋, ์๊ฐ๋ ๊ฒฝ์ฐ ํ๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ํ ์คํธ ํ๋ค.
5๏ธโฃ ํ ์คํธ๋ 3๋จ๊ณ๋ก ๋๋๊ธฐ. ์ฒซ ๋ฒ์งธ๋ก ํ ์คํธย ๋ฐ์ดํฐ๋ฅผย ๋ง๋๋ ๋ถ๋ถ. (given) ๋ย ๋ฒ์งธ๋กย ํ ์คํธย ๋ฐ์ดํฐ๋ฅผย ์กฐ์ํ๋ ๋ถ๋ถ. (when)์ธย ๋ฒ์งธ๋กย ์กฐ์ํย ๊ฒฐ๊ณผ๊ฐย ์ฌ๋ฐ๋ฅธ์งย ํ์ธํ๋ ๋ถ๋ถ. (then)
https://softwareengineering.stackexchange.com/questions/324730/mvc-and-restful-api-service
https://taegon.kim/archives/5288
์คํฐ๋๋ฅผ ํ๋ฉด์ ์ฝ๋๋ฅผ ์์ ๋ง ์ ์ ์๊ฒ ์ง๋ ๊ฒ์ด ์ค๋ ฅ์ด ์๋๋ผ ๋๊ตฌ๋ ์์๋ณผ ์ ์๊ฒ ์ง๋ ๊ฒ์ด ์ค๋ ฅ์ด๋ผ๋ ๋ง์ ๋ฃ๊ฒ ๋์๋ค. ์ด๋ฒ ์ฃผ์๋ ์ฝ๊ณ , ํธํ๊ฒ ํ๋ฆ๋๋ก ์ฝ์ ์ ์๋ ํด๋ฆฐํ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ๋ ์ ๋ง ์ค์ํ๊ตฌ๋๋ฅผ ๋๋ ์ ์์๋ค. ๋ค์ ๋ฏธ์ ๋ถํฐ๋ ๊ตฌํ๋ณด๋ค๋ ์ฝ๋๋ฅผ ๋๋ง๊ณ ๋ค๋ฅธ ์ฌ๋์ด ์ฝ์ ๋๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ง๋ ๊ฒ์ ๋ ์ค์ ์ ๋๊ณ ์งํํด๋ณด์์ผ๊ฒ ๋ค.