2.1 ์ด๋ํฐ
์ด๋ํฐ(Adapter)๋ ํน๋ณํ ์์ฑ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ ํ ์ ์๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ ์ฌ์ฉ์ ๊ตฌ์ฑํ๋๋ก ์ค๊ณ๋ ๊ตฌ์กฐ์ ์ค๊ณ ํจํด์ ๋๋ค.
๊ณต์์ ์ธ ์ ์๋ ์กฐ๊ธ ๊น๋ค๋กญ์ง๋ง, ์์ ์ ๋ง๋ก ์ค๋ช ํ๋ฉด ์ด๋ํฐ๋ ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ํจ๊ป ์๋ํ๋๋ก ํ์ฉํ๋ ๋์์ธ ํจํด์ ๋๋ค .

ํน๋ณํ ์์ฑ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ ํ ์ ์๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ ์ฌ์ฉ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค . ํ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋ ์ถ๊ฐ ํด๋์ค๊ฐ ์์ฑ๋๊ณ ์ด ํด๋์ค๋ ์ํ๋ ๊ฐ์ฒด(ํ์ ์ธํฐํ์ด์ค๊ฐ ์์)์ ๋ฉ์๋๋ฅผ ์ฐจ๋ก๋ก ํธ์ถํฉ๋๋ค.
์ค์ํ! ์ฝ๋์์ ํด๋์ค์ ์ ๋ฏธ์ฌ ์ด๋ํฐ๋ฅผ ๋ง๋๋ฉด ์ด ํด๋์ค๊ฐ ์ด๋ํฐ ์ญํ ์ ํ๊ณ ์์์ ์ค๋ช ํ ์ฒด๊ณ์ ๋ฐ๋ผ ์๋ํ๋ ํด๋์ค ๊ทธ๋ฃน๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ์๊ฐํ ๊ถ๋ฆฌ๊ฐ ์์ต๋๋ค.
์์คํ ์ด ํ์ํ ๋ฐ์ดํฐ ๋ฐ ๋์์ ์ง์ํ์ง๋ง ๋ถ์ ์ ํ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค . ์ด๋ํฐ ํจํด์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ ์ ๊ท ๋๋ ๊ธฐ์กด ์ถ์ ํด๋์ค์์ ์์๋๋ ํด๋์ค๋ฅผ ์์ฑํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค.
๊ฐ์ :
- ๋ค๋ฅธ ์ธ๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ ํ์ ์์คํ ์์ฒด๋ฅผ ์ฌ์์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ํ๋ ์ด์์ ์ด๋ํฐ ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
- ์ธ๋ถ ํด๋์ค(์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค) ๊ตฌํ๊ณผ์ ๋ ๋ฆฝ์ฑ. ๋น์ ์ ํ๋ก๊ทธ๋จ์ ์ธ๋ถ ํด๋์ค์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋ ๋ฆฝ์ ์ด ๋ฉ๋๋ค.
2.2 ๋ฐ์ฝ๋ ์ดํฐ
๋ฐ์ฝ๋ ์ดํฐ๋ ๊ฐ์ฒด์ ์ถ๊ฐ ๋์์ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด ์๋ธํด๋์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ๋ฅญํ๊ณ ์ ์ฐํ ๋์์ ์ ๊ณตํฉ๋๋ค.

์ถ๊ฐ ์๋ฌด๋ฅผ ๊ฐ์ฒด์ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค .
๋ง์ ๋ถ๋ค์ด ์ง๋ฌธํ์ค ๊ฒ์ ๋๋ค. ์ด๋ป๊ฒ ๋์ ์ผ๋ก(ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์) ๊ฐ์ฒด์ ์ ๋์์ ์ถ๊ฐํ ์ ์์ต๋๊น? ๊ฐ์ฒด๋ ์กฐ๊ฐ, ์ฆ ์์ ๊ฐ์ฒด๋ก ์กฐ๋ฆฝํ ์ ์์ต๋๋ค. ์๋ธ๋ฆฟ์ ํํฐ ์ฒด์ธ์ ๊ธฐ์ตํ์ญ๋๊น? ๋๋ filter(), map(), list()๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋ Stream API?
IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);
๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ :
- ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ด๋์์๋ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅ: ConcreteComponent ๊ฐ์ฒด์ ์ฃผ์ ๊ธฐ๋ฅ ์์ด๋ ๋ค์.
2.3 ํ๋ก์
ํ๋ก์ ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํ๋ โโ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ผ๋ก ๋ชจ๋ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ ์ ๋ฌํฉ๋๋ค.

