Search
Duplicate
๐Ÿ˜€

04. IoC & Container

ํƒœ๊ทธ

IoC (Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)

โ€ข
๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ Object ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •
โ€ข
๊ฐ์ฒด ๊ด€์˜ ๊ด€๊ณ„๊ฐ€ ๋Š์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋จ (loose coupling)
โ€ข
IoC์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ DI์ด๋‹ค.

IoC ์œ ํ˜•

Dependency Lookup(DL)
โ€ข
์ปจํ…Œ์ด๋„ˆ๊ฐ€ lookup context๋ฅผ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ Resource๋‚˜ Object๋ฅผ ์–ป๋Š” ๋ฐฉ์‹
โ€ข
Lookup ํ•œ Object๋ฅผ ํ•„์š”ํ•œ ํƒ€์ž…์œผ๋กœ Casting ํ•ด ์ฃผ์–ด์•ผ ํ•จ
โ€ข
Naming Exception์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง์ด ํ•„์š”..
Deplendency Injection(DI)
โ€ข
Object์— lookup ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ง์ ‘ ์˜์กด ๊ตฌ์กฐ๋ฅผ Object์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ์‹
โ€ข
Object๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ
โ€ข
Lookup ๊ด€๋ จ ์ฝ”๋“œ๋“ค์ด Object ๋‚ด์—์„œ ์‚ฌ๋ผ์ง
โ€ข
Setter or Constructor๋ฅผ ์‚ฌ์šฉํ•จ

Container

Container

โ€ข
๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์‚ฌ์šฉ, ์†Œ๋ฉธ์— ํ•ด๋‹นํ•˜๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๋‹ด๋‹น
โ€ข
๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ธฐ๋ณธ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์— ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต
Container ๊ธฐ๋Šฅ
โ€ข
๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ
โ€ข
Dependency ๊ฐ์ฒด ์ œ๊ณต
โ€ข
Thread ๊ด€๋ฆฌ
โ€ข
๊ธฐํƒ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ
Container ํ•„์š”์„ฑ
โ€ข
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™ธ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ
โ€ข
์„œ๋น„์Šค look up ์ด๋‚˜ Configuration์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ธฐ ์œ„ํ•จ
โ€ข
์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ Factory ๋˜๋Š” Singleton ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋จ

IoC Container

โ€ข
์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ, ์ œ๊ฑฐ ๋“ฑ์˜ ์ž‘์—…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋Œ€์‹  ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹น
โ€ข
์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ”๋“œ ๋Œ€์‹  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐ–๊ณ  ์žˆ์–ด IoC๋ผ๊ณ  ๋ถ€๋ฆ„
โ€ข
์ด๋Ÿฐ ์ด์œ ๋กœ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ
โ€ข
์Šคํ”„๋ง์—์„œ IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—๋Š” BeanFactory, ApplicationContext๊ฐ€ ์žˆ์Œ

Spring DI Container

โ€ข
Spring DI Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋นˆ(Bean)์ด๋ผ ํ•˜๊ณ , ์ด ๋นˆ๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ(Life-Cycle)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜๋ฏธ๋กœ ๋นˆํŒฉํ† ๋ฆฌ(BeanFactory)๋ผ ํ•œ๋‹ค.
โ€ข
Bean Factory์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ApplicationContext๋ผ ํ•œ๋‹ค.
BeanFactory
โ€ข
Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌ
โ€ข
์ผ๋ฐ˜์ ์œผ๋กœ BeanFactory๋ณด๋‹ค๋Š” ์ด๋ฅผ ํ™•์žฅํ•œ ApplicationContxt ์‚ฌ์šฉ
โ€ข
getBean() ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Œ
ApplicationContext
โ€ข
Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์€ BeanFacotry์™€ ๊ฐ™์Œ
โ€ข
Spring์˜ ๊ฐ์ข… ๋ถ€๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ œ๊ณต
โ€ข
Spring์ด ์ œ๊ณตํ•˜๋Š” AppicationContext ๊ตฌํ˜„ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Œ(Web Application Context,,,)

IoC ๊ฐœ๋…

๊ฐ์ฒด ์ œ์–ด ๋ฐฉ์‹
โ€ข
๊ธฐ์กด : ํ•„์š”ํ•œ ์œ„์น˜์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง ๊ตฌํ˜„
โ€ข
IoC : ๊ฐ์ฒด ์ƒ์„ฑ์„ Container์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌ
IoC ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์žฅ์ 
โ€ข
๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ (loose coupling)

๊ฐ์ฒด๊ฐ„ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

โ€ข
ํด๋ž˜์Šค ํ˜ธ์ถœ ๋ฐฉ์‹
โ€ข
ํด๋ž˜์Šค๋‚ด์— ์„ ์–ธ๊ณผ ๊ตฌํ˜„์ด ๋ชจ๋‘ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ
public class HomeController{ private MeberServiceImpl memberService = new MemberServiceImpl(); private AdminServiceImpl memberService = new AdminServiceImpl(); public void addUser(MemberDto memberDto){ memberService.joinMember(memberDto); adminService.registerMember(memberDto); } }
Java
๋ณต์‚ฌ
โ€ข
HomeContoller์—์„œ MemberService์˜ ๊ตฌํ˜„์ฒด์™€ AdminService์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผํ•จ
โ€ข
ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ ๋  ๋•Œ ๊ทธ ํด๋ž˜์Šค์™€ ๊ฒฐํ•ฉ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ๊ฐ™์ด ์œ ์ง€๋ณด์ˆ˜ ๋˜์–ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ (๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์Œ

IoC ๊ฐœ๋…

๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
โ€ข
์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ ๋ฐฉ์‹
โ€ข
๊ตฌํ˜„ ํด๋ž˜์Šค ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ
โ€ข
ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ๊ต์ฒด ์‹œ ํ˜ธ์ถœ ํด๋ž˜์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ
๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Factory๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
โ€ข
ํŒฉํ† ๋ฆฌ ํ˜ธ์ถœ ๋ฐฉ์‹
โ€ข
ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹์€ ํŒฉํ† ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœ
โ€ข
์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ์‹œ ํŒฉํ† ๋ฆฌ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ. ํ˜ธ์ถœ ํด๋ž˜์Šค์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ
โ€ข
ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์— ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†Œ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•จ(๊ทธ๊ฒƒ ์ž์ฒด๊ฐ€ ํŒฉํ† ๋ฆฌ์— ์˜์กดํ•จ)
๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Assembler๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค (์ตœ์ข… ์ง„ํ™” - Spring)
โ€ข
IoC ํ˜ธ์ถœ ๋ฐฉ์‹
โ€ข
ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ ์„ ๋”ํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฒƒ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๊ฐ€ ๋จ
โ€ข
์‹คํ–‰์‹œ์ (Runtime)์— ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ์ด ๋จ
โ€ข
๊ธฐ์กด์˜ Factory ๋ฐฉ์‹์€ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋Š์Šจํ•ด์ง€๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜๋ฉด ๋นŒ๋“œ๋ฅผ ๋‹ค์‹œํ•ด์„œ ๋ฐฐํฌํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌ! ์™ธ๋ถ€์˜ ์กฐ๋ฆฝ๊ธฐ(Assembler)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋Ÿฐ ์ผ์„ ๋ฐฉ์ง€ํ•จ!!
โ€ข
Spring Container๊ฐ€ ์™ธ๋ถ€์กฐ๋ฆฝ๊ธฐ(Assembler) ์—ญํ• ์„ ํ•จ