Super Kawaii Cute Cat Kaoani
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
{Back-end}/SpringBoot

[SpringBoot]์Šคํ”„๋ง ๊ธฐ๋ณธํŽธ - ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ (1)

by wonee1 2025. 9. 6.
728x90

 
๐Ÿ–Š๏ธ ๋ณธ ํฌ์ŠคํŠธ๋Š” ์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ์Šคํ”„๋ง ๊ธฐ๋ณธํŽธ์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 
 
 
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

 

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

ํ˜„์žฌ ํ‰์  5.0์  ์ˆ˜๊ฐ•์ƒ 48,140๋ช…์ธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”. ์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๊ธฐ๋ณธ ๊ธฐ๋Šฅ, ์Šคํ”„

www.inflearn.com

 
 
 

 

1. ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ์ ์šฉ๊ณผ ๋ฌธ์ œ์ 


 
 
ํ• ์ธ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์ธ OrderServiceImpl ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค.
 

 public class OrderServiceImpl implements OrderService {
 //    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
 private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
 }

 
์ด ์ฝ”๋“œ๋Š” OrderServiceImpl์ด new ํ‚ค์›Œ๋“œ๋กœ ํ• ์ธ ์ •์ฑ… ๊ตฌํ˜„์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ! 
 
 

  • OrderServiceImpl์€ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ → "์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•œ๋‹ค" = ๋‹คํ˜•์„ฑ ํ™œ์šฉ
  • FixDiscountPolicy, RateDiscountPolicy ๊ฐ™์€ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ์Œ → ํ™•์žฅ ๊ฐ€๋Šฅํ•ด ๋ณด์ž„ 

 

 
ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋Š” DIP ์œ„๋ฐ˜ํ–ˆ๋‹ค 
 

 
โญ DIP๋ž€? 

๋”๋ณด๊ธฐ

  DIP (Dependency Inversion Principle, ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)

   "๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋‘˜ ๋‹ค ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค."

  • ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง (์˜ˆ: ์ฃผ๋ฌธ ์„œ๋น„์Šค)
  • ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ: ์„ธ๋ถ€ ๊ตฌํ˜„ (์˜ˆ: ํ• ์ธ ์ •์ฑ…, ๊ฒฐ์ œ ๋ฐฉ์‹ ๋“ฑ)

 

  • DIP ์›์น™: ํด๋ผ์ด์–ธํŠธ(=OrderServiceImpl)๋Š” ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค)์—๋งŒ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ์ฝ”๋“œ ๋ณด๋ฉด?
    • ์—ฌ๊ธฐ์„œ OrderServiceImpl์€
      • ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค) DiscountPolicy์—๋„ ์˜์กด 
      • ๋™์‹œ์— ๊ตฌ์ฒด ํด๋ž˜์Šค RateDiscountPolicy์—๋„ ์ง์ ‘ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค โญ

 
 
 
=>   ๋”ฐ๋ผ์„œ ํ™•์žฅํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์ฝ”๋“œ(OrderServiceImpl)๊ฐ€ ๊นจ์ง€๋Š” ๊ตฌ์กฐ → OCP ์œ„๋ฐ˜
 
 
โญ OCP๋ž€?
 

๋”๋ณด๊ธฐ

OCP (Open-Closed Principle, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)

"ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค."

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋• ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ 
  • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 
 
 
 
์›๋ž˜ ๊ธฐ๋Œ€ํ–ˆ๋˜ ์˜์กด๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ง€๋งŒ   

OrderServiceImpl ---> DiscountPolicy (์ธํ„ฐํŽ˜์ด์Šค)

 
 
 
ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๊ตฌํ˜„์ฒด์—๋„ ์ง์ ‘ ์˜์กดํ•ด๋ฒ„๋ฆฐ ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค 

OrderServiceImpl ---> DiscountPolicy (์ธํ„ฐํŽ˜์ด์Šค)
       โ”‚
       โ””โ”€> RateDiscountPolicy (๊ตฌํ˜„์ฒด)   ← ์ง์ ‘ ์˜์กด

 
 
 
 
 
์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค

public class OrderServiceImpl implements OrderService {
 //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
 private DiscountPolicy discountPolicy;
 }

 
ํ•˜์ง€๋งŒ ๋‹ค์Œ ์ฝ”๋“œ์—๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 
 
์ฝ”๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•˜๋„๋ก ๋ฐ”๊ฟจ์ง€๋งŒ, ์ด์ œ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค

 
 
 
 
 
๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์กฐ๋Š” OrderServiceImpl์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์•Œ๊ณ , ์‹ค์ œ ๊ตฌํ˜„์ฒด ์„ ํƒ์€ ์™ธ๋ถ€(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)๊ฐ€ ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค!
 
 
 
 

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


 
AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑ(config) ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์„ค์ • ํด๋ž˜์Šค

  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…(์—ฐ๊ฒฐ) ํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง

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

  • MemberServiceImpl
  • MemoryMemberRepository
  • OrderServiceImpl
  • FixDiscountPolicy

 

public class AppConfig {

