Java/Spring

[Spring] Spring Framework + IoC์™€ DI

God Korea 2022. 10. 12. 01:24
728x90

๐Ÿ“ข ์Šคํ”„๋ง? ์งง๊ฒŒ ํ•œ ๋งˆ๋””!

 Spring Framework๋ฅผ ์งง๊ฒŒ ํ•œ ๋งˆ๋””๋กœ ์ •์˜ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒฝ๋Ÿ‰๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

 Spring์€ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ(beans, JDBC ๋“ฑ)๊ณผ ํ”„๋กœ์ ํŠธ(Boot, Security ๋“ฑ)๋ฅผ ์ง€์›ํ•จ์„ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ข€ ๋” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž๋กœ ํ•˜์—ฌ๊ธˆ ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ•„์š”ํ•œ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Š” ํ‘œ๋ฉด์ ์œผ๋กœ ๋ณด์ด๋Š” ์ผ๋ถ€๋งŒ์„ ํ‘œํ˜„ํ•œ ๋‚ด์šฉ์ด๊ณ , ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ๋” ๋งŽ์€ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿ“ŒSpring์˜ ํ•ต์‹ฌ!

 Spring์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€ DI, AOP, PSA, POJO ์ด 4๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์˜ค๋Š˜์€ ์ด ์ค‘ DI์— ๋Œ€ํ•ด์„œ ์งค๋ง‰ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ, DIํ•˜๋ฉด ๋น ์งˆ ์ˆ˜ ์—†๋Š” ๊ฐœ๋…์ด IoC(์ œ์–ด์˜ ์—ญ์ „)์ธ๋ฐ ํ•ด๋‹น ๊ฐœ๋…๋„ ํ•จ๊ป˜ ๋‹ค๋ฃจ๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿค”IoC (Inversion of Control) - ์ œ์–ด์˜ ์—ญ์ „์ด ๋ญ์•ผ???

 ์ œ์–ด์˜ ์—ญ์ „์€ ์ผ๋‹จ ํ•œ๊ธ€ํ’€์ด ๊ทธ๋Œ€๋กœ ์–ด๋– ํ•œ ์ œ์–ด(ํ†ต์ œ๊ถŒ)๊ฐ€ ์—ญ์ „๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ •์ƒ์ ์ธ ํ๋ฆ„์„ ๋’ค์ง‘์–ด๋†“์€ ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐฑ์ค€ ๊ฐ™์€ ํ™ˆํŽ˜์ด์ง€์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งœ๊ฑฐ๋‚˜ ์–ด๋– ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณผ ๋•Œ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. 

 ๋จผ์ €, ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•ด์ค„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๊ฐ์ฒด๋ณ„๋กœ ๊ด€๊ณ„ ์„ค์ •์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ผ๋ฆฌ ํ•จ๊ป˜ ๋ฌถ์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ Java Application์„ ํ†ตํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๊ณ ์ž ํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ์ •์ƒ์ ์ธ ํ๋ฆ„์ด๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋“ฑ ์ฝ”๋“œ์˜ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ–๊ณ  Application์€ ์ด๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋ฟ์ด๋‹ค.

 ์ž, ๊ทธ๋Ÿผ ์ด์ œ ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ œ์–ด์˜ '์—ญ์ „'์ด๋‹ˆ๊นŒ ๋ง์ด๋‹ค. Application์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ์„ค์ •๋œ ๊ฐ์ฒด ๊ด€๊ณ„ ๋“ฑ์„ ํ†ตํ•ด์„œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋“ฑ ์ฝ”๋“œ์˜ ์ œ์–ด๊ถŒ์„ Application์ด ๊ฐ–๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ฌ ๋ฟ์ด๋‹ค.

 ์ด๊ฒŒ IoC ๊ฐœ๋…์˜ ๋์ด๋‹ค. ๋ฌผ๋ก  ๋” ์ž์„ธํžˆ ํŒŒ๊ณ ๋“ค๋ฉด ๋๋„ ์—†๊ฒ ์ง€๋งŒ.. ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”๋Š” ์—ฌ๊ธฐ๊นŒ์ง€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Spring์—์„œ๋Š” ๋ˆ„๊ฐ€ Application์ฒ˜๋Ÿผ ๋‹ค ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋‹ค ๊ด€๊ณ„ ๋งบ์–ด์ฃผ๊ณ  ํ•˜๋Š” ๊ฑธ๊นŒ? ๋ฐ”๋กœ Bean Factory์™€ Application Context๋ผ๋Š” ์นœ๊ตฌ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด๋ฉด ๋‘˜์€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. Bean Factory๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Application Context๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ˆ๊นŒ. ์ฐจ์ด์ ์ด ์กด์žฌํ•˜๊ธด ํ•˜์ง€๋งŒ IoC์˜ ํ•ต์‹ฌ์ธ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ๋งคํ•‘ ๋“ฑ์€ Bean Factory์—์„œ๋ถ€ํ„ฐ ์ •์˜๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
