Spring/Spring ๊ธฐ๋ณธ

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 8. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ / AppConfig

hello_u 2023. 2. 1. 17:02

 

๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์ž

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜์˜ ๊ณต์—ฐ์ด๋ผ ์ƒ๊ฐํ•ด๋ณด์ž.

๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐฐ์—ญ(๋ฐฐ์šฐ ์—ญํ• )์ด๋ผ ์ƒ๊ฐํ•˜์ž.

๊ทธ๋Ÿฐ๋ฐ! ์‹ค์ œ ๋ฐฐ์—ญ ๋งž๋Š” ๋ฐฐ์šฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ฐ€ ํ•˜๋Š”๊ฐ€?

 


๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ ๊ณต์—ฐ์„ ํ•˜๋ฉด ๋กœ๋ฏธ์˜ค ์—ญํ• ์„ ๋ˆ„๊ฐ€ ํ• ์ง€ ์ค„๋ฆฌ์—ฃ ์—ญํ• ์„ ๋ˆ„๊ฐ€ ํ• ์ง€๋Š” ๋ฐฐ์šฐ๋“ค์ด ์ •ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค.

 

public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    // private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

์ฝ”๋“œ๋Š” ๋งˆ์น˜ ๋กœ๋ฏธ์˜ค ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ํ•˜๋Š” ๋ ˆ์˜ค๋‚˜๋ฅด๋„ ๋””์นดํ”„๋ฆฌ์˜ค(๊ตฌํ˜„์ฒด, ๋ฐฐ์šฐ)๊ฐ€

์ค„๋ฆฌ์—ฃ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ํ•˜๋Š” ์—ฌ์ž ์ฃผ์ธ๊ณต(๊ตฌํ˜„์ฒด, ๋ฐฐ์šฐ)์„ ์ง์ ‘ ์ดˆ๋น™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

 

๋ณธ์ธ์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค

์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ํ• ๋‹น๋ ์ง€๋Š” ๊ณต์—ฐ ๊ธฐํš์ž๊ฐ€ ํ•ด์•ผํ•œ๋‹ค .

 

 

AppConfig ๋“ฑ์žฅ

๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง€๋Š” ๋ณ„๋„์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ž.

 

public class AppConfig {

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

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }
}

 

AppConfig๋Š”

์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค( new MemoryMemberRepository() ) ์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ 

 

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

 

 

Appconfig ์˜ orderService() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด

( MemoryMemberRepository() ๊ฐ์ฒด ์ƒ์„ฑ ,FixDiscountPolicy() ๊ฐ์ฒด ์ƒ์„ฑ )

 

-->  OrderServiceImpl ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค. 

 

appConfig ๊ฐ์ฒด๋Š” memoryMemberRepository ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ 

๊ทธ ์ฐธ์กฐ๊ฐ’์„ memberServiceImpl ์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

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;

OrderServiceImpl ์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ - ์ฐธ์กฐ๊ฐ’์ด ๋„˜์–ด๊ฐ

 

OrderServiceImpl ๊ฐ์ฒด์˜

MemberRepository ์— MemoryMemberRepository ํ• ๋‹น

DiscountPolicy ์— FixDiscountPolicy ํ• ๋‹น

 

 

๋‚˜์ค‘์— ํ• ์ธ ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋˜์–ด ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค๋ฉด 

OrderServiceImpl ๋ณ€๊ฒฝํ•˜์ง€์•Š๊ณ  AppConfig ์—์„œ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋จ 

 

FixDiscountPolicy RateDiscountPolicy ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๊ตฌ์„ฑ ์˜์—ญ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›๊ณ , ์‚ฌ์šฉ ์˜์—ญ์€ ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

๋”๋ณด๊ธฐ
public DiscountPolicy discountPolicy() {
    return new FixDiscountPolicy();
}

 

ํ• ์ธ ์ •์ฑ… ๋ณ€๊ฒฝ --->

 

public DiscountPolicy discountPolicy() {
    return new RateDiscountPolicy();
}

 

 

 

 

 

๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์—ฐ๊ฒฐ์€ AppConfig ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.


DIP ์™„์„ฑ: MemberServiceImpl ์€ MemberRepository ์ธ ์ถ”์ƒ์—๋งŒ ์˜์กดํ•˜๋ฉด ๋œ๋‹ค. ์ด์ œ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

 


๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ๊ณผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

 

๋”๋ณด๊ธฐ
public class AppConfig {

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

 

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

์„ค๊ณ„ ๋ณ€๊ฒฝ์œผ๋กœ MemberServiceImpl ์€ MemoryMemberRepository ๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค!

๋‹จ์ง€ MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•œ๋‹ค.

 

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

 

 

ํด๋ผ์ด์–ธํŠธ์ธ memberServiceImpl ์ž…์žฅ์—์„œ ๋ณด๋ฉด ์˜์กด๊ด€๊ณ„๋ฅผ ๋งˆ์น˜ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ

DI(Dependency Injection) ์šฐ๋ฆฌ๋ง๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ ํ•œ๋‹ค.

 

 

 

AppConfig ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊บผ๋‚ด์„œ ์“ฐ๊ธฐ 

AppConfig appConfig = new AppConfig();
OrderService orderService = appConfig.orderService();
MemberService memberService = appConfig.memberService();

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ @BeforeEach ๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค.

@BeforeEach
public void beforeEach() {
    AppConfig appConfig = new AppConfig();
    memberService = appConfig.memberService();
}

 

AppConfig ๋ฆฌํŒฉํ„ฐ๋ง

 

 

๋ฆฌํŒฉํ„ฐ๋ง ์ „

๋”๋ณด๊ธฐ
public class AppConfig {

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

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }
}

ํ˜„์žฌ AppConfig๋ฅผ ๋ณด๋ฉด ์ค‘๋ณต์ด ์žˆ๊ณ , ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ์ž˜ ์•ˆ๋ณด์ธ๋‹ค.

 

๋ฆฌํŒฉํ„ฐ๋ง ํ›„

๋”๋ณด๊ธฐ
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();
    }
}

new MemoryMemberRepository() ์ด ๋ถ€๋ถ„์ด ์ค‘๋ณต ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.

์ด์ œ MemoryMemberRepository ๋ฅผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

 

AppConfig ๋ฅผ ๋ณด๋ฉด ์—ญํ• ๊ณผ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

์ •๋ฆฌ

AppConfig๋ฅผ ํ†ตํ•ด์„œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

AppConfig๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.

๋ฐฐ์—ญ์— ๋งž๋Š” ๋‹ด๋‹น ๋ฐฐ์šฐ๋ฅผ ์„ ํƒํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ• ์ง€ ์ „์ฒด ๊ตฌ์„ฑ์„ ์ฑ…์ž„์ง„๋‹ค.

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com