ํ๋ก์ ํจํด์ ์ค์ ๊ฐ์ฒด ๋์ ๋์ฒด ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์๋ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํฉ๋๋ค. ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
Mockito ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ Mockito.spy() ๋ฉ์๋ ๋๋ @Spy ์ฃผ์์ ์ฌ์ฉํ์ฌ ์ค์ ๊ฐ์ฒด์ ๋ํ ํธ์ถ์ ๊ฐ๋ก์ฑ ๋ฐฉ๋ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ๊ทธ๋ฐ ๋ค์ ์๋ ๊ฐ์ฒด์ ๋ํ ๋ชจ๋ ํธ์ถ์ด ์ ๋ฌ๋๋ ํน์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ์ฒด์ ๊ท์น์ ์ถ๊ฐํ์ฌ ์ด๋ฌํ ํธ์ถ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ง์ต๋๋ค. ์๋ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ ๊ฐ์ฒด ์์ ์ด ํจ์ฌ ๋ ์ ์ฐํด์ง๋๋ค. ์ฝ๋์์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ์ง ์๊ณ ์ด๋๊ฐ์ ์ ๋ฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ์ ๋ ๋ฆฝ์ ์ธ ๋ ๊ฐ์ฒด์ ํต์ ์ ์ ์ดํฉ๋๋ค.
๋ชฉ์ ๋ณ ํ๋ก์ ์ ํ :
- ๋ก๊น ํ๋ก์ : "์ ๋ชฉ"์ ๋ํ ๋ชจ๋ ํธ์ถ์ ํด๋น ๋งค๊ฐ๋ณ์์ ํจ๊ป ๊ธฐ๋กํฉ๋๋ค.
- ์๊ฒฉ ํ๋ก์ (์๊ฒฉ ํ๋ก์): ๋ค๋ฅธ ์ฃผ์ ๊ณต๊ฐ์ด๋ ์๊ฒฉ ์์คํ ์ ์๋ "์ฃผ์ฒด"์์ ํต์ ์ ์ ๊ณตํฉ๋๋ค. ๋ํ ์์ฒญ๊ณผ ํด๋น ์ธ์๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ์ธ์ฝ๋ฉ๋ ์์ฒญ์ ์ค์ "์ ๋ชฉ"์ผ๋ก ๋ณด๋ด๋ ์ผ์ ๋ด๋นํ ์๋ ์์ต๋๋ค.
- ๊ฐ์ ํ๋ก์ (๊ฐ์ ํ๋ก์): ์ค์ "์ ๋ชฉ"์ด ์ค์ ๋ก ํ์ํ ๋๋ง ์์ฑ๋๋๋ก ํฉ๋๋ค. ๋ํ ์์ฑ์ ์ง์ฐ์ํค๊ธฐ ์ํด ์ค์ "์ ๋ชฉ"์ ๋ํ ์ผ๋ถ ์ ๋ณด๋ฅผ ์บ์ํ ์ ์์ต๋๋ค.
- Copy-on-write : ํด๋ผ์ด์ธํธ๊ฐ ํน์ ์์ ์ ์ํํ ๋ "์ฃผ์ฒด"์ ๋ณต์ฌ๋ณธ์ ์ ๊ณตํฉ๋๋ค("๊ฐ์ ํ๋ก์"์ ํน์ํ ๊ฒฝ์ฐ).
- ๋ณดํธ ํ๋ก์ : ํธ์ถ์๊ฐ ์์ฒญ์ ์ํํ๋ ๋ฐ ํ์ํ ๊ถํ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- Caching Proxy : ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ ์ ์๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํ๊ธฐ ์ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์์๋ก ์ ์ฅํฉ๋๋ค.
- ์คํฌ๋ฆฌ๋ ํ๋ก์: ์ํํ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ "๋์"์ ๋ณดํธํฉ๋๋ค(๋๋ ๊ทธ ๋ฐ๋).
- Synchronization Proxy : ๋น๋๊ธฐ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ โSubjectโ์ ๋ํ ๋๊ธฐํ๋ ์ ๊ทผ ์ ์ด๋ฅผ ์ํํฉ๋๋ค.
- "์ค๋งํธ" ๋งํฌ (์ค๋งํธ ์ฐธ์กฐ ํ๋ก์): "์ ๋ชฉ"์ ๋ํ ๋งํฌ๊ฐ ์์ฑ๋ ๋ ์ถ๊ฐ ์์ ์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด "์ ๋ชฉ"์ ๋ํ ํ์ฑ ๋งํฌ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
2.4 ๋ค๋ฆฌ
๋ธ๋ฆฌ์ง ํจํด์ "๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋๋ก ์ถ์ํ์ ๊ตฌํ์ ๋ถ๋ฆฌ"ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค.
๋ธ๋ฆฌ์ง ํจํด์ ์บก์ํ, ์ง๊ณ๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ์ฌ์ฉํ์ฌ ํด๋์ค ๊ฐ์ ์ฑ ์์ ๊ณต์ ํ ์ ์์ต๋๋ค.

