๐Ÿ› Facade Pattern

ozzingยท2022๋…„ 10์›” 27์ผ
0
post-thumbnail

์˜ฌํ•ด 6์›” ๋ง ์ฏค๋ถ€ํ„ฐ 8์›” ์ดˆ๊นŒ์ง€ ๋‹ฌ๋ ธ๋˜ ๋™์•„๋ฆฌ์—์„œ Spring Boot, Java, MySQL์„ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

๋™์•„๋ฆฌ์—์„œ๋Š” ์žฅ๊ณ ๋ฅผ ๊ฐ€๋ฅด์น˜๊ณ , ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์ด ํ„ฑ ์—†์ด ๋ถ€์กฑํ•˜๋˜ ํ„ฐ๋ผ ์ถฉ๋ถ„ํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ์ ์—ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ 10์›” ๋ง์ธ ์ง€๊ธˆ๊นŒ์ง€ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ค€๋น„ํ•˜๋ฉฐ ๋™์‹œ์— ๊พธ์ค€ํžˆ ๋ฆฌํŒฉํ† ๋ง ํ•ด์™”๋‹ค.

ํŠนํžˆ ๊ฐ™์ด ๊ฐœ๋ฐœํ•˜๋Š” ํŒ€์›๋„ ๋ฆฌํŒฉํ† ๋ง์˜ ํ•„์š”์„ฑ์„ ๋„ˆ๋ฌด ๋Š๊ผˆ๋˜ ํ„ฐ๋ผ, ๋…ผ์˜ ํ›„ ์ˆ˜์›”ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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

๋จผ์ € ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•˜์˜€๋‹ค.


์˜์กด์„ฑ ์ฃผ์ž…

์˜์กด์„ฑ ์ฃผ์ž…์€ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

MVC ๋ชจ๋ธ๋กœ ๊ฐœ๋ฐœํ•จ์— ์žˆ์–ด์„œ, Controller์—์„œ๋Š” Service์˜ ๋ชจ๋“ˆ์„ ํ˜ธ์ถœํ•˜๊ณ  Service์—์„œ๋Š” Repository(DAO)์˜ ๋ชจ๋“ˆ์„ ํ˜ธ์ถœํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋•Œ, Controller๋Š” Service์— ์˜์กดํ•˜๊ณ  Service๋Š” Repository์— ์˜์กดํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” UserService๊ฐ€ UserRepository์— ์˜์กดํ•˜๋ฉฐ, @RequiredArgsConstructor ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.


ACID

ACID๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ฑ์งˆ์ด๋‹ค.

Atomcity(์›์ž์„ฑ) : ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…๋“ค์ด ๋ถ€๋ถ„์ ์œผ๋กœ ์‹คํ–‰๋˜๋‹ค๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋Šฅ๋ ฅ

Consistency(์ผ๊ด€์„ฑ) : ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋ฉด ์–ธ์ œ๋‚˜ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

Isolation(๋…๋ฆฝ์„ฑ) : ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ ์‹œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์—ฐ์‚ฐ ์ž‘์—…์ด ๋ผ์–ด๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ

Durability(์ง€์†์„ฑ) : ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ ํŠธ๋žœ์žญ์…˜์€ ์˜์›ํžˆ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•จ

Spring์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


์•„ํ‚คํ…์ฒ˜

๋‹ค์Œ์€ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ๋ณ€์ฒœ์‚ฌ๋‹ค.

1์ฐจ ์•„ํ‚คํ…์ฒ˜

