์ถ์ฒ
ChatGPT
์์กด์ฑ ์ญ์ ์์น(Dependency Inversion Principle, DIP)์ ์ ์ฉํ ์์คํ ์์๋ ๋ชจ๋ ๊ฐ์ ์ํธ์์ฉ์ด ์ ํต์ ์ธ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ค๊ณ๋๋ค. ์ด ์์น์ ํตํด ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์ง์ ์์กดํ์ง ์๊ณ , ์ถ์ํ ๊ณ์ธต์ ํตํด ๊ฐ์ ์ ์ผ๋ก ์์กดํจ์ผ๋ก์จ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
์ ํต์ ์ธ ์ํธ์์ฉ ๋ฐฉ์
์ ํต์ ์ธ ์ํํธ์จ์ด ์ค๊ณ์์๋ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์ง์ ์ ์ผ๋ก ์์กดํ๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๋ณ๊ฒฝ์ ์ด๋ ค์ : ์ ์์ค ๋ชจ๋์ ๋ณ๊ฒฝ์ด ๊ณ ์์ค ๋ชจ๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ค.
- ํ ์คํธ์ ์ด๋ ค์ : ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ธฐ ์ด๋ ค์์ง๋ค.
- ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์ : ๊ณ ์์ค ๋ชจ๋์ ํน์ ์ ์์ค ๊ตฌํ์ ์์กดํ๋ฏ๋ก ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
์๋ฅผ ๋ค์ด, ์ ํต์ ์ธ ๊ตฌ์กฐ์์ ์ผํ์นดํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ฒฐ์ ์ฒ๋ฆฌ ํด๋์ค์ ์ง์ ์์กดํ ์ ์๋ค.
Java ์
// ๊ณ ์์ค ๋ชจ๋
public class ShoppingCart {
private final PayPalPaymentProcessor paymentProcessor; // ํน์ ์ ์์ค ๋ชจ๋์ ์ง์ ์์กด
public ShoppingCart() {
this.paymentProcessor = new PayPalPaymentProcessor(); // PayPal ๊ฒฐ์ ์ฒ๋ฆฌ
}
public void checkout(double amount) {
paymentProcessor.processPayment(amount);
}
}
์ด์ ๊ฐ์ ๊ตฌ์กฐ์์๋ `PayPalPaymentProcessor`์ ๋ณ๊ฒฝ์ด `ShoppingCart` ๋ชจ๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค.
์์กด์ฑ ์ญ์ ์์น์ ์ ์ฉํ ์ํธ์์ฉ ๋ฐฉ์
์์กด์ฑ ์ญ์ ์์น์ ์ ์ฉํ๋ฉด ๋ชจ๋ ๊ฐ์ ์ํธ์์ฉ์ ์ถ์ํ ๊ณ์ธต์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ฆ, ๊ณ ์์ค ๋ชจ๋์ ์ถ์ํ(์ธํฐํ์ด์ค)์ ์์กดํ๊ณ , ์ ์์ค ๋ชจ๋์ด ์ด ์ถ์ํ๋ฅผ ๊ตฌํํ์ฌ ๊ณ ์์ค ๋ชจ๋์ ์ฃผ์
๋ฉ๋๋ค.
1. ์ถ์ํ ๊ณ์ธต ์์ฑ
์ฐ์ , ๊ณ ์์ค ๋ชจ๋๊ณผ ์ ์์ค ๋ชจ๋ ๊ฐ์ ์ํธ์์ฉ์ ์ํ ์ธํฐํ์ด์ค ๋๋ ์ถ์ ํด๋์ค๋ฅผ ์ ์ํ๋ค. ์ด๋ ๊ณ ์์ค ๋ชจ๋์ด ํ์๋ก ํ๋ ๊ธฐ๋ฅ์ ์ ์ํ ๊ฒ์ด๋ค.
// ์ถ์ํ ๊ณ์ธต (์ธํฐํ์ด์ค)
public interface PaymentProcessor {
void processPayment(double amount);
}
2. ์ ์์ค ๋ชจ๋์ด ์ถ์ํ ๊ณ์ธต ๊ตฌํ
์ ์์ค ๋ชจ๋์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๊ตฌ์ฒด์ ์ธ ๋์์ ์ ์ํ๋ค.
// ์ ์์ค ๋ชจ๋
public class PayPalPaymentProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
// PayPal ๊ฒฐ์ ์ฒ๋ฆฌ ๋ก์ง
System.out.println("Processing payment of $" + amount + " through PayPal.");
}
}
public class StripePaymentProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
// Stripe ๊ฒฐ์ ์ฒ๋ฆฌ ๋ก์ง
System.out.println("Processing payment of $" + amount + " through Stripe.");
}
}
3. ๊ณ ์์ค ๋ชจ๋์ด ์ถ์ํ ๊ณ์ธต์ ์์กด
๊ณ ์์ค ๋ชจ๋์ ์ด์ ๊ตฌ์ฒด์ ์ธ ์ ์์ค ๋ชจ๋์ด ์๋ ์ธํฐํ์ด์ค์ ์์กดํ๋ค. ์ด๋ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๋ค.
// ๊ณ ์์ค ๋ชจ๋
public class ShoppingCart {
private final PaymentProcessor paymentProcessor; // ์ถ์ํ ๊ณ์ธต์ ์์กด
// ์์ฑ์ ์ฃผ์
์ ํตํ ์์กด์ฑ ์ฃผ์
public ShoppingCart(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
public void checkout(double amount) {
paymentProcessor.processPayment(amount);
}
}
4. ์์กด์ฑ ์ฃผ์
(Dependency Injection)
์์กด์ฑ ์ฃผ์
์ ํตํด ๊ณ ์์ค ๋ชจ๋์ ํ์ํ ์ ์์ค ๋ชจ๋์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ๋ค. ์ด๋ฅผ ํตํด ๊ณ ์์ค ๋ชจ๋๊ณผ ์ ์์ค ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
1) ์์ฑ์ ์ฃผ์
์์ฑ์ ์ฃผ์ ์ ๊ณ ์์ค ๋ชจ๋์ ์์ฑ์์์ ํ์ํ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ๋ชจ๋ ์์กด์ฑ์ด ์ฃผ์ ๋๋ฏ๋ก ๊ฐ์ฒด์ ์ํ๊ฐ ๋ถ๋ณํ๊ฒ ์ ์ง๋ ์ ์๋ค.
public class Main {
public static void main(String[] args) {
PaymentProcessor paymentProcessor = new PayPalPaymentProcessor(); // ๋๋ new StripePaymentProcessor();
ShoppingCart cart = new ShoppingCart(paymentProcessor);
cart.checkout(100.0);
}
}
2) ์ธํฐ ์ฃผ์
์ธํฐ ์ฃผ์ ์ ๊ณ ์์ค ๋ชจ๋์ ์ธํฐ ๋ฉ์๋๋ฅผ ํตํด ํ์ํ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ๊ฐ์ฒด ์์ฑ ํ์๋ ์์กด์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
// ๊ณ ์์ค ๋ชจ๋
public class ShoppingCart {
private PaymentProcessor paymentProcessor;
public void setPaymentProcessor(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
public void checkout(double amount) {
paymentProcessor.processPayment(amount);
}
}
// ์ฌ์ฉ ์์
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setPaymentProcessor(new PayPalPaymentProcessor());
cart.checkout(100.0);
// ๋ค๋ฅธ ๊ฒฐ์ ์ฒ๋ฆฌ๊ธฐ๋ก ๋ณ๊ฒฝ
cart.setPaymentProcessor(new StripePaymentProcessor());
cart.checkout(200.0);
}
}
3) ์ธํฐํ์ด์ค ์ฃผ์
์ธํฐํ์ด์ค ์ฃผ์
์ ํน์ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก, ํ๋ ์์ํฌ๊ฐ ์ง์ ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ ์ฃผ๋ก IoC(Inversion of Control) ์ปจํ
์ด๋์์ ์ฌ์ฉ๋๋ค.
DIP๋ฅผ ์ ์ฉํ ์์คํ ์ ์ํธ์์ฉ ์ด์
1. ์ ์ฐํ ์ํคํ ์ฒ
DIP๋ฅผ ํตํด ์์คํ ์ ๊ตฌ์กฐ๊ฐ ์ ์ฐํด์ง๋ค. ๊ณ ์์ค ๋ชจ๋์ ๋ค์ํ ์ ์์ค ๋ชจ๋์ ์ฌ์ฉํ ์ ์๊ณ , ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ค.
2. ๋ณ๊ฒฝ์ ์ฉ์ด์ฑ
์ ์์ค ๋ชจ๋์ ๋ณ๊ฒฝ์ด ๊ณ ์์ค ๋ชจ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฏ๋ก, ์ ์์ค ๋ชจ๋์ ๊ตฌํ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
3. ํ ์คํธ ๊ฐ๋ฅ์ฑ
๊ณ ์์ค ๋ชจ๋์ ์ธํฐํ์ด์ค์ ์์กดํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์๋ค. ์ด๋ ํ ์คํธ์ ์ ๋ขฐ์ฑ์ ๋์ด๊ณ , ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํฅ์์ํจ๋ค.
4. ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ
๊ณ ์์ค ๋ชจ๋์ ํน์ ๊ตฌํ์ ์์กดํ์ง ์์ผ๋ฏ๋ก, ๋ค์ํ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ๋ค.
5. ๊ฒฐํฉ๋ ๊ฐ์
๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ , ์์ง๋๊ฐ ๋์์ ธ ์ ์ง๋ณด์์ ํ์ฅ์ด ์ฉ์ดํด์ง๋๋ค.
DIP์ ํด๋ฆฐ ์ํคํ ์ฒ์ ์ํธ์์ฉ
์์กด์ฑ ์ญ์ ์์น์ ํด๋ฆฐ ์ํคํ ์ฒ์์ ์์คํ ์ ๊ณ์ธต ๊ฐ ์ํธ์์ฉ์ ์ค๊ณํ ๋ ์ค์ํ ์์น์ด๋ค. ํด๋ฆฐ ์ํคํ ์ฒ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณ์ธต์ด ์กด์ฌํ๋ค
- ์ํฐํฐ(Entities) : ๋น์ฆ๋์ค ๊ท์น์ ํฌํจํ ๊ฐ์ฅ ์ค์ฌ์ ์ธ ๊ณ์ธต์ด๋ค.
- ์ ์ค์ผ์ด์ค(Use Cases) : ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ํ๋ค.
- ์ธํฐํ์ด์ค ์ด๋ํฐ(Interface Adapters) : ์ธ๋ถ ์ธํฐํ์ด์ค๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ค์ผ์ด์ค ๋ฐ ์ํฐํฐ์ ๋ง๊ฒ ๋ณํํ๋ค.
- ํ๋ ์์ํฌ ๋ฐ ๋๋ผ์ด๋ฒ(Frameworks & Drivers) : ์ธ๋ถ ์์คํ ๊ณผ์ ํต์ ์ ๋ด๋นํ๋ ๊ณ์ธต์ด๋ค.
ํด๋ฆฐ ์ํคํ
์ฒ์์ ๊ฐ ๊ณ์ธต์ ์์ ๊ณ์ธต์ด ํ์ ๊ณ์ธต์ ์์กดํ์ง ์๋๋ก ์ค๊ณ๋์ด ์๋ค. DIP๋ฅผ ํตํด ๊ณ ์์ค ๋ชจ๋(์ํฐํฐ, ์ ์ค์ผ์ด์ค)์ด ์ ์์ค ๋ชจ๋(ํ๋ ์์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ์์กดํ์ง ์๊ณ , ์ถ์ํ ๊ณ์ธต์ ํตํด ๊ฐ์ ์ ์ผ๋ก ์์กดํ๋ค. ์ด๋ ๋ชจ๋ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์์คํ
์ ์ ์ฐํ๊ฒ ์ ์งํ๋ ๋ฐ ๊ธฐ์ฌํ๋ค.
๊ฒฐ๋ก
์์กด์ฑ ์ญ์ ์์น์ ์์คํ
์ ๋ชจ๋ ๊ฐ ์ํธ์์ฉ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ, ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๊ณ , ๋ณ๊ฒฝ์ ์ํฅ์ ์ต์ํํ๋ฉฐ, ํ
์คํธ ๊ฐ๋ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์์คํ
์ ๊ตฌ์กฐ๋ฅผ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค.