OCP ์์น
๊ฐ์๋ฅผ ์๊ฐํ์ง ์์์ง๋ง ์ง๋ฌธ ์ฃผ์ ๋ด์ฉ์ ํ ๋๋ก ๋ต๋ณ ๋จ๊ฒจ๋ด
๋๋ค.์์กด์ฑ ์ฃผ์
(DI)์ด OCP์ DIP๋ฅผ ์ง์ํ๋ ๊ธฐ์ ์ด์ง๋ง, DI๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ์์น๋ค์ด ์ง์ผ์ง๋ ๊ฒ์ ์๋๋๋ค. OCP์ DIP ์์น์ ์ ๋๋ก ์ ์ฉํ๊ธฐ ์ํด์๋ ์ค๊ณ์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํฉ๋๋ค.MemberRepository๋ฅผ ๊ตฌ์ฒด ํด๋์ค๋ก ์ง์ ์์กดํ ๊ฒฝ์ฐ, MemberService๋ MemberRepository์ ๋ณํ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, MemberRepository๋ฅผ NewMemberRepository๋ก ๋ณ๊ฒฝํด์ผ ํ ๋ MemberService์ ์ฝ๋๋ ํจ๊ป ์์ ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ OCP์ DIP ์์น์ ์๋ฐํ๊ฒ ๋ฉ๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ MemberRepository์ ์ธํฐํ์ด์ค(์ถ์ํ)๋ฅผ ์ ์ํ๊ณ , MemberService๊ฐ ์ด ์ธํฐํ์ด์ค์ ์์กดํ๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด MemberService๋ MemberRepository์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋
๋ฆฝ์ ์ด ๋์ด, ๊ตฌํ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด๋ MemberService์ ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์์ด์ง๋๋ค.์ดํด๋ฅผ ์ํด ์๋์ ๊ตฌ์ฒด ํด๋์ค ์์กด๊ณผ ์ธํฐํ์ด์ค ์์กด์ ์์ ์ฝ๋ ๋จ๊ฒจ๋ด
๋๋ค. DIP์ OCP ์์น์ ๋ํด ํ์ตํด๋ณด์๊ณ ์ง์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ฉด ๊ธ๋ฐฉ ์ดํดํ์ค ์ ์์๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌํ์ฒด ์์กด ์์ (DIP, OCP ์์น ์๋ฐ)// OriginMemberRepository ์ฌ์ฉ @Service public class MemberService { private OriginMemberRepository memberRepository; // DIP ์๋ฐ public void setMemberRepository(OriginMemberRepository memberRepository) { this.memberRepository = memberRepository; } } @Repository public class OriginMemberRepository { public void save(String member) { System.out.println("์๋ ๊ตฌํ์ฒด"); } }// OriginMemberRepository -> NewMemberRepository ๋ณ๊ฒฝ @Service public class MemberService { private NewMemberRepository memberRepository; // ์ฝ๋ ๋ณ๊ฒฝ(OCP ์๋ฐ) public void setMemberRepository(NewMemberRepository memberRepository) { // ์ฝ๋ ๋ณ๊ฒฝ(OCP ์๋ฐ) this.memberRepository = memberRepository; } } @Repository public class OriginMemberRepository { public void save(String member) { System.out.println("์๋ ๊ตฌํ์ฒด"); } } @Repository public class NewMemberRepository { public void save(String member) { System.out.println("์๋ก์ด ๊ตฌํ์ฒด"); } }์ธํฐํ์ด์ค ์์กด (DIP, OCP ์์น ์ค์)// OriginMemberRepository ์ฌ์ฉ @Service public class MemberService { private MemberRepository memberRepository; public void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } } public interface MemberRepository { void save(String member); } @Repository public class OriginalMemberRepository implements MemberRepository { @Override public void save(String member) { System.out.println("์๋ ๊ตฌํ์ฒด"); } }// OriginMemberRepository -> NewMemberRepository ๋ณ๊ฒฝ @Service public class MemberService { private MemberRepository memberRepository; // ์ฝ๋ ๋ณ๊ฒฝ ์์ public void setMemberRepository(MemberRepository memberRepository) { // ์ฝ๋ ๋ณ๊ฒฝ ์์ this.memberRepository = memberRepository; } } public interface MemberRepository { void save(String member); } @Repository public class OriginalMemberRepository implements MemberRepository { @Override public void save(String member) { System.out.println("์๋ ๊ตฌํ์ฒด"); } } @Repository @Primary public class NewMemberRepository implements MemberRepository { @Override public void save(String member) { System.out.println("์๋ก์ด ๊ตฌํ์ฒด"); } }