ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ(ํฌํธ์ ์ด๋ํฐ)๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์์ฑ, ํ ์คํธ ์ฉ์ด์ฑ, ์ ์ฐ์ฑ์ ์ด๋ป๊ฒ ํฅ์์ํค๋์ง ์์๋ณด์ธ์. ์ด ๊ฐ์ด๋๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ์์ ์ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ: ํฌํธ์ ์ด๋ํฐ ์ค์ฉ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ฒฌ๊ณ ํ๊ณ , ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ, ํ ์คํธํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ(Hexagonal Architecture), ์ผ๋ช ํฌํธ์ ์ด๋ํฐ(Ports and Adapters)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ์์กด์ฑ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ํคํ ์ฒ ํจํด์ ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ์ํด ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ๋ํ ํฌ๊ด์ ์ธ ์ดํด์ ๊ทธ ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ค์ฉ์ ์ธ ๊ตฌํ ์ ๋ต์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ๋ฌด์์ธ๊ฐ?
์๋ฆฌ์คํ ์ด ์ฝ๋ฒ(Alistair Cockburn)์ด ์ฐฝ์ํ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ์ธ๊ณ๋ก๋ถํฐ ๊ฒฉ๋ฆฌํ๋ ์์ด๋์ด๋ฅผ ์ค์ฌ์ผ๋ก ํฉ๋๋ค. ์ด๋ฌํ ๊ฒฉ๋ฆฌ๋ ํฌํธ(ports)์ ์ด๋ํฐ(adapters)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
- ์ฝ์ด(์ ํ๋ฆฌ์ผ์ด์ ): ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋๋ฉ์ธ ๋ชจ๋ธ์ ํฌํจํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฅ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ํน์ ๊ธฐ์ ์ด๋ ํ๋ ์์ํฌ์ ๋ ๋ฆฝ์ ์ด์ด์ผ ํฉ๋๋ค.
- ํฌํธ: ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ธ๋ถ ์ธ๊ณ์ ์ํธ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋๋ ๋ฉ์์ง ํ์ ๊ฐ์ ์ธ๋ถ ์์คํ
๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ํธ์์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ถ์์ ์ธ ์ ์์
๋๋ค. ํฌํธ๋ ๋ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋ ์ ์์ต๋๋ค:
- ๋๋ผ์ด๋น(๊ธฐ๋ณธ) ํฌํธ: ์ธ๋ถ ์กํฐ(์: ์ฌ์ฉ์, ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ )๊ฐ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์์ ์ ์์ํ ์ ์๋๋ก ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค.
- ๋๋ฆฌ๋ธ(๋ณด์กฐ) ํฌํธ: ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ๋ถ ์์คํ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ)๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค.
- ์ด๋ํฐ: ํฌํธ์ ์ํด ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ค์ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ธ๋ถ ์์คํ
๊ฐ์ ๋ฒ์ญ๊ธฐ ์ญํ ์ ํฉ๋๋ค. ์ด๋ํฐ์๋ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
- ๋๋ผ์ด๋น(๊ธฐ๋ณธ) ์ด๋ํฐ: ๋๋ผ์ด๋น ํฌํธ๋ฅผ ๊ตฌํํ์ฌ ์ธ๋ถ ์์ฒญ์ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ดํดํ ์ ์๋ ๋ช ๋ น์ด๋ ์ฟผ๋ฆฌ๋ก ๋ณํํฉ๋๋ค. ์๋ก๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ปดํฌ๋ํธ(์: ์น ์ปจํธ๋กค๋ฌ), ๋ช ๋ น์ค ์ธํฐํ์ด์ค ๋๋ ๋ฉ์์ง ํ ๋ฆฌ์ค๋๊ฐ ์์ต๋๋ค.
- ๋๋ฆฌ๋ธ(๋ณด์กฐ) ์ด๋ํฐ: ๋๋ฆฌ๋ธ ํฌํธ๋ฅผ ๊ตฌํํ์ฌ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ์ธ๋ถ ์์คํ ๊ณผ์ ํน์ ์ํธ์์ฉ์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ฐ์ฒด, ๋ฉ์์ง ํ ์์ฐ์ ๋๋ API ํด๋ผ์ด์ธํธ๊ฐ ์์ต๋๋ค.
์ด๋ ๊ฒ ์๊ฐํด๋ณด์ธ์: ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์์ ์๊ณ , ์ก๊ฐํ์ ๊ป์ง๋ก ๋๋ฌ์ธ์ฌ ์์ต๋๋ค. ํฌํธ๋ ์ด ๊ป์ง์ ์ ๊ตฌ์ ์ถ๊ตฌ์ด๋ฉฐ, ์ด๋ํฐ๋ ์ด ํฌํธ์ ์ฐ๊ฒฐ๋์ด ์ฝ์ด๋ฅผ ์ธ๋ถ ์ธ๊ณ์ ์ฐ๊ฒฐํฉ๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ํต์ฌ ์์น
๋ช ๊ฐ์ง ํต์ฌ ์์น์ด ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ํจ๊ณผ๋ฅผ ๋ท๋ฐ์นจํฉ๋๋ค:
- ์์กด์ฑ ์ญ์ : ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ(์ด๋ํฐ)์ด ์๋ ์ถ์ํ(ํฌํธ)์ ์์กดํฉ๋๋ค. ์ด๋ SOLID ๋์์ธ์ ํต์ฌ ์์น์ ๋๋ค.
- ๋ช ์์ ์ธํฐํ์ด์ค: ํฌํธ๋ ์ฝ์ด์ ์ธ๋ถ ์ธ๊ณ ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ์ฌ ๊ณ์ฝ ๊ธฐ๋ฐ์ ํตํฉ ๋ฐฉ์์ ์ด์งํฉ๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ: ์ฝ์ด๋ฅผ ์ธ๋ถ ์์กด์ฑ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ํฌํธ์ ๋ชจ์(mock) ๊ตฌํ์ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ์ ์ฐ์ฑ: ์ด๋ํฐ๋ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๊ต์ฒดํ ์ ์์ด, ๋ณํํ๋ ๊ธฐ์ ์ด๋ ์๊ตฌ์ฌํญ์ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค. MySQL์์ PostgreSQL๋ก ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด๋ณด์ธ์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ํฐ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ ์ฌ์ฉ์ ์ด์
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ฑํํ๋ฉด ์๋ง์ ์ด์ ์ด ์์ต๋๋ค:
- ํฅ์๋ ํ ์คํธ ์ฉ์ด์ฑ: ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ๋จ์ ํ ์คํธ ์์ฑ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํฌํธ๋ฅผ ๋ชจ์(mocking) ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฝ์ด๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ์ธ๋ถ ์์คํ ์ ์์กดํ์ง ์๊ณ ์ฒ ์ ํ๊ฒ ํ ์คํธํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด ํฌํธ๋ฅผ ๋ชจ์ ์ฒ๋ฆฌํ์ฌ ์ค์ ๊ฒ์ดํธ์จ์ด์ ์ฐ๊ฒฐํ์ง ์๊ณ ๋ ์ฑ๊ณต ๋ฐ ์คํจ ํธ๋์ญ์ ์ ์๋ฎฌ๋ ์ด์ ํจ์ผ๋ก์จ ๊ฒฐ์ ์ฒ๋ฆฌ ๋ชจ๋์ ํ ์คํธํ ์ ์์ต๋๋ค.
- ์ฆ๊ฐ๋ ์ ์ง๋ณด์์ฑ: ์ธ๋ถ ์์คํ ์ด๋ ๊ธฐ์ ์ ๋ณ๊ฒฝ์ด ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ์น๋ ์ํฅ์ด ์ต์ํ๋ฉ๋๋ค. ์ด๋ํฐ๋ ์ ์ฐ์ธต ์ญํ ์ ํ์ฌ ์ธ๋ถ์ ๋ณ๋์ฑ์ผ๋ก๋ถํฐ ์ฝ์ด๋ฅผ ๋ณดํธํฉ๋๋ค. SMS ์๋ฆผ ๋ฐ์ก์ ์ฌ์ฉ๋๋ ์๋ํํฐ API์ ํ์์ด๋ ์ธ์ฆ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด๋ณด์ธ์. ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋๋ก ๋๊ณ SMS ์ด๋ํฐ๋ง ์ ๋ฐ์ดํธํ๋ฉด ๋ฉ๋๋ค.
- ๊ฐํ๋ ์ ์ฐ์ฑ: ์ด๋ํฐ๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ด, ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ์์ด ์๋ก์ด ๊ธฐ์ ์ด๋ ์๊ตฌ์ฌํญ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ์คํ๊ณผ ํ์ ์ ์ด์งํฉ๋๋ค. ํ์ฌ๊ฐ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๊ธฐ์กด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ํฐ๋ง ๊ต์ฒดํ๋ฉด ๋๋ฏ๋ก ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ค๋จ์ ์ต์ํํ ์ ์์ต๋๋ค.
- ๊ฒฐํฉ๋ ๊ฐ์: ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ๋ถ ์์กด์ฑ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด ๋ ๋ชจ๋ํ๋๊ณ ์์ง๋ ฅ ์๋ ์ค๊ณ๋ฅผ ์ด๋์ด๋ ๋๋ค. ์ด๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ดํดํ๊ณ , ์์ ํ๊ณ , ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ฐ: ๋ค๋ฅธ ํ์ด ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ด๋ํฐ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ํ ์ ์์ด ๋ณ๋ ฌ ๊ฐ๋ฐ๊ณผ ๋ ๋น ๋ฅธ ์์ฅ ์ถ์๋ฅผ ์ด์งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ํ์ ํต์ฌ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง ๊ฐ๋ฐ์ ์ง์คํ๊ณ ๋ค๋ฅธ ํ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ํฐ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ ๊ตฌํ: ์ค์ฉ ์์
์ฌ์ฉ์ ๋ฑ๋ก ์์คํ ์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ๊ตฌํ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ช ํ์ฑ์ ์ํด ๊ฐ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(Java ๋๋ C#๊ณผ ์ ์ฌํ)๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
1. ์ฝ์ด(์ ํ๋ฆฌ์ผ์ด์ ) ์ ์
์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ์ฉ์ ๋ฑ๋ก์ ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํฉ๋๋ค.
// Core/UserService.java (๋๋ UserService.cs)
public class UserService {
private final UserRepository userRepository;
private final PasswordHasher passwordHasher;
private final UserValidator userValidator;
public UserService(UserRepository userRepository, PasswordHasher passwordHasher, UserValidator userValidator) {
this.userRepository = userRepository;
this.passwordHasher = passwordHasher;
this.userValidator = userValidator;
}
public Result<User, String> registerUser(String username, String password, String email) {
// ์ฌ์ฉ์ ์
๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ
ValidationResult validationResult = userValidator.validate(username, password, email);
if (!validationResult.isValid()) {
return Result.failure(validationResult.getErrorMessage());
}
// ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์ธ
if (userRepository.findByUsername(username).isPresent()) {
return Result.failure("์ฌ์ฉ์ ์ด๋ฆ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค");
}
// ๋น๋ฐ๋ฒํธ ํด์ฑ
String hashedPassword = passwordHasher.hash(password);
// ์ ์ฌ์ฉ์ ์์ฑ
User user = new User(username, hashedPassword, email);
// ์ฌ์ฉ์๋ฅผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฅ
userRepository.save(user);
return Result.success(user);
}
}
2. ํฌํธ ์ ์
์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ๋ถ ์ธ๊ณ์ ์ํธ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํฌํธ๋ฅผ ์ ์ํฉ๋๋ค.
// Ports/UserRepository.java (๋๋ UserRepository.cs)
public interface UserRepository {
Optional<User> findByUsername(String username);
void save(User user);
}
// Ports/PasswordHasher.java (๋๋ PasswordHasher.cs)
public interface PasswordHasher {
String hash(String password);
}
//Ports/UserValidator.java (๋๋ UserValidator.cs)
public interface UserValidator{
ValidationResult validate(String username, String password, String email);
}
//Ports/ValidationResult.java (๋๋ ValidationResult.cs)
public interface ValidationResult{
boolean isValid();
String getErrorMessage();
}
3. ์ด๋ํฐ ์ ์
์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ธฐ์ ์ ์ฐ๊ฒฐํ๋ ์ด๋ํฐ๋ฅผ ๊ตฌํํฉ๋๋ค.
// Adapters/DatabaseUserRepository.java (๋๋ DatabaseUserRepository.cs)
public class DatabaseUserRepository implements UserRepository {
private final DatabaseConnection databaseConnection;
public DatabaseUserRepository(DatabaseConnection databaseConnection) {
this.databaseConnection = databaseConnection;
}
@Override
public Optional<User> findByUsername(String username) {
// JDBC, JPA ๋๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ธฐ์ ์ ์ฌ์ฉํ ๊ตฌํ
// ...
return Optional.empty(); // ํ๋ ์ด์คํ๋
}
@Override
public void save(User user) {
// JDBC, JPA ๋๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ธฐ์ ์ ์ฌ์ฉํ ๊ตฌํ
// ...
}
}
// Adapters/BCryptPasswordHasher.java (๋๋ BCryptPasswordHasher.cs)
public class BCryptPasswordHasher implements PasswordHasher {
@Override
public String hash(String password) {
// BCrypt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ตฌํ
// ...
return "hashedPassword"; //ํ๋ ์ด์คํ๋
}
}
//Adapters/SimpleUserValidator.java (๋๋ SimpleUserValidator.cs)
public class SimpleUserValidator implements UserValidator {
@Override
public ValidationResult validate(String username, String password, String email){
// ๊ฐ๋จํ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง
if (username == null || username.isEmpty()) {
return new SimpleValidationResult(false, "์ฌ์ฉ์ ์ด๋ฆ์ ๋น์๋ ์ ์์ต๋๋ค");
}
if (password == null || password.length() < 8) {
return new SimpleValidationResult(false, "๋น๋ฐ๋ฒํธ๋ 8์ ์ด์์ด์ด์ผ ํฉ๋๋ค");
}
if (email == null || !email.contains("@")) {
return new SimpleValidationResult(false, "์๋ชป๋ ์ด๋ฉ์ผ ํ์์
๋๋ค");
}
return new SimpleValidationResult(true, null);
}
}
//Adapters/SimpleValidationResult.java (๋๋ SimpleValidationResult.cs)
public class SimpleValidationResult implements ValidationResult {
private final boolean valid;
private final String errorMessage;
public SimpleValidationResult(boolean valid, String errorMessage) {
this.valid = valid;
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(){
return valid;
}
@Override
public String getErrorMessage(){
return errorMessage;
}
}
//Adapters/WebUserController.java (๋๋ WebUserController.cs)
// ๋๋ผ์ด๋น ์ด๋ํฐ - ์น์ผ๋ก๋ถํฐ์ ์์ฒญ์ ์ฒ๋ฆฌ
public class WebUserController {
private final UserService userService;
public WebUserController(UserService userService) {
this.userService = userService;
}
public String registerUser(String username, String password, String email) {
Result<User, String> result = userService.registerUser(username, password, email);
if (result.isSuccess()) {
return "๋ฑ๋ก ์ฑ๊ณต!";
} else {
return "๋ฑ๋ก ์คํจ: " + result.getFailure();
}
}
}
4. ๊ตฌ์ฑ(Composition)
๋ชจ๋ ๊ฒ์ ํจ๊ป ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ(์์กด์ฑ ์ฃผ์ )์ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ด๋ ์์กด์ฑ ์ฃผ์ ์ปจํ ์ด๋ ๋ด์์ ๋ฐ์ํฉ๋๋ค.
// Main ํด๋์ค ๋๋ ์์กด์ฑ ์ฃผ์
์ค์
public class Main {
public static void main(String[] args) {
// ์ด๋ํฐ ์ธ์คํด์ค ์์ฑ
DatabaseConnection databaseConnection = new DatabaseConnection("jdbc:mydb://localhost:5432/users", "user", "password");
DatabaseUserRepository userRepository = new DatabaseUserRepository(databaseConnection);
BCryptPasswordHasher passwordHasher = new BCryptPasswordHasher();
SimpleUserValidator userValidator = new SimpleUserValidator();
// ์ด๋ํฐ๋ฅผ ์ฃผ์
ํ์ฌ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค ์์ฑ
UserService userService = new UserService(userRepository, passwordHasher, userValidator);
// ๋๋ผ์ด๋น ์ด๋ํฐ๋ฅผ ์์ฑํ๊ณ ์๋น์ค์ ์ฐ๊ฒฐ
WebUserController userController = new WebUserController(userService);
// ์ด์ userController๋ฅผ ํตํด ์ฌ์ฉ์ ๋ฑ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์
String result = userController.registerUser("john.doe", "P@sswOrd123", "john.doe@example.com");
System.out.println(result);
}
}
// DatabaseConnection์ ์์ฐ ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋๋ ๊ฐ๋จํ ํด๋์ค
class DatabaseConnection {
private String url;
private String username;
private String password;
public DatabaseConnection(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
// ... ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฉ์๋ (๊ฐ๊ฒฐ์ฑ์ ์ํด ๊ตฌํ๋์ง ์์)
}
// Result ํด๋์ค (ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ Either์ ์ ์ฌ)
class Result<T, E> {
private final T success;
private final E failure;
private final boolean isSuccess;
private Result(T success, E failure, boolean isSuccess) {
this.success = success;
this.failure = failure;
this.isSuccess = isSuccess;
}
public static <T, E> Result<T, E> success(T value) {
return new Result<>(value, null, true);
}
public static <T, E> Result<T, E> failure(E error) {
return new Result<>(null, error, false);
}
public boolean isSuccess() {
return isSuccess;
}
public T getSuccess() {
if (!isSuccess) {
throw new IllegalStateException("๊ฒฐ๊ณผ๊ฐ ์คํจ์
๋๋ค");
}
return success;
}
public E getFailure() {
if (isSuccess) {
throw new IllegalStateException("๊ฒฐ๊ณผ๊ฐ ์ฑ๊ณต์
๋๋ค");
}
return failure;
}
}
class User {
private String username;
private String password;
private String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
// getter ๋ฐ setter (๊ฐ๊ฒฐ์ฑ์ ์ํด ์๋ต)
}
์ค๋ช :
UserService๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ๋ ๋๋ค. ์ด๊ฒ์UserRepository,PasswordHasher,UserValidator์ธํฐํ์ด์ค(ํฌํธ)์ ์์กดํฉ๋๋ค.DatabaseUserRepository,BCryptPasswordHasher,SimpleUserValidator๋ ๊ฐ๊ฐ์ ํฌํธ๋ฅผ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ (๋ฐ์ดํฐ๋ฒ ์ด์ค, BCrypt, ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง)์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ์ด๋ํฐ์ ๋๋ค.WebUserController๋ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณUserService์ ์ํธ์์ฉํ๋ ๋๋ผ์ด๋น ์ด๋ํฐ์ ๋๋ค.- main ๋ฉ์๋๋ ์ด๋ํฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํฉ๋๋ค.
๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ๊ธฐ๋ณธ ์์น์ ๊ฐ๋จํ์ง๋ง, ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ์ด ์์ต๋๋ค:
- ํฌํธ์ ์ ํฉํ ์ธ๋ถ์ฑ ์ ํ: ํฌํธ์ ๋ํ ์ ์ ํ ์ถ์ํ ์์ค์ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋๋ฌด ์ธ๋ถํ๋ ํฌํธ๋ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ด๋ํ ์ ์๊ณ , ๋๋ฌด ๊ด๋ฒ์ํ ํฌํธ๋ ์ ์ฐ์ฑ์ ์ ํํ ์ ์์ต๋๋ค. ํฌํธ๋ฅผ ์ ์ํ ๋ ๋จ์์ฑ๊ณผ ์ ์์ฑ ์ฌ์ด์ ์ ์ถฉ์ ์ ๊ณ ๋ คํ์ญ์์ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ: ์ฌ๋ฌ ์ธ๋ถ ์์คํ ์ ๋ค๋ฃฐ ๋ ํธ๋์ญ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ถ์ฐ ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ์ ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ณด์ ํธ๋์ญ์ ์ ๊ตฌํํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๋ฑ๋ก์ด ๋ณ๋์ ์ฒญ๊ตฌ ์์คํ ์์ ๊ณ์ ์ ์์ฑํ๋ ๊ฒ์ ํฌํจํ๋ค๋ฉด, ๋ ์์ ์ด ๋ชจ๋ ํจ๊ป ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ธ๋ถ ์์คํ ์ ์ฅ์ ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค. ์ฐ์์ ์ธ ์ฅ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํท ๋ธ๋ ์ด์ปค๋ ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ญ์์ค. ์ด๋ํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ง ๋ชปํ ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์ฌ์ ์ผ๋ก ์ฐ๊ฒฐ์ ์ฌ์๋ํ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
- ํ ์คํธ ์ ๋ต: ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง์ ๋ณด์ฅํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ์ข ๋จ ๊ฐ ํ ์คํธ๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ์ญ์์ค. ๋จ์ ํ ์คํธ๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ฉฐ, ํตํฉ ํ ์คํธ๋ ์ฝ์ด์ ์ด๋ํฐ ๊ฐ์ ์ํธ์์ฉ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
- ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ: ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ(์: Spring, Guice)๋ฅผ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ์ ๋จ์ํํ์ญ์์ค. ์ด๋ฌํ ํ๋ ์์ํฌ๋ ์์กด์ฑ์ ์์ฑํ๊ณ ์ฃผ์ ํ๋ ๊ณผ์ ์ ์๋ํํ์ฌ, ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
- CQRS (Command Query Responsibility Segregation): ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ CQRS์ ์ ์ด์ธ๋ฆฝ๋๋ค. ์ด๋ ํนํ ๋ณต์กํ ์์คํ ์์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก
๋ง์ ์ฑ๊ณต์ ์ธ ๊ธฐ์ ๊ณผ ํ๋ก์ ํธ๋ค์ด ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ฑํํ์ต๋๋ค:
- ์ ์์๊ฑฐ๋ ํ๋ซํผ: ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ข ์ข ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ํต์ฌ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด, ๋ฐฐ์ก ์ ๊ณต์ ์ฒด, ์ฌ๊ณ ๊ด๋ฆฌ ์์คํ ๊ณผ ๊ฐ์ ๋ค์ํ ์ธ๋ถ ์์คํ ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ํต์ฌ ๊ธฐ๋ฅ์ ์ง์ฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ฒฐ์ ๋ฐฉ๋ฒ์ด๋ ๋ฐฐ์ก ์ต์ ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ์ํ ์์คํ ๋ฐ ๊ฑฐ๋ ํ๋ซํผ๊ณผ ๊ฐ์ ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ์ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๊ฐ ์ ๊ณตํ๋ ํ ์คํธ ์ฉ์ด์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ด์ ์ ๋๋ฆฝ๋๋ค. ํต์ฌ ๊ธ์ต ๋ก์ง์ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ์ฒ ์ ํ๊ฒ ํ ์คํธํ ์ ์์ผ๋ฉฐ, ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฅ ๋ฐ์ดํฐ ์ ๊ณต์ ์ฒด ๋ฐ ์ฒญ์ฐ์์ ๊ฐ์ ๋ค์ํ ์ธ๋ถ ์๋น์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ: ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์์ฒด์ ์ธ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ธ๋ถ ์์กด์ฑ์ ๊ฐ์ง ๊ฒฝ๊ณ ์ปจํ ์คํธ๋ฅผ ๋ํ๋ด๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ด๋ง์ต๋๋ค. ํฌํธ์ ์ด๋ํฐ๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํต์ ์ ์ํ ๋ช ํํ ๊ณ์ฝ์ ์ ๊ณตํ์ฌ ๋์จํ ๊ฒฐํฉ๊ณผ ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ๋ฅผ ์ด์งํฉ๋๋ค.
- ๋ ๊ฑฐ์ ์์คํ ํ๋ํ: ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ด๋ํฐ๋ก ๊ฐ์ธ๊ณ ํฌํธ ๋ค์ ์๋ก์ด ํต์ฌ ๋ก์ง์ ๋์ ํจ์ผ๋ก์จ ๋ ๊ฑฐ์ ์์คํ ์ ์ ์ง์ ์ผ๋ก ํ๋ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ฑํ์ง ์๊ณ ๋ ๋ ๊ฑฐ์ ์์คํ ์ ์ผ๋ถ๋ฅผ ์ ์ง์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค.
๊ณผ์ ๋ฐ ์ ์ถฉ์
ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ด๋ จ๋ ๊ณผ์ ์ ์ ์ถฉ์ ์ ์ธ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ณต์ก์ฑ ์ฆ๊ฐ: ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ฉด ์ถ๊ฐ์ ์ธ ์ถ์ํ ๊ณ์ธต์ด ๋์ ๋์ด ์ฝ๋๋ฒ ์ด์ค์ ์ด๊ธฐ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
- ํ์ต ๊ณก์ : ๊ฐ๋ฐ์๋ค์ ํฌํธ์ ์ด๋ํฐ์ ๊ฐ๋ ๊ณผ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ์๊ฐ์ด ํ์ํ ์ ์์ต๋๋ค.
- ๊ณผ๋ํ ์์ง๋์ด๋ง ๊ฐ๋ฅ์ฑ: ๋ถํ์ํ ํฌํธ์ ์ด๋ํฐ๋ฅผ ๋ง๋ค์ด ๊ณผ๋ํ๊ฒ ์์ง๋์ด๋งํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ๋จํ ๋์์ธ์ผ๋ก ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ง์ ์ผ๋ก ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ญ์์ค.
- ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ: ์ถ๊ฐ์ ์ธ ์ถ์ํ ๊ณ์ธต์ ์ ์ฌ์ ์ผ๋ก ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ง๋ง, ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์ํ ์ ์๋ ์์ค์ ๋๋ค.
ํน์ ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ๊ณผ ํ์ ์ญ๋์ด๋ผ๋ ๋งฅ๋ฝ์์ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ์ด์ ๊ณผ ๊ณผ์ ๋ฅผ ์ ์คํ๊ฒ ํ๊ฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ๋ง๋ณํต์น์ฝ์ด ์๋๋ฉฐ, ๋ชจ๋ ํ๋ก์ ํธ์ ์ต์ ์ ์ ํ์ด ์๋ ์๋ ์์ต๋๋ค.
๊ฒฐ๋ก
ํฌํธ์ ์ด๋ํฐ๋ฅผ ๊ฐ์กฐํ๋ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ , ํ ์คํธ ์ฉ์ดํ๋ฉฐ, ์ ์ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ์์กด์ฑ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๋ณํํ๋ ๊ธฐ์ ๊ณผ ์๊ตฌ์ฌํญ์ ์ฝ๊ฒ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ณ ๋ คํด์ผ ํ ๊ณผ์ ์ ์ ์ถฉ์ ์ด ์์ง๋ง, ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ์ด์ ์ ํนํ ๋ณต์กํ๊ณ ์ค๋ ์ง์๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋น์ฉ์ ๋ฅ๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์กด์ฑ ์ญ์ ๊ณผ ๋ช ์์ ์ธํฐํ์ด์ค์ ์์น์ ์์ฉํจ์ผ๋ก์จ, ๋ ํ๋ ฅ์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฌ์ฐ๋ฉฐ ํ๋ ์ํํธ์จ์ด ํ๊ฒฝ์ ์๊ตฌ๋ฅผ ๋ ์ ์ถฉ์กฑ์ํฌ ์ ์๋ ์์คํ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋๋ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ํต์ฌ ์์น๋ถํฐ ์ค์ฉ์ ์ธ ๊ตฌํ ์ ๋ต๊น์ง ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ๋ ํ๊ตฌํ๊ณ ์์ ์ ํ๋ก์ ํธ์ ์ ์ฉํด ๋ณด์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฑํํ๋ ๋ฐ ํฌ์ํ๋ ๊ฒ์ ์ฅ๊ธฐ์ ์ผ๋ก ํ์คํ ๋ณด์๋ฐ์ ๊ฒ์ด๋ฉฐ, ์ด๋ ๋ ๋์ ํ์ง์ ์ํํธ์จ์ด์ ๋ ๋ง์กฑ์ค๋ฌ์ด ๊ฐ๋ฐ ํ์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก, ์ฌ๋ฐ๋ฅธ ์ํคํ ์ฒ๋ฅผ ์ ํํ๋ ๊ฒ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฒฐ์ ์ ๋ด๋ฆด ๋ ๋ณต์ก์ฑ, ์๋ช , ์ ์ง๋ณด์์ฑ ์๊ตฌ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค. ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํ์ง๋ง, ์ด๋ ์ํํธ์จ์ด ์ํคํ ํธ์ ๋๊ตฌ ์์์ ์๋ ํ๋์ ๋๊ตฌ์ผ ๋ฟ์ ๋๋ค.