์Šคํ”„๋ง ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ

2025. 3. 23. 13:11ยท๐Ÿ“ Spring/Lecture

์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธํŽธ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

 

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

public class OrderServiceImpl implements OrderService {
  private final MemberRepository memberRepository = new MemoryMemberRepository;
  private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); //DIP ์œ„๋ฐ˜
  private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); //DIP ์œ„๋ฐ˜

  @Override
  public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}

A๋ฐฐ์—ญ(์ธํ„ฐํŽ˜์ด์Šค)์„ ํ•˜๋Š” ๋ฐฐ์šฐ(๊ตฌํ˜„์ฒด)๊ฐ€ B๋ฐฐ์—ญ(์ธํ„ฐํŽ˜์ด์Šค)์„ ํ•˜๋Š” ๋ฐฐ์šฐ(๊ตฌํ˜„์ฒด)๋ฅผ ์ง์ ‘ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค → ๋‹ค์–‘ํ•œ ์ฑ…์ž„

๋ฐฐ์šฐ๋Š” ๋ณธ์ธ ์—ญํ• ์˜ ๋ฐฐ์—ญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์—๋งŒ ์ง‘์ค‘! ์ƒ๋Œ€ ๋ฐฐ์šฐ๊ฐ€ ๋ˆ„๊ฐ€ ์˜ค๋“  ๋ณธ์ธ ๋ฐฐ์—ญ์—๋งŒ ์ง‘์ค‘!

์—ญํ• ์— ๋งž๋Š” ๋ฐฐ์šฐ๋ฅผ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ๊ณต์—ฐ ๊ธฐํš์ž(AppConfig)์˜ ๋ชซ!

 

 

AppConfig

//๊ธฐ์กด ์ฝ”๋“œ : DIP ์œ„๋ฐ˜
public class OrderServiceImpl implements OrderService {
  private final MemberRepository memberRepository = new MemoryMemberRepository;
  private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); //DIP ์œ„๋ฐ˜
  private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); //DIP ์œ„๋ฐ˜

  @Override
  public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}
//๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ : ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์ฒด ๊ฒ€์ƒ‰ → ์„ ํƒ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ชจ๋ฅด๊ฒŒ ํ•ด๋ผ!
public class OrderServiceImpl implements OrderService {
  private final MemberRepository memberRepository;
  private final DiscountPolicy discountPolicy; //์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด(BUT NPE(null pointer exception) ๋ฐœ์ƒ → ์ƒ์„ฑ์ž ์ƒ์„ฑ, AppConfig)

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

  @Override
  public Order createOrder(Long memberId, String itemName, int itemPrice) {...}
}
public class AppConfig {
  public OrderService orderService() {
    //์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…(์—ฐ๊ฒฐ)
    //OrderServiceImpl์€ MemoryMemberRepository, FixDiscountPolicy๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ์•ผ!
    return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
  }
}
public class OrderApp {
  public static void main(String[] args) {
    AppConfig appConfig = new AppConfig();
    MemberService memberService = appConfig.memberService();
    OrderService orderService = appConfig.orderService();
    ...
  }
}

 

AppConfig ๋ฆฌํŒฉํ† ๋ง

//์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ์ž˜ ๋ณด์ด๊ฒŒ ๋ฆฌํŒฉํ† ๋ง
public class AppConfig {
  public OrderService orderService() {
    return new OrderServiceImpl(memberRepository(), discountPolicy());
  }
  
  private MemberRepository memberRepository() {
    return new MemoryMemberRepository();
  }

  private DiscountPolicy discountPolicy() {
    return new FixDiscountPolicy();
  }
}

 

 

 


์ œ์–ด์˜ ์—ญ์ „ IoC (Inversion of Control)

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

ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
ํ”„๋ ˆ์ž„์›Œํฌ : ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋Œ€์‹  ์‹คํ–‰
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ์ œ์–ด์˜ ํ๋ฆ„์„ ๋‹ด๋‹น

 

 

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… DI (Dependency Injection)

์˜์กด๊ด€๊ณ„๋Š” ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด ๊ด€๊ณ„์™€ ์‹คํ–‰ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š” ๋™์ ์ธ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค

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

ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” import ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ์˜์กด๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํŒ๋‹จ ๊ฐ€๋Šฅ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ถ„์„ ๊ฐ€๋Šฅ

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

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

 

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

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

AppConfig ์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์„ IoC ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” DI ์ปจํ…Œ์ด๋„ˆ๋ผ ํ•œ๋‹ค

๋ฐ˜์‘ํ˜•

'๐Ÿ“ Spring > Lecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์Šคํ”„๋ง์˜ ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์›  (2) 2025.03.24
Annotation ์ง์ ‘ ์ƒ์„ฑ  (0) 2025.03.24
์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ  (0) 2025.03.24
์˜์กด๊ด€๊ณ„ ์ฃผ์ž…  (0) 2025.03.24
์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ  (0) 2025.03.23
'๐Ÿ“ Spring/Lecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Annotation ์ง์ ‘ ์ƒ์„ฑ
  • ์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ
  • ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…
  • ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ
leee
leee
  • leee
    LEE
    leee
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์นดํ…Œ๊ณ ๋ฆฌ
      • ๐Ÿ“ QA
        • Test
        • Lecture
      • ๐Ÿ“ SQL
        • ๐Ÿ“
      • ๐Ÿ“ Spring
        • Lecture
        • Error
      • ๐Ÿ“ Github
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๐Ÿ 
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    API ์ž๋™ํ™” ํ…Œ์ŠคํŠธ
    AppConfig
    mismatch
    Postman
    ์Šคํ”„๋ง ๊ฐ์ฒด์ง€ํ–ฅ
    shift_์—ฐ์‚ฐ์ž
    mysql_๊ธฐ๊ฐ„_๊ฒ€์ƒ‰
    MySQL
    mysql_join
    api ํ…Œ์ŠคํŠธ
    ๊นƒํ—ˆ๋ธŒ ์ธํ…”๋ฆฌ์ œ์ด ์—ฐ๋™ ํ•ด์ œ
    ์ƒ์„ฑ์ž์ฃผ์ž…
    ํฌ์ŠคํŠธ๋งจ
    API test
    DI ์ปจํ…Œ์ด๋„ˆ
    mysql_๋ฐ์ดํ„ฐํƒ€์ž…๋ณ€ํ™˜
    mysql_์—ฐ์‚ฐ์ž
    API Testing
    COUNT(*)
    SQL_Join
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
leee
์Šคํ”„๋ง ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

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