๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Spring

์ œ์–ด์˜ ์—ญ์ „(IoC) & ์˜์กด์„ฑ ์ฃผ์ž…(DI)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 1. 1.

์ œ์–ด์˜ ์—ญ์ „(IoC) & ์˜์กด์„ฑ ์ฃผ์ž…(DI)

์ œ์–ด์˜ ์—ญ์ „

์ œ์–ด์˜ ์—ญ์ „(IoC): ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ

public class OrderServiceImpl implements OrderService {

    // private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}

๊ธฐ์กด์—๋Š” ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ํ•„์š”ํ•œ ์„œ๋ฒ„ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ์—ฐ๊ฒฐ ์‹คํ–‰ํ–ˆ๋‹ค. -> ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์กฐ์ •ํ•จ

ํ—ˆ๋‚˜ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ 1. ํ• ์ธ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผํ•˜๊ณ (OCP ์œ„๋ฐ˜), 2. ์ถ”์ƒํ™”๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ ๊ฐ์ฒด์—๋„ ์˜์กดํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.(DIP ์œ„๋ฐ˜)


// Appconfig.java

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(
                memberRepository(),
                discountPolicy());
     }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
 }
}
// OrderServiceImpl.java

public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
        this.memberRepository = memberRepository;
         this.discountPolicy = discountPolicy;
 }
 ...
}

ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์€ AppConfig(์™ธ๋ถ€)๊ฐ€ ๊ฐ€์ ธ๊ฐ€๊ณ  OrderServiceImpl์€ ์ž์‹ ์˜ ๋กœ์ง๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” AppConfig๊ฐ€ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด์ค€๋‹ค.

OrderServiceImpl -> MemoryMemberRepository , FixDiscountPolicy


OrderServiceImpl ์ž…์žฅ์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€(์ฃผ์ž…๋ ์ง€)๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

OrderServiceImpl ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด์„ ์ฃผ์ž…ํ• ์ง€๋Š” ์˜ค์ง ์™ธ๋ถ€( AppConfig )์—์„œ๊ฒฐ์ •ํ•œ๋‹ค.

OrderServiceImpl ์€ ์ด์ œ๋ถ€ํ„ฐ ์‹คํ–‰์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด ๋œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…(DI)

์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„

ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” import ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค

๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด ๊ด€๊ณ„

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ์‹ค์ œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์˜์กด ๊ด€๊ณ„

์˜์กด์„ฑ ์ฃผ์ž…(DI): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ (๋Ÿฐํƒ€์ž„)์— ์™ธ๋ถ€์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์„œ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์‹ค์ œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ ๋˜๋Š” ๊ฒƒ

IoC์ปจํ…Œ์ด๋„ˆ, DI์ปจํ…Œ์ด๋„ˆ

AppConfig์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ

์ตœ๊ทผ์—๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์— ์ดˆ์ ์„ ๋งž์ถฐ ์ฃผ๋กœ DI์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค.

๋Œ“๊ธ€