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

2023. 2. 1. 17:02ยทSpring/Spring ๊ธฐ๋ณธ

 

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

 

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

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

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

 


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

 

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

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring > Spring ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 10. ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ / ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ  (0) 2023.02.02
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 9. IoC, DI, ์ปจํ…Œ์ด๋„ˆ  (0) 2023.02.02
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 7. ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ  (0) 2023.02.01
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 6. ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ  (0) 2023.01.31
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 5. ํšŒ์› ๋„๋ฉ”์ธ ์‹คํ–‰๊ณผ ํ…Œ์ŠคํŠธ  (0) 2023.01.31
'Spring/Spring ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 10. ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ / ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 9. IoC, DI, ์ปจํ…Œ์ด๋„ˆ
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 7. ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ
  • [์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 6. ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 8. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ / AppConfig
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”