MVC์ Service
์ด๋ฒ ๋ฏธ์
์์ DB๋ฅผ ์ ์ฉํ๋ฉด์ MVC ํจํด์ ์ถ๊ฐ๋ก Service ๋ ์ด์ด๋ฅผ ๋์
ํ์๋ค.
๋ํ DAO์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํ DTO๋ฅผ ์ฒ์ ์ฌ์ฉํ๋๋ฐ, DTO๋ฅผ ์ ๋ฆฌํ๊ณ DAO์ ๋ํด์๋ ์๋กญ๊ฒ ๋ฐฐ์ด ๋ถ๋ถ์ด ๋ง์ ์ ๋ฆฌ โ๏ธ
ํด์ ์ฝ๋ฉํธ์ ๋ต๋ณ์ ๋ฌ๋ค๊ฐ ๋์ ์ฝ๋ฉํธ ๋ด์ฉ์ ์ ์ ํด์ฃผ๋ฉด์ ๊ฐ์ด ์ฃผ์ ์ฐธ๊ณ ์๋ฃ๊ฐ ์๋๋ฐ,
์๋น์ค ๊ณ์ธต๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ด๋ผ๋ ๊ฐ๋
์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ๋๋ก ์ธ์งํ์ง ๋ชปํ๊ณ ์์๋ ๊ฒ ๊ฐ๋ค.
๋๋ฌธ์ ํด๊ฐ ์ฃผ์ MVC ํจํด๊ณผ Service ๋ ์ด์ด์ ๊ดํ ๊ธ์ ์ฝ๊ณ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋ค.
๊ฐ ๊ณ์ธต์ ๋ํ ๊ฐ๋
์ ์กฐ๊ธ์ฉ ์์ดํ๋ ์ผ๋จ ๋ธ๋ก๊ทธ ๊ธ์ ์๋น์ค ๊ณ์ธก๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ
์ฐธ๊ณ ์ ๋๋ง ํ ์์ค์์ ์ ๋ฆฌํ๊ณ ๋ค์ ๋ ๋ฒจ์์ ์์ธํ ์ก์๊ฐ๋ ๊ฒ์ด ์ข๊ฒ ๋ค๊ณ ํ์
จ๋ค.
Layered Architecture
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ ์ด์ด๋ฅผ ๊ตฌ๋ถํ๋ค๋ฉด ์์ ๊ฐ์ด ๋๋ ์ ์๋ค. MVC ํจํด ๋ํ ์ด Layer๋ฅผ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
Layer ๋ถ๋ฆฌ์ ์ฅ์ ?
- ๊ฐ ๊ณ์ธต์ด ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ํน์ ์ญํ ๋ง์ ์ํํ๊ฒ ๋๋์ผ๋ก, ๋น์ฆ๋์ค ์์ฒญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์ํํด์ผํ๋ ์์
์ ๋ํ ์ถ์ํ๋ฅผ ์ด๋ฃฌ๋ค.
์ถ์ํ๊ฐ ์ ์ด๋ฃจ์ด์ง๋ค๋ฉด ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ณ์ธต๋ค์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ณ์ธต์์ ๋ถํ์ ๊ฐ์๋ผ์ฐ๋ฏ ๋ณ๊ฒฝํ ์ ์๋ค. - ๊ฐ ๊ณ์ธต์ ํ์ ๊ณ์ธต์๋ง ์ข
์๋๊ณ ์์ ๊ณ์ธต์ผ๋ก๋ ๋
๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑํจ์ผ๋ก, ์์์ ์๋๋ก ๋จ์ด์ง๋ ๊ฐ๋จํ ๊ตฌ์กฐ๋ก ๋ง๋ ๋ค.
์ด๋ก์จ ๊ฐ Layer๋ฅผ ๋๋๋ค๋ฉด์ ๊ผฌ์ฌ์๋ ์์กด ๊ด๊ณ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
Application Layer (= Service Layer)
๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ฌถ์ด์ ์ํํธ์จ์ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํต์ฌ ์์
์ ์งํฉ์ ์ค์ ํ๋ ๊ณ์ธต์ด๋ค.
๋ณดํต ๋๋ฉ์ธ ๋ชจ๋ธ ํ๋๋ง์ผ๋ก๋ ์ํํธ์จ์ด์์ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ๋ณต์กํ ์์
์ ํ ์ ์๋ค.
๋๋ฌธ์ ์ฌ๋ฌ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ถ๋ฌ์ ๊ฐ๊ณตํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํด์ผํ๋๋ฐ ์ด๋ฐ ์์
์ ํด์ฃผ๋ Layer๊ฐ ํ์ํ๋ค.
์ฌ๊ธฐ์ ์ฌ๋ฌ ๋น์ฆ๋์ค ๋ก์ง๋ค์ ์๋ฏธ์๋ ์์ค์ผ๋ก ๋ฌถ์ด์ ์ถ์ํํ๋ ๊ฒ์ด ๋ฐ๋ก Application Layer์ด๋ค.
๋ง์ฝ ๋ณ๋์ ์บก์ํ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋๋ฉ์ธ ๋ชจ๋ธ ๊ทธ๋๋ก๋ฅผ ์ด ์๋น์ค๋ก ๋ง๋ค ์ ์๋ค.
โ ์ถ์ํ๊ฐ ํ์ํ ์ด์
๋ง์ฝ UI, Gateway ๊ฐ์ ๋ด๋ถ์ ์๋น์ค ๋ฑ ๋ค์ํ ์ธํฐํ์ด์ค๋ก๋ถํฐ ์์
์ ์์ฒญ ๋ฐ๋๋ค๋ฉด,
๊ฐ ์ธํฐํ์ด์ค์ ์ข
๋ฅ์ ๋ชฉ์ ์ด ๋ค๋ฅด๋๋ผ๋ ์ด๋ฅผ ํตํด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์์
์ด ์์ ๊ฒ์ด๋ค.
์ด ๊ณตํต์ ์ธ ์์
์ด ๊ฐ๊ฐ์์ ์ ์ํ ๊ฒฝ์ฐ ์ค๋ณต์ด ๋ฐ์ํ๋๋ฐ, ์ด๋ฅผ Service Layer์์ ์ธํฐํ์ด์ค๋ก ์ ์ํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
์ฆ, ํต์ฌ์ ์ธ API๋ฅผ ์ ๊ณตํ๋ ๊ณ์ธต์ด๋ผ๊ณ ํ ์ ์๋ค.
์ค์ํ ๊ฒ์ Service Layer๋ ์ถ์ํ ๊ณ์ธต์ผ๋ก ๋๊ณ , ํต์ฌ ๋ก์ง์ Business Layer์ ๋๋ ๊ฒ์ด ์ณ๋ค.
Business Layer (Domain Model)
๋ฐ์ดํฐ์ ์ด์ ๊ด๋ จ๋ ๋น์ฆ๋์ค ๋ก์ง์ธ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
Model ๊ฐ์ฒด๊ฐ ๋จ์ํ ํ๋์ ๊ฒํฐ, ์ธํฐ๋ง์ ๊ฐ์ง๊ณ ์์ผ๋ฉด DTO์ ๋ค๋ฅผ ๊ฒ์ด ์๋ค. (์ํฐํจํด)
์ฆ, ๋๋ฉ์ธ ๋ชจ๋ธ์์ ํด๋น ๋ฐ์ดํฐ์ ๋ํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
DAO
๋ฏธ์
์ด merge๋ ํ, ๋ฏธ์ฒ ์ง๋ฌธํ์ง ๋ชปํ ๊ฒ์ด ์์ด ํด์๊ฒ DM์ผ๋ก ์ง๋ฌธ์ ๋จ๊ฒผ๋ค.
ํ์ฌ ๋์ ๋ก์ง์์๋ chessGame ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ piece๊ฐ ํ์ํ๋ฐ,
chessgame ํ
์ด๋ธ๊ณผ piece ํ
์ด๋ธ ๊ฐ๊ฐ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ
์ด๋ฅผ service์์ ์กฐํฉํด(?) chessGame ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์์๋ค.
ํ์ง๋ง ์ฌ์ค ์ฟผ๋ฆฌ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด join์ ์ฌ์ฉํด์ chessGame ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ป์ด์ฌ ์ ์์๋ค.
SELECT turn, isFinish, color, name, position FROM chess_game cg inner join piece p WHERE cg.id = p.chessGameId;
์ฌ์ค ์ด๋ ๊ฒ join์ ํตํด์ ์ป์ด์ค๋ ค ํ์ง๋ง, dao๋ฅผ ํ
์ด๋ธ ๋ณ๋ก ๋ง๋ค์๋๋ ์ด ์ฟผ๋ฆฌ๋ฅผ ์ด๋์ ์ํํด์ผํ ์ง ํ๋จํ ์ ์์๋ค.
๋ง์ฝ chessGameDao์์ ์ํํ๋ค ํ๋๋ผ๋ ์ฌ๊ธฐ์piece ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๋ ์์ด๋ฌ๋ํ๋ค๊ณ ์๊ฐ๋ ๋ค์๋ค.
๋๋ฌธ์ ์ด๋ ๊ฒ DB์์ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋์์ ์กฐํฉํด์ผํ๋๊ฐ์ ๋ํ ์ง๋ฌธ์ ๋จ๊ฒผ๋ค.
ํด์ ๋ต๋ณ์ผ๋ก Repository์ ๋ํ ๊ฒ์ด ์ธ๊ธ๋์๋๋ฐ,
์ฌ์ค ์ด ์ง๋ฌธ ์ ์๋ ํฌ๋ฃจ๋ค๊ณผ Repository๊ฐ ๋๋์ฒด ๋ฌด์์ธ๊ฐ์ ๋ํด์ ํ ๋ก ํ์๋ค.
ํด์ ๋ต๋ณ๊ณผ ๋ณด๋ด์ฃผ์ ์ฐธ๊ณ ๋งํฌ ๋๋ถ์ Repository๊ฐ ์ด๋ค ์ญํ ์ ํ๋ ๊ฒ์ธ์ง ๋ช
ํํ ํ์
ํ ์ ์์๋ค.
DAO์ Reposotory์ ์ฐจ์ด์
DAO
- DAO ์ธํฐํ์ด์ค๋ DB์ CRUD ์ฟผ๋ฆฌ์ 1:1 ๋งค์นญ๋๋ ์ธ๋ฐํ ๋จ์์ ์คํผ๋ ์ด์ ์ ์ ๊ณตํ๋ค.
- ํ ์ด๋ธ ๋ณ๋ก ํ๋์ DAO๋ฅผ ๋ง๋ ๋ค.
- RANSACTION SCRIPT ํจํด๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ค.
- Persistence Layer์ ์ํ๋ค.
Repository
- Repository๋ ๋ค์์ DAO๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- Repository์์ ์ ๊ณตํ๋ ํ ์คํผ๋ ์ด์ ์ด DAO์ ์ฌ๋ฌ ์คํผ๋ ์ด์ ์ ๋งตํ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- DOMAIN MDOEL ํจํด๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ค.
- Domain Layer์ ์ํ๋ค.
- ๊ฐ์ฒด ์ปฌ๋ ์ ์ฒ๋ฆฌ์ ๊ดํ ์ฑ ์๋ง์ ๊ฐ์ง๊ณ ์๋ค. ์ธ๋ถ ์์คํ ๊ณผ์ ์ํธ์์ฉ์ ๋ณ๋์ Service๊ฐ ๋ด๋นํ๋ค.
๋ฐ๋ผ์ ํ์ฌ ๋์ ์ง๋ฌธ ๊ฐ์ ๊ฒฝ์ฐ๋ Repository๋ฅผ ํตํด ChessGameDao์ PieceDao๋ก๋ถํฐ
๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ๋ํ ์งํฉ ์ฒ๋ฆฌ๋ฅผ ํจ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์ด ๋์ ์ฐจ์ด์ ๋ํด์๋ ์ง๊ธ ๋จ๊ณ์์ ์ด์ ๋๋ก ์ก๊ณ ๊ฐ์ !