์คํ๋ง์ ํต์ฌ์ ์๊ธฐ ์ํด์ ๊ฐ์ฒด์งํฅ 5์์น(SOLID)์ ๋ํด ๋จผ์ ์๊ณ ์์ด์ผ ํ๋ค.
ํ๋์ ์์๋ฅผ ํตํด ์์๋ณด์. ํ์์ ๊ฐ์ ํ๊ณ ํ์์ ์กฐํํ๋ ์์ ์ด๋ค.
3๋ฒ ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์์ ๋ค์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.
private final MemberRepository memberRepository = new MemoryMemberRepository();
์ด ์ฝ๋์ MemberServiceImpl ์ด๋ผ๋ ๊ตฌํ ํด๋์ค๋ MemberRepository ์ธํฐํ์ด์ค๋ฟ ์๋๋ผ MemoryMemberRepositroy ๋ผ๋ ๊ตฌ์ฒด ํด๋์ค์๋ ์์กด์ ํ๊ณ ์๋ค.
์ฆ ๊ฐ์ฒด์งํฅ 5์์น OCP (๊ฐ๋ฐฉ ํ์ ์์น)๊ณผ DIP(์์กด ๊ด๊ณ ์ญ์ ์์น)์ ์๋ฐํ๊ณ ์๋ ์ ์ด๋ค. ๊ทธ ์ด์ ๋ OCP๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ผ๋ ํ์ฅ์๋ ์ด๋ ค์์ด์ผ ํ๋ ๊ฒ์ธ๋ฐ ์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ๋ MemberServiceImpl ํด๋์ค์ด๋ค.
์ง๊ธ์ MemoryMemberRepository(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋ง์ฝ DBRepository(๋๋น)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค๋ฉด
private final MemberRepository memberRepository = new DBRepository();
์ด๋ ๊ฒ ์ฝ๋๊ฐ ๋ฐ๋ ๊ฒ์ด๊ณ ํด๋ผ์ด์ธํธ ์ฝ๋(MemberServiceImpl class)๊ฐ ์ํฅ์ ๋ฐ๋๋ค.
๊ทธ๋์ ์ด๋ OCP๋ฅผ ์๋ฐํ๋ ๊ฒ์ด๊ณ , ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ถ์ํ(์ธํฐํ์ด์ค)์๋ง ์์กดํด์ผ ํ์ง๋ง ๋ณด์๋ฏ์ด ๊ตฌ์ฒด ํด๋์ค์๋ ์์กดํ๊ณ ์๊ธฐ์ DIP๊น์ง ์๋ฐํ๊ณ ์๋ ์ ์ด๋ค.
์ถ๊ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ์ฑ ์ ์ฆ ์คํ์๋ง ์ ๊ฒฝ์ ์จ์ผํ๋๋ฐ, ๋ฌด์์ ์์ ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ง ๋๋น์ ์ ์ฅํ ์ง ๋ฑ์ ๊ฒฐ์ ํ๊ณ ์๋ ์ ์ด๋ค. SRP(๋จ์ผ์ฑ ์ ์์น)๊น์ง ์๋ฐฐํ๊ณ ์๋ ์ ์ด๋ค.
๋ค์์ผ๋ก๋ ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค์๋ง ์์กดํด์ผ ํ๋คโผ๏ธ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ฒ ํ๊ณ ์ด๋์ ์ ์ฅ์ ํ ์ง๋ ์ธ๋ถ์์ ์ฃผ์ ์ ๋ฐ์ผ๋ฉด ๋ ๊ฒ์ด๋ค.
๋ฐ์ ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๊ฒ ๋๋ฉด OCP์ DIP ๋ชจ๋๋ฅผ ์งํจ ๋ค์ด์ด๊ทธ๋จ์ด๋ค.
์ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ ํ๊ธฐ ์ํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค
AppConfig ํด๋์ค์์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ ์์ฑ์๋ฅผ ํตํด์ ์ฃผ์ (์ฐ๊ฒฐ)ํด์ค๋ค.
์ค๋ฅธ์ชฝ MemberServiceImpl์์ ์ฝ๋๊ฐ ์์ ๋๊ฒ์ ๋ณผ ์ ์๋ค.
Private final MemberRepository memberRepository;
์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋๋์ด ์ธํฐํ์ด์ค์๋ง ์์กด์ ํ๊ฒ ๋์๊ณ ๊ทธ ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ฑ์๋ฅผ ๋ง๋ค์ด์ ์ด๋ค ๊ฒ์ผ๋ก ์ ์ฅํ ์ง๋ AppConfigํด๋์ค(์ธ๋ถ)์์ ๊ฒฐ์ ์ ํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํด์ MemberServiceImplํด๋์ค์์๋ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๊ฒ ๋๊ณ , ์์กด๊ด๊ณ๋ ์ธ๋ถ์ ๋งก๊ธฐ๊ณ ์ ์ฅ, ์กฐํ ๋ฑ ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ์๋ง ์ด์ ์ ๋ง์ถ ์ ์๊ฒ ๋๋ค.
ํด๋ผ์ด์ธํธ์ธ MemberServiceImplํด๋์ค ์ ์ฅ์์ ๋ดค์ ๋ ์์กด ๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ ๊ฐ์ ์ด๊ฒ์ ๐๐ป DI(Dependency Injection) ์์กด์ฑ ์ฃผ์ ๋ค๋ฅธ ๋ง๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค.
AppConfig ํด๋์ค์์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ๋ณด์ด๋๋ก ๋ฆฌํฉํ ๋ง์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค.
๋ฆฌํฉํ ๋ง์ ํ์ ๋์ ์ฅ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์๋์ง ํ๋์ ๋ณผ ์ ์๋ค๋ ์ ์ด๋ค.
์ง๊ธ๊น์ง๋ฅผ ์ ๋ฆฌํด๋ณด๋ฉด MemberServiceImpl์ด๋ผ๋ ํด๋์ค๊ฐ ์์ ์ ๊ธฐ๋ฅ ๋ฟ ์๋๋ผ ์ด๋์ ์ ์ฅํ ์ง ๊น์ง ๊ฒฐ์ ์ ํ์ฌ OCP, DIP๋ฅผ ์๋ฐํ๋ค.
๊ทธ๋ฌ๋ AppConfig๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ธ๋ถ์์ ์ด๋์ ์ ์ฅํ ์ง ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด ์ค์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ดํ๋ฆ์ด AppConfigํด๋์ค๋ก ๋์ด๊ฐ๋ค.
์ด๋ฅผ IOC(์ ์ด์ ์ญ์ )์ด๋ผ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ DI(์์กด๊ด๊ณ ์ฃผ์ )์ด๋ผ ํ๋ค!! ๐ฅ