๐Ÿ•น Level 1. ์ฒด์Šค ๋ฏธ์…˜ ์ •๋ฆฌ - Service Layer, DAO์™€ Repository


MVC์™€ Service

์ด๋ฒˆ ๋ฏธ์…˜์—์„œ DB๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ MVC ํŒจํ„ด์— ์ถ”๊ฐ€๋กœ Service ๋ ˆ์ด์–ด๋ฅผ ๋„์ž…ํ•˜์˜€๋‹ค.
๋˜ํ•œ DAO์™€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ DTO๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, DTO๋ฅผ ์ •๋ฆฌํ•˜๊ณ  DAO์— ๋Œ€ํ•ด์„œ๋„ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๋ถ€๋ถ„์ด ๋งŽ์•„ ์ •๋ฆฌ โœ๏ธ

image

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

๋•Œ๋ฌธ์— ํœด๊ฐ€ ์ฃผ์‹  MVC ํŒจํ„ด๊ณผ Service ๋ ˆ์ด์–ด์— ๊ด€ํ•œ ๊ธ€์„ ์ฝ๊ณ  ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.
๊ฐ ๊ณ„์ธต์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ์กฐ๊ธˆ์”ฉ ์ƒ์ดํ•˜๋‹ˆ ์ผ๋‹จ ๋ธ”๋กœ๊ทธ ๊ธ€์€ ์„œ๋น„์Šค ๊ณ„์ธก๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์ •๋„๋งŒ ํ•œ ์ˆ˜์ค€์—์„œ ์ •๋ฆฌํ•˜๊ณ  ๋‹ค์Œ ๋ ˆ๋ฒจ์—์„œ ์ƒ์„ธํžˆ ์žก์•„๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

Layered Architecture

Layered Architecture โ€“ @hgraca

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. 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 ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ๋‹ค.

image

ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 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์™€ 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๋กœ๋ถ€ํ„ฐ
๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง‘ํ•ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋‘˜์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ง€๊ธˆ ๋‹จ๊ณ„์—์„œ ์ด์ •๋„๋กœ ์žก๊ณ  ๊ฐ€์ž !