๐ŸŒ Backend/๐Ÿƒ Spring

Spring DI 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•๊ณผ ์˜ต์…˜ ์ฒ˜๋ฆฌ

DevPoong 2022. 7. 8. 20:54

4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

2. setter ์ฃผ์ž…

3. ํ•„๋“œ ์ฃผ์ž…

4. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…


 

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž… ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ์ฃผ๋กœ ๋ถˆ๋ณ€์ด๋‚˜ ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜์กด๊ด€๊ณ„๋ฅผ public set๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜์ • ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž๊ฐ€ 1๊ฐœ์ผ๋•Œ๋Š” @Autowired๋ฅผ ๋ถ™์—ฌ์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ๋  ๋•Œ Spring Bean์„ ๋“ฑ๋กํ•˜๊ธฐ์œ„ํ•ด new๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๊ฐ™์ด ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ฃผ์ž…๋œ๋‹ค.
  • final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ƒ์„ฑ์ž์—์„œ ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ง‰์•„์ค€๋‹ค.
@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;
    }

 

2. setter ์ฃผ์ž…

  • setter์— @Autowired๋ฅผ ๋ถ™์—ฌ์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๊ณผ์ •์„ ํ†ตํ•ด Spring Container์— ํ•ด๋‹น ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ Spring bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜๊ณ  ๊ทธ ๋’ค์— ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ณผ์ •์—์„œ setter๊ฐ€ ์‹คํ–‰๋˜์–ด ์ฃผ์ž…๋œ๋‹ค.
  • ์„ ํƒ์ ์ด๊ณ  ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์— ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋งŒ์•ฝ์— MemberRepository๋ฅผ setter๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ MemberRepository๊ฐ€ Spring Bean์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์•„๋„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž„
    • required = false๋ฅผ ํ†ตํ•ด ์„ ํƒ์ ์œผ๋กœ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • ์ค‘๊ฐ„์— MemberRepository๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•จ
@Component
public class OrderServiceImpl implements OrderService {

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

3. ํ•„๋“œ ์ฃผ์ž…

  • ํ•„๋“œ์— ๋ฐ”๋กœ ์ฃผ์ž…์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ์งง์•„์ ธ์„œ ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.
  • ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ฉด ๋…ธ๋ž€์ค„๋กœ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋œฌ๋‹ค.
  • ๊ฒฐ๊ตญ์—๋Š” ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด setter๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿด๋ฐ”์—๋Š” setter์ฃผ์ž…์„ ์“ฐ์ง€..
  • ์ด ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ฐ์ง€๋ง๊ณ  ์–ด๋–ค ๊ฒฝ์šฐ์— ์จ๋„ ๋˜๋ƒ๋ฉด
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ์ฝ”๋“œ์™€ ๊ด€๊ณ„ ์—†๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
    • ์Šคํ”„๋ง ์„ค์ •์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” @Configuration ๊ฐ™์€ ๊ณณ์—์„œ๋งŒ ํŠน๋ณ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ
@Component
public class OrderServiceImpl implements OrderService {

    @Autowired  private final MemberRepository memberRepository;
    @Autowired  private final DiscountPolicy discountPolicy;
    ....
}

4. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

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

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

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

1. ์˜ต์…˜ ์ฒ˜๋ฆฌ

  • ์ฃผ์ž…ํ•  ์Šคํ”„๋ง ๋นˆ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋™์ž‘ํ•ด์•ผ ํ•  ๋•Œ ์ž๋™ ใ…œใ…ˆ์ž… ๋Œ€์ƒ์„ ์˜ต์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด 3๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค.
  • 1. @Autowired(required = false) : ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด setter ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ
  • 2. org.springframework.lang.@Nullable: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด null์ด ์ž…๋ ฅ๋œ๋‹ค.
  • 3. Optional<>: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Optional.empty๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.