(Application Context๋Š” Bean Factory์— ๋น„ํ•ด ํ•˜๋Š” ์—ญํ• ์ด ์ข€ ๋” ๋งŽ์„ ๋ฟ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ†ตํ•ฉ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.)

 ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ”ํžˆ๋“ค ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์ ์„ ๊ถ๊ธˆํ•ดํ•œ๋‹ค. ์ด ์—ญ์‹œ ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด IoC์˜ ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์ด์™€ ๊ด€๋ จํ•ด์„œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

๐Ÿ™‹‍โ™‚๏ธ์ €๊ธฐ.. ๊ทธ๋Ÿผ DI๋Š” ๋ญ”๊ฐ€์š”?

 ์ž, ๊ทธ๋Ÿผ ์ด์ œ DI๋ฅผ ์‚ดํŽด๋ณด์ž. Spring์— ๋Œ€ํ•ด์„œ ๋งํ•˜๋ฉด ํ•ญ์ƒ ๋”ฐ๋ผ์˜ค๋Š” ๊ฐœ๋…์ด DI.. ์ฆ‰, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋‹ค. ์ผ๋‹จ, DI๋Š” ์•ž์„œ ๋งํ•œ IoC ๊ฐœ๋…์„ Spring ๋‚ด์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฐœ๋…์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด DI๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ฐœ๋…์ผ๊นŒ?

 DI๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋ฐ›๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์ด๋‚˜๋ฏนํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. ์ข€ ๋” ์‰ฝ๊ฒŒ ํ’€์–ด์“ฐ๋ฉด, ์ œ3์˜ ์กด์žฌ๋ฅผ ํ†ตํ•ด์„œ ๋Ÿฐํƒ€์ž„ ์ด์ „, ์ฆ‰, ์„ค๊ณ„ ์‹œ์ ์—๋Š” ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋‘ ๊ฐ์ฒด์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 DI๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„  ์ด 3๊ฐ€์ง€์˜ ์กฐ๊ฑด์ด ์žˆ๋‹ค.

  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์˜์กด๊ด€๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํŒฉํ† ๋ฆฌ ๊ฐ™์€ ์ œ3์˜ ์กด์žฌ๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์˜์กด๊ด€๊ณ„๋Š” ์‚ฌ์šฉํ•  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ๊ณตํ•ด์คŒ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง„๋‹ค.

์œ„์˜ 3๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ์ง€์ผœ์ ธ์•ผ DI๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ.. ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค. Spring์„ ๋ฐฐ์šฐ๋Š” ์ดˆ๋ฐ˜์—๋Š” ์ •๋ง x 10 ๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

----------------DI๋ฅผ ์ฒ˜์Œ ์ ‘ํ•œ ์‚ฌ๋žŒ ๊ธฐ์ค€ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ถ€ํ„ฐ ์ฝ์–ด์ฃผ์„ธ์š”!-----------------

 A๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ B๋ผ๋Š” ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š”๋ฐ, A์— ์ง์ ‘์ ์œผ๋กœ B๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด A์— B์˜ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ๋„˜๊ฒจ์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ? ๋ฐ”๋กœ, ํŒŒ๋ผ๋ฏธํ„ฐ๋‹ค. A๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ํ˜น์€ A ๊ฐ์ฒด ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋Š” ํŠน์ • ๋ฉ”์†Œ๋“œ๊ฐ€ B๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ์— B ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

class A {
	public A(B b) {
    	System.out.println(b.getName());
    }
}

class B {
	private name = "example";
    
    public String getName() {
    	return this.name;
    }
}

 ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋А๋‚Œ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์œ„ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค DI ๋ณด๊ธฐ๋Š” ์–ด๋ ต๋‹ค. B ๊ฐ์ฒด๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์“ฐ์˜€๊ธฐ ๋•Œ๋ฌธ์—! ๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ ๊ฒƒ์ด Interface๋‹ค.

class A {
	public A(C b) {
    	System.out.println(b.getName());
    }
}

class B implements C {
	private name = "example";
    
    public String getName() {
    	return this.name;
    }
}

interface C {
}

 ์œ„์™€ ๊ฐ™์ด A ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, C๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, B๋Š” C๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ตฌํ˜„์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ A๋Š” B๋ผ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ B์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ DI์˜ ๊ฐ€์žฅ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ๋‚ด์šฉ์ด๋‹ค.

 ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ธฐ๋กํ•˜๊ฒ ๋‹ค. (๋” ์ ์œผ๋ฉด ๋‚ด ์ง€์‹์ด ํƒ„๋กœ ๋‚  ๊ฒƒ ๊ฐ™์•„์„œ๋ผ๊ณ  ํ•  ๋ป” ใ…‹ใ…‹)
 ๋งŽ์€ ๋ถ„๋“ค์ด IoC๋‚˜ DI์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๋ฌผ๋ก  ๋‚˜๋„ ๋” ์ž์„ธํžˆ ์•Œ๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค..

ํ˜น์‹œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„์€ ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜†

728x90