์ถ์ํ์ ๊ตฌํ์ด ๋ถ๋ฆฌ๋๋ฉด ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ฆ, ๋ธ๋ฆฌ์ง ํจํด์ ํตํด ๊ตฌํํ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด๋ ๊ตฌํ์ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ฐฉํด๊ฐ ๋์ง ์์ต๋๋ค.
๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ถ์ํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋ํ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ด ์์ผ๋ฉฐ ๊ฐ๊ฐ ๊ณ ์ ํ ์์ฑ๊ณผ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์์น๋ฅผ ํ๋๋ก ๋ฌถ๋ ๊ฒ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ ๋ํ์ ์ค์ค๋ก ๊ทธ๋ฆด ์ ์์ด์ผ ํ๊ณ ํฌ๊ธฐ ์กฐ์ ๋ฑ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๋์์ ๊ทธ๋ฆฌ๋ ๊ทธ๋ํฝ์ OS๋ ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ํ์ ๋ค์ํ ๊ทธ๋ํฝ ํ๊ฒฝ์์ ์ค์ค๋ก ๊ทธ๋ฆด ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ ๋ํ์ ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ ๋ฐฉ๋ฒ์ ๊ตฌํํ๊ฑฐ๋ ๊ทธ๋ฆฌ๊ธฐ ๋ฐฉ๋ฒ์ด ๋ฐ๋ ๋๋ง๋ค ๋ํ์ ์์ ํ๋ ๊ฒ์ ํ์ค์ ์ด์ง ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ๋ธ๋ฆฌ์ง ํจํด์ด ๋์์ด ๋์ด ๋ค์ํ ๊ทธ๋ํฝ ํ๊ฒฝ์์ ๋๋ก์์ ๊ตฌํํ ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ ๋ํ์ ์ถ๊ฐํ๊ณ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ค์ด์ด๊ทธ๋จ์์ ํ์ดํ๋ก ํ์๋ ์ฐ๊ฒฐ์ ๋ ๊ฐ์ง ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. a) Liskov ๋์ฒด ์์น์ ๋ฐ๋ฅธ "์ข ๋ฅ" b) ์ถ์ํ์ ๊ฐ๋ฅํ ๊ตฌํ ์ค ํ๋. ์ธ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์์์ ์ฌ์ฉํ์ฌ ํด๋์ค ๊ณ์ธต์ ๋ถํ๋ฆฌ๋ ๊ฒฝํฅ์ด ์๋ a)์ b)๋ฅผ ๋ชจ๋ ๊ตฌํํฉ๋๋ค.
๋ธ๋ฆฌ์ง๋ ์ด ๋ฌธ์ ๋ฅผ ์ ํํ ํด๊ฒฐํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ฐ์ฒด๋ ๊ณ์ธต ๊ตฌ์กฐ A์ ๊ณ์ธต B์ ๊ฐ์ฒด์์ ์์ผ๋ก ์์ฑ๋๊ณ ๊ณ์ธต A ๋ด์ ์์์ Liskov์ ๋ฐ๋ฅด๋ฉด "๋ค์์ฑ"์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ "๊ตฌํ"์ ๊ฐ๋ ์ ๋ํด ์ถ์ํ์ "๊ฐ์ฒด A์์ ์์ ์ด๋ฃฌ ๊ฐ์ฒด B๋ก์ ๋งํฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
2.5 ํ์ฌ๋
Facade ํจํด์ ์์คํ ์ ์ ์ ํ ๊ฐ์ฒด์ ์์ํ๋ ๋จ์ผ ๊ฐ์ฒด์ ๋ํ ๊ฐ๋ฅํ ๋ชจ๋ ์ธ๋ถ ํธ์ถ์ ์ค์์ผ๋ก์จ ์์คํ ์ ๋ณต์ก์ฑ์ ์จ๊ธฐ๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค.

