๐ ํผ์ฌ๋(Facade) ํจํด - ์๋ฒฝ ๋ง์คํฐํ๊ธฐ
Facade Pattern
ํผ์ฌ๋ ํจํด(Facade Pattern)์ ์ฌ์ฉํ๊ธฐ ๋ณต์กํ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ๊ฐํธํ ์ธํฐํ์ด์ค(API)๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ๊ตฌ์กฐ ํจํด ์ด๋ค. ์๋ฅผ๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ ํด๋์ค์ ๋ฉ์๋๋ค์ด ์ด๋ค ๋ชฉ์ ์ ๋์์ธ์ง ์ดํดํ๊ธฐ ์ด๋ ค์ ๋ฐ๋ก ๊ฐ์ ธ๋ค ์ฐ๊ธฐ์๋ ๋์ด๋๊ฐ ๋์๋, ์ด์ ๋ํ ์ ์ ํ ๋ค์ด๋ฐ๊ณผ ์ ๋ฆฌ๋ฅผ ํตํด ์ฌ์ฉ์๋ก ํ์ฌ๊ธ ์ฝ๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ์ ์๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ๊ต์ ๋ฅผ ๋ณด๊ณ ํ๊ธฐ๋ ธํธ์ ์ฌ์ ๋ฆฌ๋ฅผ ํ๋ฏ์ด ํด๋์ค๋ฅผ ์ฌ์ ๋ฆฌํ๋ ํ์๋ก ๋ณด๋ฉด ๋๋ค.
๋ณธ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ๊ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ์ ์ปค์ง๊ฒ ๋๋ค. ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ์๋ก ๋ง์ ํด๋์ค๋ค์ด ๋ง๋ค์ด์ ธ ์๋ก ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด์ ์ ์ ๋ณต์กํด์ง๊ฒ ๋๋ค. ๊ทธ๋์ ์ปค๋ค๋ ์๋ฃจ์ ์ ๊ตฌ์ฑํ๋ ค๋ฉด ์ํธ ๊ด๋ จ๋ ๋ง์ ํด๋์ค๋ค์ ์ ์ ํ ์ ์ดํด์ผ ํ ํ์์ฑ์ด ์๋ค. ์ด๋ ์ด ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ดํ๋ ๊ฒ์ด ์๋ ์ผ์ข ์ '์ฐฝ๊ตฌ'๋ฅผ ์ค๋นํ์ฌ ์ค๊ณํ ์ ์๋๋ก ๊ตฌ์ฑํด์ค๋ค๋ฉด, ์ฌ์ฉ์๋ ์ฐฝ๊ตฌ๋ฅผ ํตํด์ ๊ฐ๋จํ ๋ช ๋ น ์๊ตฌ๋ง ๋ด๋ฆฌ๋ฉด ์๊ตฌ์ ๋ํด ํ์ํ ๋ชจ๋ ์ง์ฝ์ ํ์๋ค์ ์ฐฝ๊ตฌ๊ฐ ์์์ ์ฒ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ๋ด์ฃผ๊ฒ ๋๋ค.
์ด์ฒ๋ผ ํผ์ฌ๋(Facade) ํจํด์ ๋ณต์กํ๊ฒ ์ฝํ ์๋ ๊ฒ์ ์ ๋ฆฌํด์ ์ฌ์ฉํ๊ธฐ ํธํ ์ธํฐํ์ด์ค๋ฅผ ๊ณ ๊ฐ์๊ฒ ์ ๊ณตํ๋ค๊ณ ๋ณด๋ฉด๋๋ค. ๊ทธ๋์ ๊ณ ๊ฐ์ ๋ณต์กํ ์์คํ ์ ์ ํ์์์ด ์์คํ ์ ์ธ๋ถ์ ๋ํด์ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ํผ์ฌ๋๋ฅผ ์ด์ฉํ๋ฉด ์์นซ ๋์์ ๋ชฉ์ ๊ณผ ๊ฐ์ ์ค์ํ ์ฌํญ์ ๋์น๋ ์ค์๋ฅผ ์ค์ผ ์ ์๋ค.
Facade๋ผ๋ ๋จ์ด์ ๋ป์ ๊ฑด์ถ๋ฌผ์ ์ ๋ฉด์ ์๋ฏธํ๋ค. ๊ฑด์ถ๋ฌผ์ ์ ๋ฉด์ ๋ณดํต ๊ฑด์ถ๋ฌผ์ ์ด๋ฏธ์ง์ ๊ฑด์ถ ์๋๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์ค๋ ์ ๋ถํฐ ํน๋ณํ ๋์์ธ์ ์ ์ฉํ์ฌ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ค. ์ด์ฒ๋ผ ๊ฑด์ถ๋ฌผ ์ ๋ฉด๋ง ๋ด๋ ์ด ๊ฑด๋ฌผ์ด ์ด๋ค ๋ชฉ์ ์ ํ๋์ง ๋จ๋ฒ์ ์์ ์๋ค๋ ํน์ง์ ์ฐจ์ฉํ์ฌ ๋ช ๋ช ์ง์ ๊ฒ์ด๋ค.
ํผ์ฌ๋ ํจํด ๊ตฌ์กฐ
- Facade : ์๋ธ์์คํ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ฌ๋ฌ ์์คํ ๊ณผ ์ํธ ์์ฉํ๋ ๋ณต์กํ ๋ก์ง์ ์ฌ์ ๋ฆฌํด์ ๋์ ๋ ๋ฒจ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ค. Facade ์ญํ ์ ์๋ธ ์์คํ ์ ๋ง์ ์ญํ ์ ๋ํด ‘๋จ์ํ ์ฐฝ๊ตฌ’๊ฐ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ธ์์คํ ์ด ์๋ก ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋์ง ์๋๋ก ํ๋ค.
- Additional Facade : ํผ์ฌ๋ ํด๋์ค๋ ๋ฐ๋์ ํ๊ฐ๋ง ์กด์ฌํด์ผ ํ๋ค๋ ๊ท์น๊ฐ์ ๊ฑด ์๋ค. ์ฐ๊ด ๋์ง ์์ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด ์ผ๋ง๋ ์ง ํผ์ฌ๋ 2์ธ๋ก ๋ถ๋ฆฌํ๋ค. ์ด ํผ์ฌ๋ 2์ธ๋ ๋ค๋ฅธ ํผ์ฌ๋์์ ์ฌ์ฉํ ์๋ ์๊ณ ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํ ์๋ ์๋ค.
- SubSystem(ํ์ ์์คํ ) : ์์ญ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ํด๋์ค๋ค
- Client : ์๋ธ ์์คํ ์ ์ง์ ์ ๊ทผํ๋ ๋์ Facade๋ฅผ ์ฌ์ฉํ๋ค.
ํผ์ฌ๋ ํจํด์ ์ ๋ต ํจํด์ด๋ ํฉํ ๋ฆฌ ํจํด๊ณผ ๊ฐ์ ์ฌํ ๋ค๋ฅธ ๋์์ธ ํจํด๊ณผ๋ ๋ค๋ฅด๊ฒ ํด๋์ค ๊ตฌ์กฐ๊ฐ ์ ํํ ๋์ง ์์ ํจํด์ด๋ค. ๋ฐ๋์ ํด๋์ค ์์น๋ ์ด๋ป๊ณ ์ด๋ค ํ์์ผ๋ก ์์์ ํด์ผ๋๊ณ ์ด๋ฐ๊ฒ์ด ์๋ค. ๊ทธ๋ฅ ํผ์ฌ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ ์ ํ ๊ธฐ๋ฅ ์ง์ฝํ๋ง ํด์ฃผ๋ฉด ๊ทธ๊ฒ ๋์์ธ ํจํด์ด ๋๋ ๊ฒ์ด๋ค. (ํจํด์ด๋ผ๊ธฐ ๋ณด๋จ ๋ ผ๋ฆฌ์ ๊ฐ๊น๋ค)
C์ธ์ด๋ ํ์ด์ฌ์์ ์ด๋ ํ ๋ณต์กํ ๋ก์ง์ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ด๊ฑธ main ํจ์์์ ๋ชจ๋ ์คํํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์(function) ๋ถ๋ฆฌ๋ฅผ ํตํด main ํจ์์ ์ฝ๋๋ฅผ ์ฌํํ๊ฒ ๊ตฌ์ฑํด๋ณธ ๊ฒฝํ์ด ์์ ๊ฒ์ด๋ค. ์ด๋ฅผ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๊ด์ ์ผ๋ก ์นํํ ๊ฒ์ด ํผ์ฌ๋ ํจํด์ด๋ค. ์ฆ, ํผ์ฌ๋๋ ๋ณต์กํ ๊ฒ(๋ด๋ถ์์ ์คํ๋๊ณ ์๋ ๋ง์ ํด๋์ค์ ๊ด๊ณ๋ ์ฌ์ฉ๋ฒ)์ ๋จ์ํ๊ฒ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ด์ ์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ก ํ์ฌ๊ธ ๋ณต์กํ ๊ฒ์ ์์ํ์ง ์๋๋ก ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ฌ๊ท์ ์ธ Facade ํจํด์ ์ ์ฉ
์ฌ๊ท์ ํผ์ฌ๋๋ ์์์ ์ธ๊ธํ Additional Facade ๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค. ์๋ฅผ๋ค์ด ๋ค์์ ํด๋์ค, ๋ค์์ ํจํค์ง๋ฅผ ํฌํจํ๊ณ ์๋ ํฐ ์์คํ ์ ์์ ์์ ๋ง๋ค Facade ํจํด์ ์ฌ๊ธฐ ์ ๊ธฐ ์ ์ฉํ๊ณ ๋ค์ ๊ทธ Facade๋ฅผ ํฉ์น Facade๋ฅผ ๋ง๋๋ ์์ผ๋ก, ํผ์ฌ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌ์ฑํ๋ฉด ์์คํ ์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๋๋ค. ์ด์ฒ๋ผ ํผ์ฌ๋๋ ํ๊ฐ๋ง ์์ผ๋ผ๋ ๋ฒ์ ์์ผ๋ฉฐ ํ์์ ์ํ๋ฉด ์ผ๋ง๋ ์ง ๋๋ ค ์์กดํ ์ ์๋ค.
ํผ์ฌ๋ ํจํด ํน์ง
ํจํด ์ฌ์ฉ ์๊ธฐ
- ์์คํ ์ด ๋๋ฌด ๋ณต์กํ ๋
- ๊ทธ๋์ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ณต์กํ ์์คํ ์ ์ ๊ทผํ๋๋ก ํ๊ณ ์ถ์๋
- ์์คํ ์ ์ฌ์ฉํ๊ณ ์๋ ์ธ๋ถ์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋์ ๋ ์์กด์ฑ ๋ฎ์ถ๊ธฐ ์ํ ๋
ํจํด ์ฅ์
- ํ์ ์์คํ ์ ๋ณต์ก์ฑ์์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ, ์ธ๋ถ์์ ์์คํ ์ ์ฌ์ฉํ๊ธฐ ์ฌ์์ง๋ค.
- ํ์ ์์คํ ๊ฐ์ ์์กด ๊ด๊ณ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ฐ์์ํค๊ณ ์์กด์ฑ์ ํ ๊ณณ์ผ๋ก ๋ชจ์ ์ ์๋ค.
- ๋ณต์กํ ์ฝ๋๋ฅผ ๊ฐ์ถค์ผ๋ก์จ, ํด๋ผ์ด์ธํธ๊ฐ ์์คํ ์ ์ฝ๋๋ฅผ ๋ชจ๋ฅด๋๋ผ๋ Facade ํด๋์ค๋ง ์ดํดํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ธ๋ถ์์ ๋ด๋ถ ๋ก์ง์ ์ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ๋ก์ง์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ํ๊ฑฐ๋ ํ๋ผ๋ฏธํฐ๋ ๋ฆฌํด๊ฐ ๋ฑ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ์ง์ ์ ์ผ๋ก ์ํฅ์ ๋ฐ์ ์์ ์ดํ๋ค๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค. ํ์ง๋ง ์ค๊ฐ์ ๋งค๊ฐ์ฒด ์ญํ ์ ํด์ฃผ๋ ํผ์ฌ๋ ๊ฐ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ด๋ถ ๋ก์ง์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ์ด ๋๋๋ผ๋ ์๊ด์ด ์์ด์ง๋ฏ๋ก ์์กด์ฑ์ด ๊ฐ์๋๋ค.
ํจํด ๋จ์
- ํผ์ฌ๋๊ฐ ์ฑ์ ๋ชจ๋ ํด๋์ค์ ๊ฒฐํฉ๋ God ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ค
- ํผ์ฌ๋ ํด๋์ค ์์ฒด๊ฐ ์๋ธ์์คํ ์ ๋ํ ์์กด์ฑ์ ๊ฐ์ง๊ฒ ๋์ด ์์กด์ฑ์ ์์ ํ๋ ํผํ ์๋ ์๋ค.
- ์ด์ฐ๋์๊ฑด ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ๋์ด๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๊ณต์๊ฐ ๋ ๋ง์ด ๋ค๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ ์ถ์ํ ํ๊ณ ์ํ๋ ์์คํ ์ด ์ผ๋ง๋ ๋ณต์กํ์ง ํผ์ฌ๋ ํจํด์ ํตํด์ ์ป๊ฒ ๋๋ ์ด์ ๊ณผ ์ถ๊ฐ์ ์ธ ์ ์ง๋ณด์ ๋น์ฉ์ ๋น๊ตํด๋ณด๋ฉฐ ๊ฒฐ์ ํ์ฌ์ผ ํ๋ค.
์์ ๋ฅผ ํตํด ์์๋ณด๋ Facade ํจํด
๋ณต์กํ DBMS ์์คํ ๊ฐํธํ๊ฒ ์ฌ๊ตฌ์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ์ถ๋ ฅํด์ฃผ๋ JDBC ๋น์ค๋ฌด๋ฆฌํ ์๋ฐ ํจํค์ง๊ฐ ์๋ค๊ณ ํ์. ์ฐ๋ฆฌ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๊ฐ์ ์ป์ด์ค๊ณ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ฑํด์ ์์๊ฒ ์ถ๋ ฅํ๋ ค๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ ค๊ณ ํ๋ค.
ํจํค์ง์๋ ์ด 4๊ฐ์ Cache, DBMS, Row, Message ํด๋์ค๊ฐ ์กด์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ ๊ทธ๋ฆผ์์ ๋ณผ ์ ์๋ฏ์ด ๊ฐ ํ์์ ๋ํด ๊ฐ ํด๋์ค๋ค์ ์ญํ ์ด ์ ํด์ ธ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋๋ฐ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ธฐ ๊น์ง ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ด ์กด์ฌํ๋ค๊ณ ํ๋ค.
- dbms๋ฅผ ๋ฐ๋ก ์กฐํํ๊ธฐ์ ์
- ๊ณผ๊ฑฐ์ ์กฐํ๋ ๋ฐ์ดํฐ์ธ์ง๋ฅผ ์บ์์์ ๋จผ์ ์กฐ์ฌ๋ฅผ ํ๊ณ
- ์บ์์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ด ์บ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ ์ถ๋ ฅ
- ์บ์์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด DBMS๋ฅผ ํตํด์ ์กฐํ๋ฅผ ํ๊ณ
- ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ ์ถ๋ ฅํจ๊ณผ ๋์์ ์บ์์ ์ ์ฅํ๋ค.
DBMS์ ์กฐํ๋ ๋ฐ์ดํฐ๋ ์ฑ๋ฅ์ ์ํด ๋ฐ๋์ ์บ์์ ์ ์ฅํด์ผ ๋๋ ๊ฒ์ ์์ง ๋ง์์ผํ๊ณ , ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ธฐ ์ํด์๋ Message ํด๋์ค๋ฅผ ์จ์ผ ํ๋ค. ์ด ์์น์ ๋ฐ๋ฅด์ง ์์ผ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋๋ก ์๋ํ์ง ์์ ๊ฐ๋ฐ์๋ ์์ ์ฌํญ์ ์ ๋๋ก ์์งํ ์ํ์์ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฌ์ผ ํ๋ค.
์ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ ํด๋์ค์ ๋ํ ์์ ์ ์ธ ์ฝ๋๋ ์๋์ ๊ฐ๋ค๊ณ ํ๋ค.
// DBMS์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ํด๋์ค
class Row {
private String name;
private String birthday;
private String email;
public Row(String name, String birthday, String email) {
this.name = name;
this.birthday = birthday;
this.email = email;
}
public String getName() {
return name;
}
public String getBirthday() {
return birthday;
}
public String getEmail() {
return email;
}
}
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ญํ ์ ํ๋ ํด๋์ค
class DBMS {
private HashMap<String, Row> db = new HashMap<>();
public void put(String name, Row row) {
db.put(name, row);
}
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ๋ฉ์๋
public Row query(String name) {
try {
Thread.sleep(500); // DB ์กฐํ ์๊ฐ์ ๋น์ ํ์ฌ 0.5์ด๋๊ธฐ๋ก ๊ตฌํ
} catch(InterruptedException e) {}
return db.get(name.toLowerCase());
}
}
// DBMS์์ ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ๋ด์๋๋ ํด๋์ค (์๋ ํฅ์)
class Cache {
private HashMap<String, Row> cache = new HashMap<>();
public void put(Row row) {
cache.put(row.getName(), row);
}
public Row get(String name) {
return cache.get(name);
}
}
// Row ํด๋์ค๋ฅผ ๋ณด๊ธฐ์ข๊ฒ ์ถ๋ ฅํ๋ ํด๋์ค
class Message {
private Row row;
public Message(Row row) {
this.row = row;
}
public String makeName() {
return "Name : \"" + row.getName() + "\"";
}
public String makeBirthday() {
return "Birthday : " + row.getBirthday();
}
public String makeEmail() {
return "Email : " + row.getEmail();
}
}
ํด๋ฆฐํ์ง ์์ ๋ฌธ์ ์ ์ฝ๋ โ
๋ฌธ์ ์ ์ฝ๋๋ ๋น์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ฉ์ธ ๋ก์ง์ ์์ฑํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ถ๋ ฅ๋๊ธฐ ๊น์ง ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๊ณ ์๋ค.
๋ฌผ๋ก ๋น์ฅ์ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ๋์๊ฐ ์๋น์ค์๋ ๋ฌธ์ ๊ฐ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋์ค์ ์์ ๊ณผ ํ์ฅํจ์ ์์ด ๊ฐ๋ฐ์๊ฐ ์์ ์์น๋ค์ ๊น๋จน๊ณ ์ค์๋ฅผ ํ์ฌ ์๋น์ค์ ๋ฒ๊ทธ๊ฐ ์๊ธธ์ ์๋ค.
class Client {
public static void main(String[] args) {
// 1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ & ๋ฑ๋ก
DBMS dbms = new DBMS();
dbms.put("ํ๊ธธ๋", new Row("ํ๊ธธ๋", "1890-02-14", "honggildong@naver.com"));
dbms.put("์๊บฝ์ ", new Row("์๊บฝ์ ", "1820-11-02", "imgguckjong@naver.com"));
dbms.put("์ฃผ๋ชฝ", new Row("์ฃผ๋ชฝ", "710-08-27", "jumong@naver.com"));
// 2. ์บ์ ์์ฑ
Cache cache = new Cache();
// 3. ํธ๋์ญ์
์ ์์ ๋จผ์ ์บ์์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ์กฐํ
String name = "ํ๊ธธ๋";
Row row = cache.get(name);
// 4. ๋ง์ฝ ์บ์์ ์๋ค๋ฉด
if (row == null){
row = dbms.query(name); // DB์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ row์ ์ ์ฅํ๊ณ
if(row != null) {
cache.put(row); // ์บ์์ ์ ์ฅ
}
}
// 5. dbms.query(name)์์ ์กฐํ๋ ๊ฐ์ด ์์ผ๋ฉด
if(row != null) {
Message message = new Message(row);
System.out.println(message.makeName());
System.out.println(message.makeBirthday());
System.out.println(message.makeEmail());
}
// 6. ์กฐํ๋ ๊ฐ์ด ์์ผ๋ฉด
else {
System.out.println(name + " ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
}
}
ํผ์ฌ๋ ํจํด์ ์ ์ฉํ ์ฝ๋ โ๏ธ
๋ฐ๋ผ์ ์ด๋ฌํ ์ฌํญ๋ค์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ธฐ์ตํด์ ํ๋ํ๋ ๋ฐ์ ธ๊ฐ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค, ์ด ์ฌํญ๋ค์ ๋ฌถ์ ํด๋์ค๋ฅผ ํ๋ ์ถ๊ฐํด์ ๋จ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ธ ํด๋์ค๋ฅผ ๋ค๋ฃธ์ผ๋ก์จ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ์ค์ด๊ณ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ํผ์ฌ๋(Facade) ํจํด์ด๋ค. ๋ง์น ๊ต์ ์ ์๋ ํ์ด์ ธ ์๋ ๋ด์ฉ๋ค์ ํ๊ธฐ๋ ธํธ์ ์์ฝํ๋ฏ์ด, ํผ์ฌ๋ ๊ฐ์ฒด์ ์ฌ์ฉ ๋ก์ง์ ๋ฌถ์ด ์ฌ์ ๋ฆฌ ํจ์ผ๋ก์จ ๋จ์ํ ์์ผ ๊ฐ๋ฐ์ ๋ณด๋ค ์ฉ์ดํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ํผ์ฌ๋ ํด๋์ค๋ฅผ ์์ฑํด ์ฃผ๊ณ ๋ฉ์ธ ๋ฉ์๋์ ๋ก์ง์ ํผ์ฌ๋ ํด๋์ค์ ๋ฉ์๋์ ํต์ง๋ก ๋ฃ๋๋ค. (๋ถ๋ฆฌ๊ฐ ํ์ํ๋ฉด ๋ฉ์๋๋ฅผ ๋ ๋๋ฆฐ๋ค)
class Facade {
private DBMS dbms = new DBMS();
private Cache cache = new Cache();
public void insert() {
dbms.put("ํ๊ธธ๋", new Row("ํ๊ธธ๋", "1890-02-14", "honggildong@naver.com"));
dbms.put("์๊บฝ์ ", new Row("์๊บฝ์ ", "1820-11-02", "imgguckjong@naver.com"));
dbms.put("์ฃผ๋ชฝ", new Row("์ฃผ๋ชฝ", "710-08-27", "jumong@naver.com"));
}
public void run(String name) {
Row row = cache.get(name);
// 1. ๋ง์ฝ ์บ์์ ์๋ค๋ฉด
if (row == null){
row = dbms.query(name); // DB์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ row์ ์ ์ฅํ๊ณ
if(row != null) {
cache.put(row); // ์บ์์ ์ ์ฅ
}
}
// 2. dbms.query(name)์์ ์กฐํ๋ ๊ฐ์ด ์์ผ๋ฉด
if(row != null) {
Message message = new Message(row);
System.out.println(message.makeName());
System.out.println(message.makeBirthday());
System.out.println(message.makeEmail());
}
// 3. ์กฐํ๋ ๊ฐ์ด ์์ผ๋ฉด
else {
System.out.println(name + " ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
}
}
class Client {
public static void main(String[] args) {
// 1. ํผ์ฌ๋ ๊ฐ์ฒด ์์ฑ
Facade facade = new Facade();
// 2. db ๊ฐ insert
facade.insert();
// 3. ํผ์ฌ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค & ์บ์ฑ & ๋ฉ์ธ์ง ๋ก์ง์ ํ๋ฒ์ ์กฐํ
String name = "ํ๊ธธ๋";
facade.run(name);
}
}
ํผ์ฌ๋ ํจํด์ ์ ์ฉํ๋ ๋ฉ์ธ ๋ก์ง์ด ์์ฒญ ์ฌํํด์ก๋ค. ์ด์ฒ๋ผ ํผ์ฌ๋์ ํต์ฌ์ ์ธํฐํ์ด์ค(API)๋ฅผ ์ ๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํด๋์ค๋ ๋ฉ์๋๊ฐ ๋ง์ด ๋ณด์ด๋ฉด, ํ๋ก๊ทธ๋๋จธ๋ ๋ฌด์์ ์ฌ์ฉํ๋ฉด ์ข์์ง ๋ง์ค์ด๊ฒ ๋๊ณ ํธ์ถํ๋ ์์๋ doc์ ์ดํด๋ณด๋ฉฐ ์ฃผ์ํด์ผ๋ง ํ๋ค. ์ฃผ์ํด์ผ ํ๋ค๋ ๋ง์ ๋ค๋ฅด๊ฒ ๋งํ๋ฉด ํ๋ฆฌ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํผ์ฌ๋์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฅํ ์ ๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข๋ค.
์คํดํ์ง ๋ง์์ผ ํ ์ ์ ํผ์ฌ๋๋ ํ์ ์์คํ ํด๋์ค๋ค์ ์บก์ํ ํ๋ ๊ฒ์ด ์๋๋ค. ๊ทธ๋ฅ ์๋ธ ์์คํ ๋ค์ ์ฌ์ฉํ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ๋ฟ ์ด๋ค. ์ฌ์ฉ์๊ฐ ์๋ธ ์์คํ ๋ด๋ถ์ ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ ์๋ ์๋ค. ๊ทธ๋์ ์คํ๋ ค ์ถ์ํ์ ๊ฐ๊น๋ค๊ณ ๋ณผ ์ ์๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํผ์ฌ๋ ๊ฐ์ฒด๋ ํ๋๋ง ์์ด๋ ์ถฉ๋ถํ๋ฏ๋ก, ํผ์ฌ๋ ํด๋์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ตฌ์ฑํด์ฃผ๋ฉด ์ข๋ค.
# ์ฐธ๊ณ ์๋ฃ
์ฝ๋ฉ์ผ๋ก ํ์ตํ๋ GoF์ ๋์์ธ ํจํด - ๋ฐฑ๊ธฐ์
https://youtu.be/mQlOqyFE3oI
https://refactoring.guru/design-patterns/facade
http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/facade.html