    public MemberService memberService() {
        // MemoryMemberRepository ๊ฐ์ฒด ์ƒ์„ฑ → MemberServiceImpl์— ์ฃผ์ž…
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService() {
        // MemoryMemberRepository์™€ FixDiscountPolicy๋ฅผ ์ƒ์„ฑํ•ด์„œ OrderServiceImpl์— ์ฃผ์ž…
        return new OrderServiceImpl(
                new MemoryMemberRepository(),
                new FixDiscountPolicy());
    }

}

 
 
ํ˜„์žฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ๋ณด์ด๋„๋ก ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

    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() ์ค‘๋ณต์„ ๊ฐœ์„ ํ•œ ์ฝ”๋“œ์ด๋‹ค 
 
 
 
 
 
 

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

 
AppConfig์—์„œ ํ• ์ธ ์ •์ฑ… ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌํ˜„์„ FixDiscountPolicy์—์„œ RateDiscountPolicy ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค 
ํ• ์ธ ์ •์ฑ…์ด ๋ณ€๊ฒฝํ•ด๋„ AppConfig๋งŒ ์ˆ˜์ •ํ•˜๋ฉด๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ๊ฒƒ์ด๋‹ค.  
 
 
 
 
 

3. IoC, DI, ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ


 
 

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

 
 
์˜ˆ์ „์—๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ(์˜ˆ: OrderServiceImpl)๊ฐ€ ์ง์ ‘ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ new๋กœ ๋งŒ๋“ค๊ณ , ์—ฐ๊ฒฐํ•˜๊ณ , ์‹คํ–‰๊นŒ์ง€ ๋‹ด๋‹นํ–ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ ์•ˆ์—์„œ ์ œ์–ดํ–ˆ๋‹ค. 
 
=> ์ž์—ฐ์Šค๋Ÿฝ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๊ตฌ์ฒด ๊ตฌํ˜„์ฒด์— ๋”ฑ ๋‹ฌ๋ผ๋ถ™๊ฒŒ ๋˜์–ด ํ™•์žฅ์„ฑ์ด ์ค„์–ด๋“ค๊ณ , ์œ ์ง€๋ณด์ˆ˜์— ์žˆ์–ด์„œ ํž˜๋“ค๋‹ค.
 
 

OrderServiceImpl orderService = new OrderServiceImpl(new MemoryMemberRepository(),
                                                     new FixDiscountPolicy());

 
 
 
 

IoC ์ ์šฉ (์ œ์–ด๊ถŒ ์™ธ๋ถ€๋กœ ์œ„์ž„)
 
 

์•„๊นŒ์™€ ๊ฐ™์€ ๋‹จ์ ์œผ๋กœ ์ด์ œ AppConfig๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ & ์—ฐ๊ฒฐ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.  OrderServiceImpl์€ ์˜ค์ง ๋ณธ์ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
 
=> ๋”ฐ๋ผ์„œ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋ ์ง€๋Š” AppConfig๊ฐ€ ๊ฒฐ์ •ํ•˜๊ณ  ๊ด€๋ฆฌ → ์ œ์–ด์˜ ํ๋ฆ„์ด ์—ญ์ „๋จ(IoC)
 

 

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

 
 
 

ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

 
 

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

 
 
 

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

 
 
 
OrderServiceImpl์€ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•œ๋‹ค.  ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์–ด๋–ค ๊ตฌํ˜„์ฒด(FixDiscountPolicy, RateDiscountPolicy)๊ฐ€ ๋“ค์–ด์˜ฌ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค. 
 
=> ์ด ๊ตฌํ˜„์ฒด ์„ ํƒ/์ฃผ์ž…์„ ์™ธ๋ถ€(AppConfig, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์ด DI
 
 

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ (๋Ÿฐํƒ€์ž„) ์— ์™ธ๋ถ€์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์‹ค์ œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ ๋˜๋Š” ๊ฒƒ์„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ ํ•œ๋‹ค
 
=> ์ฆ‰  FixDiscountPolicy๋ƒ RateDiscountPolicy์ธ๊ฐ€๋Š” AppConfig/์Šคํ”„๋ง ์„ค์ •์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.
 
 
โญ์ •์  ์˜์กด๊ด€๊ณ„ vs ๋™์  ์˜์กด ๊ด€๊ณ„ 

๋”๋ณด๊ธฐ

 

  • ์ •์  ์˜์กด๊ด€๊ณ„: ์ฝ”๋“œ(import)๋งŒ ๋ณด๊ณ  ์•Œ ์ˆ˜ ์žˆ์Œ
  • ๋™์  ์˜์กด๊ด€๊ณ„: ์‹คํ–‰ ์‹œ์ ์— ์‹ค์ œ ์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๊ฒฐ์ •๋จ

 

 
 

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

  • ๊ธฐ์กด์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ new ํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค 
  • ์ด์ œ๋Š” ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: AppConfig)๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค 
  • ์ œ์–ด์˜ ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€(์ปจํ…Œ์ด๋„ˆ)๊ฐ€ ๋‹ด๋‹น → IoC ์›์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ 

 

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

 

  • IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์—ญํ•  ์ค‘ ํŠนํžˆ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ด๋ฆ„
  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋ฟ ์•„๋‹ˆ๋ผ, ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ์ฐธ์กฐํ• ์ง€(์—ฐ๊ฒฐ)๊นŒ์ง€ ๊ด€๋ฆฌ
  • ์š”์ฆ˜์€ IoC๋ผ๋Š” ๋ง๋ณด๋‹ค DI๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋” ์ž์ฃผ ์“ฐ์ž„

 
 
 
 
 
 
 
 
 
 
 

728x90