๐Ÿ› ๏ธBackend/๐ŸŒณSpring

[Spring Framework] IoC & DI ๊ฐœ๋… ์ดํ•ด ํ•˜๊ธฐ

junbin2 2024. 10. 20. 14:32

 

1. IoC (Inversion of Control)

Inversion of Control์˜ ๋œป์€ "์ œ์–ด์˜ ์—ญ์ „"์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ œ์–ด๋Š”, ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐพ๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ Spring Framework์˜ IoC ์ปจํ…Œ์ด๋„ˆ ์—๊ฒŒ ์ œ์–ด์˜ ๊ถŒํ•œ์„ ๋„˜๊น€์œผ๋กœ์จ, IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์•Œ์•„์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์•Œ์•„์„œ ์ฃผ์ž…์„ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

- ๊ฐ์ฒด์˜ ์ œ์–ด๋ฅผ ์™ธ๋ถ€์—์„œ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ํญ ๋„“์€ ๊ฐœ๋…

- IoC Container์—๊ฒŒ ์ œ์–ด ๊ถŒํ•œ์„ ๋„˜๊ธด๋‹ค๋Š” ๊ฐœ๋…

 

* IoC Container : Spring Framework๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ž๋™์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ "Bean"๋“ค์˜ ์ง‘ํ•ฉ๊ณผ "Bean"๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ณต๊ฐ„์ด๋‹ค.

* Bean : Spring Framework๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ "Bean"์ด๋ผ๊ณ  ํ•œ๋‹ค. ( ์ž์„ธํ•œ ์„ค๋ช…์€ ์ถ”ํ›„์— ๋‹ค๋ฃจ๊ฒ ๋‹ค. )

 

 

2. DI (Dependency Injection)

Dependency Injecton์˜ ๋œป์€ "์˜์กด์„ฑ ์ฃผ์ž…"์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” "์˜์กด"์ด๋ž€, ๊ฐ์ฒด A๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด B๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•  ๋•Œ, A๋Š” B์— "์˜์กด"ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ "์˜์กด ๊ด€๊ณ„" ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

public class A {
    private B b;
    
    public A() {
    	this.b = new B(); // ์ƒ์„ฑ์„ ํ†ตํ•œ ์˜์กด๊ด€๊ณ„
        // A๋Š” B๋ฅผ ์˜์กด ํ•˜๊ณ  ์žˆ์Œ. ๋‘˜์€ ์˜์กด ๊ด€๊ณ„์ด๋‹ค.
    }
}

"์˜์กด"์ด๋ž€๊ฑธ ์ดํ•ด๋ฅผ ํ–ˆ๋‹ค๋ฉด, ์ด์ œ "์˜์กด์„ฑ ์ฃผ์ž…(DI)"์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

"์˜์กด์„ฑ ์ฃผ์ž…"์€ ๋ง๊ทธ๋Œ€๋กœ "์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๋ฐฉ์‹"์ด๋‹ค.

public class A {
    private B b;
    
    public A(B b) {
    	this.b = b; // ์ฐธ์กฐ๋ฅผ ํ†ตํ•œ ์˜์กด ๊ด€๊ณ„
    }
}

 

 

3. DI (Dependency Injection) ์žฅ์ 

1. ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ

A ๊ฐ์ฒด์™€ B ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค. A ๊ฐ์ฒด๊ฐ€ B ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, B ๊ฐ์ฒด๊ฐ€ ๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒํด๋ž˜์Šค์ผ ๊ฒฝ์šฐ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ A ๊ฐ์ฒด์˜ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์ด ์—†์–ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ( ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ )

 

2. ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ

์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ์˜์กด์„ฑ์„ ํ•„์š”์— ๋”ฐ๋ผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊ฟˆ์œผ๋กœ์จ, ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” "์œ ์—ฐ์„ฑ"๊ณผ "ํ™•์žฅ์„ฑ"์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

3. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

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

 

 

๊ฒฐ๋ก 

IoC๋Š” ์™ธ๋ถ€์— ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์ฃผ์ž…์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋งก๊ธด๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , DI๋Š” IoC์˜ ๊ฐ์ฒด ์ฃผ์ž…์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฐœ๋…์ด๋‹ค.

 

 

์ฐธ์กฐ ( Spring ๊ณต์‹ ๋ฌธ์„œ )

https://docs.spring.io/spring-framework/reference/core/beans/introduction.html

 

Introduction to the Spring IoC Container and Beans :: Spring Framework

This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. Dependency injection (DI) is a specialized form of IoC, whereby objects define their dependencies (that is, the other objects they work with) only through

docs.spring.io