์ฒ˜์Œ ํ”„๋กœ์ ํŠธ์˜ ์•„ํ‚คํ…์ฒ˜๋Š” ์œ„์™€ ๊ฐ™์•˜๋‹ค. Controller์™€ Service๊ฐ€ ์ผ๋Œ€์ผ ๋งคํ•‘ ๋˜์–ด ์žˆ์—ˆ๊ณ , ๊ฐ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  Repository์— ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์˜ˆ์‹œ์˜ ๊ฐ€์กฑ ๋‚˜๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์€ ์œ ์ € ํƒˆํ‡ด ๊ธฐ๋Šฅ ์•ˆ์— ์†ํ•ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ๊ฐ™์€ ๋กœ์ง์ด ๋‹ค๋ฅธ Service(๊ฐ๊ฐ ChallengeService, FamilyService, UserService)์— ์ค‘๋ณตํ•˜์—ฌ ์กด์žฌํ•˜์˜€๊ณ , ๊ฐ„๋‹จํ•œ ๋กœ์ง์ด ๋ฐ”๋€Œ์–ด๋„ ์ผ์ผ์ด ๋ฐ”๊ฟ”์ค˜์•ผ ํ•˜๋Š” ๋“ฑ ์žฌ์‚ฌ์šฉ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์กŒ๋‹ค.

์ด๋กœ ์ธํ•ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊พธ๊ฒŒ ๋˜์—ˆ๋‹ค.

2์ฐจ ์•„ํ‚คํ…์ฒ˜

Repository(DAO)๋ฅผ Service ๋ ˆ์ด์–ด์™€ ์ผ๋Œ€์ผ๋กœ ๋งคํ•‘๋˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ , Controller ๋ ˆ์ด์–ด์˜ ์˜์กด์„ฑ์„ ๋‘ํ…๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, Controller ๊ณ„์ธต์—์„œ๋Š” @Transactional ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ ์ € ํƒˆํ‡ด ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ, ๊ฐ€์กฑ ๊ตฌ์„ฑ์› ์‚ญ์ œ ์ดํ›„ ์œ ์ € ์‚ญ์ œ๊ฐ€ ์ผ๋ จ์˜ ๊ณผ์ •์œผ๋กœ ๊ทธ ์›์ž์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Service ๋ ˆ์ด์–ด์—์„œ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋งŒ์œผ๋กœ๋Š” ์œ ์ € ์‚ญ์ œ์—์„œ DB ๋ณ€๊ฒฝ์— ์‹คํŒจํ•ด๋„ ๊ฐ€์กฑ ๊ตฌ์„ฑ์› ์‚ญ์ œ๋กœ ์ด๋ฏธ ๋ฐ”๋€ ๋ฐ์ดํ„ฐ๋Š” ๋กค๋ฐฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ACID๊ฐ€ ๋ฐ•์‚ด์ด ๋‚œ๋‹ค.

๊ณ ๋ฏผ ๋์— Service ๋ ˆ์ด์–ด๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

3์ฐจ ์•„ํ‚คํ…์ฒ˜

์œ„์™€ ๊ฐ™์ด ๋ ˆ์ด์–ด๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ–ˆ๊ณ , ์ด๋ฆ„์€ Mapper๋ผ๊ณ  ์ง€์—ˆ๋‹ค.

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

๋˜, Service ๋ ˆ์ด์–ด์—์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ๊ฒ€์ฆ์„ ํ•˜๊ณ  Mapper์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋“ฑ ๊ทธ ๊ธฐ๋Šฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๋‹ค. Mapper ๋ ˆ์ด์–ด์—์„œ Controller๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” DTO๋กœ ๊ฐ์‹ธ, Entity ์ž์ฒด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์กฑ ๋‚˜๊ฐ€๊ธฐ์™€ ์œ ์ € ํƒˆํ‡ด ๊ธฐ๋Šฅ ์—ญ์‹œ ์œ„์™€ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋ง ๋˜์—ˆ๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋‚˜์˜จ ๋ฌธ์ œ๋“ค์€ ๋ชจ๋‘ ๋ณด์™„ํ•ด์ค€ ์•„ํ‚คํ…์ฒ˜์ด์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์„๊นŒ ๊ณ ๋ฏผ์ด ๋œ๋‹ค.


์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌด์กฐ๊ฑด ์ด๊ฒŒ ๋งž๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์—†์–ด์„œ ๋” ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค.
DDD๋ฅผ ๊ณต๋ถ€ ์ค‘์ธ๋ฐ, ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—๋Š” DDD๋ฅผ ์ ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€