์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

Spring ํ•ต์‹ฌ์›๋ฆฌ-๊ธฐ๋ณธ [์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•]

DAHLIA CHOI 2021. 7. 15. 18:26

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ์ƒ์„ฑ์ž ์ฃผ์ž…
  • ์ˆ˜์ •์ž ์ฃผ์ž… ( setter ์ฃผ์ž… )
  • ํ•„๋“œ ์ฃผ์ž…
  • ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

[ ์ƒ์„ฑ์ž ์ฃผ์ž… ]

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋ถˆ๋ณ€, ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„ ์‚ฌ์šฉ
@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

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

์ด๋ ‡๊ฒŒ @Component ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค์— ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,  @Autowired ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค. 

ํ•˜์ง€๋งŒ, ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ์—๋Š” @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. (์ž๋™์œผ๋กœ @Autowired๊ฐ€ ์ ์šฉ๋œ๋‹ค.)

 

[ ์ˆ˜์ •์ž ์ฃผ์ž… (setter ์ฃผ์ž…) ]

setter๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์„ ํƒ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด ๊ด€๊ณ„ ์‚ฌ์šฉ
@Component
public class OrderServiceImpl implements OrderService {

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
 }

์ด๋Ÿฐ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์— final์„ ์ง€์›Œ์ค€๋‹ค. (๋งž๋‚˜..?) 

๊ทธ๋‹ค์Œ set~~์„ ์ž‘์„ฑํ•ด์„œ, ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๊ณ , @Autowired์„ ์‚ฌ์šฉํ•ด์„œ ์™„์„ฑํ•ด์ค€๋‹ค.

์—ฌ๊ธฐ์„œ๋Š”  @Autowired์„ ์ƒ๋žตํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

์„ ํƒ์ ์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

@Autowired(required = false)
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

 

๐Ÿ‘‰ ์ƒ์„ฑ์ž ์ฃผ์ž…๋„ ์•„๋‹Œ๋ฐ ์ƒ์„ฑ์ž๋ฅผ ์™œ ์ž‘์„ฑํ–ˆ์„๊นŒ?

์ž๋ฐ”๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. @Autowired์„ ์“ฐ์ง€ ์•Š์•„๋„ ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์šฐ์„ ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž๋กœ ์ธํ•ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋จผ์ € ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— setter์ฃผ์ž…์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

[ ํ•„๋“œ ์ฃผ์ž… ]

ํ•„๋“œ์— ๋ฐ”๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;

์ด๋Ÿฐ์‹์œผ๋กœ ํ•„๋“œ์—  @Autowired์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

 

  • ํ•„๋“œ์ฃผ์ž…์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  • DIํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ๋ชปํ•˜์ง€ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.

    @Test
    void fieldInjectionTest(){
        OrderServiceImpl orderService = new OrderServiceImpl();

        orderService.setMemberRepository(new MemoryMemberRepository());
        orderService.setDiscountPolicy(new FixDiscountPolicy());

        orderService.createOrder(1L, "itemA", 10000);
    }

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๋ณต์žกํ•ด์ง€๊ณ , ์ž๋ฐ” ์ฝ”๋“œ์—๋„ set๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.

    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

๊ตณ์ด ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฐจ๋ผ๋ฆฌ setter ์ฃผ์ž…์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

 

[ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž… ]

์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

  • ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
@Component
public class OrderServiceImpl implements OrderService {

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy; // DIP์ง€ํ‚ค๊ณ  ์žˆ์Œ, ์ˆœ์ „ํžˆ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…์€ ์ˆ˜์ •์ž ์ฃผ์ž…๊ณผ ๋น„์Šทํ•œ ์›๋ฆฌ๋กœ ๋™์ž‘๋œ๋‹ค.

 

 


์ถœ์ฒ˜ : 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