๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… - ์˜ต์…˜์ฒ˜๋ฆฌ)

by YeonBu 2023. 12. 21.
728x90

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

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

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”! ๐Ÿ“ข

 

 

 

 

 

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

 

- ์ฃผ์ž…ํ•  ์Šคํ”„๋ง ๋นˆ์ด ์—†์–ด๋„ ๋™์ž‘ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

 (๊ทธ๋Ÿฐ๋ฐ '@Autowired'๋งŒ ์‚ฌ์šฉํ•˜๋ฉด 'required' ์˜ต์…˜ ๊ธฐ๋ณธ๊ฐ’์ด 'true'๋กœ ๋˜์–ด์žˆ์–ด์„œ ์ž๋™์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ)

 

 

1. ์ž๋™ ์ฃผ์ž… ์˜ต์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

(์—ฌ๊ธฐ์„œ Member๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์•„๋‹˜)

 

โ‘  `@Autowired(required = false)` 

static class TestBean {

    @Autowired(required = false)
    public void setNoBean1(Member noBean1) {
        System.out.println("noBean1 = " + noBean1);
    }
    
}

 

: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ์ด ์•ˆ๋จ

 

 

โ‘ก `@Nullable`

static class TestBean {

    @Autowired
    public void setNoBean2(@Nullable Member noBean2) {
        System.out.println("noBean2 = " + noBean2);
    }

}

 

: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด null์ด ์ž…๋ ฅ๋จ

 

 

โ‘ข `Optional<>` 

static class TestBean {

    @Autowired
    public void setNoBean3(Optional<Member> noBean3) {
        System.out.println("noBean3 = " + noBean3);
    }

}

 

: ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Optional.empty ๊ฐ€ ์ž…๋ ฅ๋จ

 

 

 

 

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์„ ํƒํ•ด๋ผ!

 

- ์ตœ๊ทผ์— ์Šคํ”„๋ง์„ ํฌํ•จํ•œ DI ํ”„๋ ˆ์ž„์›Œํฌ ๋Œ€๋ถ€๋ถ„์ด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค. ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

 

1. ๋ถˆ๋ณ€

 

โœ” ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ ๋ฒˆ ์ผ์–ด๋‚˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ์ ๊นŒ์ง€ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ผ์ด ์—†๋‹ค.

์˜คํžˆ๋ ค ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์ „๊นŒ์ง€ ๋ณ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค(๋ถˆ๋ณ€ํ•ด์•ผ ํ•จ)

 

โœ” ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด setXxx ๋ฉ”์„œ๋“œ๋ฅผ public ์œผ๋กœ ์—ด์–ด๋‘์–ด์•ผ ํ•จ(๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ˆ˜๋กœ ํ˜ธ์ถœํ•ด์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ)

 โž” ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์—ด์–ด๋‘๋Š” ๊ฒƒ์€ ์ข‹์€ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์ด ์•„๋‹˜

 

โœ” ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋”ฑ! ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋Š” ์ผ์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ์„ค๊ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

2. ๋ˆ„๋ฝ

 

* ์ˆ˜์ •์ž ์˜์กด๊ด€๊ณ„์ธ ๊ฒฝ์šฐ

 

OrderServiceImpl

@Component
public class OrderServiceImpl implements OrderService{

    private  MemberRepository memberRepository;
    private  DiscountPolicy discountPolicy;

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

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

}

 

: @Autowired๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์—์„œ ๋™์ž‘ํ•  ๋•Œ๋Š” ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ, ์ง€๊ธˆ์€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”์ฝ”๋“œ๋กœ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰

 

 

OrderServiceImplTest

class OrderServiceImplTest {

    @Test
    void createOrder() {
        OrderServiceImpl orderService = new OrderServiceImpl();
        orderService.createOrder(1L, "itemA", 10000);
    }
    
}

 

: ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์—†์–ด๋ณด์ด๊ณ  ์‹คํ–‰์€ ๋˜๋‚˜ NPE ๋ฐœ์ƒ

  โž” memberRepository, discountPolicy ๋ชจ๋‘ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ. ์ฝ”๋“œ๋ฅผ ๊นŒ๋ณด๊ธฐ ์ „์— ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ˆ„๋ฝ๋˜์—ˆ๋Š”์ง€ ์•Œ๊ธฐ ํž˜๋“ฆ

 

 

* ์ƒ์„ฑ์ž ์ฃผ์ž…์ธ ๊ฒฝ์šฐ

 

OrderServiceImpl

@Component
public class OrderServiceImpl implements OrderService{

    private  MemberRepository memberRepository;
    private  DiscountPolicy discountPolicy;

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

 

 

OrderServiceImplTest

 

: ์ƒ์„ฑ์ž์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์ฒ˜๋Ÿผ ์ฃผ์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๋ˆ„๋ฝํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, IDE์—์„œ ๋ฐ”๋กœ ์–ด๋–ค ๊ฐ’์„ ํ•„์ˆ˜๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ

 

 

3. 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;
    }

}

 

 

: ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  โž” ์ˆ˜์ •์ž ์ฃผ์ž…์„ ํฌํ•จํ•œ ๋‚˜๋จธ์ง€ ์ฃผ์ž… ๋ฐฉ์‹์€ ๋ชจ๋‘ ์ƒ์„ฑ์ž ์ดํ›„์— ํ˜ธ์ถœ๋˜๋ฏ€๋กœ, ํ•„๋“œ์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

: ํ˜น์‹œ๋ผ๋„ ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๋ง‰์•„์ค€๋‹ค.

 ( *์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋Š” ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ข‹์€ ์˜ค๋ฅ˜๋‹ค! )

 

 

4. ์ •๋ฆฌ

 

โœ” ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์–ธ์–ด์˜ ํŠน์ง•์„ ์‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค!

 

โœ” ๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์ˆ˜ ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—” ์ˆ˜์ •์ž ์ฃผ์ž…๋ฐฉ์‹์„ ์˜ต์…˜์œผ๋กœ ๋ถ€์—ฌํ•˜๋ฉด ๋œ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ ์ˆ˜์ •์ž ์ฃผ์ž…์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•