DI์™€ IoC

์ง€์ธยท2023๋…„ 8์›” 5์ผ
0

CS

๋ชฉ๋ก ๋ณด๊ธฐ
4/6

๐Ÿฐ IoC (Inversion of Control)

  • ์ œ์–ด์˜ ์—ญ์ „ ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”์„œ๋“œ๋‚˜ ๊ฐ์ฒด์˜ ํ˜ธ์ถœ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€(ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ)์—์„œ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๊ฐ„๋‹จํžˆ ๋งํ•ด ์ œ์–ด์˜ ํ๋ฆ„์„ ๋ฐ”๊พผ๋‹ค ๋ผ๊ณ  ํ•œ๋‹ค.

์ œ์–ด๊ฐ€ ์—ญ์ „๋œ ๊ฒฝ์šฐ

  • ์•„๋ž˜ ์ฝ”๋“œ๋Š”, A ๊ฐ์ฒด๋Š” B ๊ฐ์ฒด์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
    ์ œ์–ด๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.
public class A {

	private B b;
    
    public A() {
    	b = new B();
    }
}
  • ํ•˜์ง€๋งŒ Spring์—์„œ๋Š” @Autowired๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.
public class A {
	@Autowired
    private B b;
}
  • B๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” Bean ์ด๋ผ๋ฉด @Autowired๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    ์ด๊ฒƒ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ง์ ‘(์ œ์–ด) ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด์— ์ฃผ์ž… ์‹œ์ผœ์ค€ ๊ฒƒ์ด๋‹ค.

  • ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ œ์–ด๊ฐ€ ์—ญ์ „๋œ ๊ฒฝ์šฐ๋‹ค
    ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผ ํ•  ์ œ์–ด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋Œ€์‹  ํ•ด์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ์ด๊ฒƒ์ด IoC ๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค.


์žฅ์ 

  • ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

  • ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

  • ๊ฐ€๋…์„ฑ ์ฆ์ง„

  • ์ฝ”๋“œ ์ค‘๋ณต ๋ฐฉ์ง€

  • ์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด



๐Ÿฐ DI (Dependency Injection)

  • ์˜์กด์„ฑ ์ฃผ์ž… ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ์Šคํ”„๋ง์ด ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ฐจ๋ณ„ํ™”๋˜์–ด ์ œ๊ณตํ•˜๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๊ธฐ๋Šฅ

๐Ÿพ ์˜์กด์„ฑ : ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜์กดํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ํ›„ ์ฃผ์ž… ์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ์˜์กด์„ฑ์ด ๋†’๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์–ด๋ ค์›Œ ์ง„๋‹ค.
    ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด DI๋Š” ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.
    ์ฆ‰, ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ์™ธ๋ถ€์—์„œ ์ด๋ฅผ ์ฃผ์ž…๋ฐ›๋„๋ก ํ•œ๋‹ค.


๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection)

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

    • ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ 1ํšŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค.
      ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์ž…๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์—ฌ์•ผ ๋˜๊ฑฐ๋‚˜, ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์˜ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      ์ƒ์„ฑ์ž๊ฐ€ 1๊ฐœ๋งŒ ์žˆ์„ ๊ฒฝ์šฐ @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

@Service
public class UserService {

    private UserRepository userRepository;
    private MemberService memberService;

    @Autowired
    public UserService(UserRepository userRepository, MemberService memberService) {
        this.userRepository = userRepository;
        this.memberService = memberService;
    }
    
}

  1. ์ˆ˜์ •์ž ์ฃผ์ž… (Setter Injection)

    • ํ•„๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” setter()๋ฅผ ํ†ตํ•ด์„œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•
      ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
      ์„ ํƒ์ ์ธ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
      ์ƒํ™ฉ์— ๋”ฐ๋ผ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    • @Autowired๋กœ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด๋„ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด @Autowired(required = false)๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Service
public class UserService {

    private UserRepository userRepository;
    private MemberService memberService;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
}

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

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

  • ์ˆ˜์ •์ž ์ฃผ์ž…์˜ ๋‹จ์ 

    • public์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘”๋‹ค.
      ์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ์—, ์ˆ˜์ •์ž ์ฃผ์ž… ๋ฐฉ์‹์€ ์ฃผ์ž… ๋ฐ›๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ํ•„์š”์„ฑ์ด ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    • ๋ณ€๊ฒฝ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘๋ฉด, ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ž„์˜๋กœ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ๋†’๋‹ค.


  • ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ํ™•๋ณด
    ๐Ÿพ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋Š”, ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ 1ํšŒ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๊ฒŒ ๋ณด์žฅ๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
      ์ด ํŠน์ง• ๋•๋ถ„์— ์ฃผ์ž…๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์—ฌ์•ผ ๋˜๊ฑฐ๋‚˜, ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

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


  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ž‘์„ฑ
    ๐Ÿพ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ž‘์„ฑ์ด ์šฉ์ดํ•ด์ง„๋‹ค.

    • @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ , ํ…Œ์ŠคํŠธ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ์ž…ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์‹œ์ ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ํŠนํžˆ ์ˆœ์ˆ˜ ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๋ชจ์˜(Mock) ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


  • final ํ‚ค์›Œ๋“œ ์ž‘์„ฑ ๋ฐ Lombok ๊ณผ์˜ ๊ฒฐํ•ฉ
    ๐Ÿพ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , Lombok๊ณผ์˜ ๊ฒฐํ•ฉ์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

    • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ ๊ฐ์ฒด์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ˆ„๋ฝ๋œ ์˜์กด์„ฑ์„ ํ™•์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

    • Lombok์˜ @RequiredArgsConstructor๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


  • ์ˆœํ™˜ ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐฉ์ง€

    • A๊ฐ์ฒด๊ฐ€ B๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

    • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์‹œ์ (๊ฐ์ฒด์˜ ์ƒ์„ฑ ์‹œ์ )์— ์ˆœํ™˜ ์ฐธ์กฐ ์—๋Ÿฌ๋ฅผ ์˜ˆ๋ฐฉํ•œ๋‹ค.


์žฅ์ 

  • ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

  • ๊ฐ€๋…์„ฑ ๋ฐ ์ฝ”๋“œ ์ค‘๋ณต, ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.



IoC์™€ DI

  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ๊ณผ ๋ชจ๋“ˆํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.


์ฐธ๊ณ 

[Spring] DI, IoC ์ •๋ฆฌ
IOC,DI ์ •์˜/์žฅ์ 
๋‹ค์–‘ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•๊ณผ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

profile
์—ด์ฉก

0๊ฐœ์˜ ๋Œ“๊ธ€