์๋ฅผ ๋ค์ด ํด๋น ํ์ ์์คํ ์ ๋ํ ๊ฐ๋ ฅํ ๊ฒฐํฉ์ด ๋ฐ๋์งํ์ง ์๊ฑฐ๋ ํ์ ์์คํ ์ ๊ตฌํ์ด ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒฝ์ฐ ํ์ ์์คํ ์ ๋ํ ์ผ๋ จ์ ์ด์ง์ ์ธ ๊ตฌํ ๋๋ ์ธํฐํ์ด์ค๋ก ํตํฉ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
ํ์ ์์คํ ๊ณผ์ ์ํธ ์์ฉ์ ํ ์ง์ ์ ์ ์ํฉ๋๋ค. ํ์ ์์คํ ๊ณผ์ ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํ์ฌ๋ ๊ฐ์ฒด๋ฅผ ์ ์ํ๊ณ ํด๋น ๊ตฌ์ฑ ์์์ ์ํธ ์์ฉํ ์ฑ ์์ ํ ๋นํฉ๋๋ค. Facade๋ ํ์ ์์คํ ์๋น์ค์ ๋ํ ๋จ์ผ ์ง์ ์ ์ ์ ๊ณตํ๋ ์ธ๋ถ ๊ฐ์ฒด์ ๋๋ค.
๋ค๋ฅธ ํ์ ์์คํ ๊ตฌ์ฑ ์์์ ๊ตฌํ์ ๋น๊ณต๊ฐ์ด๋ฉฐ ์ธ๋ถ ๊ตฌ์ฑ ์์์ ํ์๋์ง ์์ต๋๋ค. Facade ๊ฐ์ฒด๋ ํ์ ์์คํ ๊ตฌํ์ ๋ณ๊ฒฝ์ ๋ํ ๋ณดํธ ์ธก๋ฉด์์ ๋ณ๊ฒฝ์ ์ ํญํ๋ GRASP ํจํด์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
์ค์ํ! ์ด ํจํด์ ์ผ๋ถ ๊ฐ์ฒด ๊ทธ๋ฃน์ ์์ ํ ์จ๊ธฐ๊ณ ํด๋น ๊ฐ์ฒด์์ ๋ชจ๋ ํต์ ์ ๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ฌํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฒด์ ํต์ ํ๋ก์ธ์ค์ ๋ํ ์ผ๋ถ ์ ์ด๋ฅผ ์ ๊ณตํ๊ณ ๋ฐ๋์ ์จ๊ธธ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋ก์ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
GO TO FULL VERSION