Michael Mattson์ 1996๋ ๋ ผ๋ฌธย Object-Oriented Frameworks: A survey of methodological issues์์ ์ฒ์ ๋ฑ์ฅํ ๊ฐ๋ .
์ ์ด์ ์ญ์ , ์ฆ IoC๋ ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ ํ๋ก๊ทธ๋จ์ด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ย ํ๋ฆ ์ ์ด๋ฅผ ๋ฐ๋ ๋์์ธ ์์น์ ๋งํ๋ค.
์ด๋ฌํ IoC ๊ตฌ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ ์์ํฌ๋ผ ๋ถ๋ฅธ๋ค!
"์ฐ๋ฆฌ์๊ฒ ์ ํํ์ง ๋ง์ธ์. ์ฐ๋ฆฌ๊ฐ ๋น์ ์๊ฒ ์ฐ๋ฝํ ๊ฒ์.โ
โGoF์ ๋์์ธ ํจํดโ์ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด ์ฑํฐ์์ ๋ฑ์ฅํ๋ ๋น์
๊ตฌํ ๋ชจ๋
, ์ํ์ฌ๋ ํ๋ ์์ํฌ
๋ผ๊ณ ๋ณผ ์ ์๋ค.ํ๋ฆ์ ์ด์ ์ฃผ์ฒด๋ ๋ถ๋ชจ ํด๋์ค์ธ AbstractClass
์ด๋ค.
AbstractClass
, ํ๋ ์์ํฌ)๋ConcreteClass
, ํด๋ผ์ด์ธํธ) ์ฐ์ฐ์ ํธ์ถํ ์ ์์ง๋ง,์ด์ธ์๋
์ ๋ต ํจํด, ์๋น์ค ๋ก์ผ์ดํฐ ํจํด, ํฉํ ๋ฆฌ ํจํด, ์์กด๊ด๊ณ ์ฃผ์ (DI) ,์์กด๊ด๊ณ ๊ฒ์(DL)
๋ฑ์ ๋ฐฉ๋ฒ์ผ๋ก IoC๋ฅผ ๋ฌ์ฑํ ์ ์๋ค!
์์กด์ฑ ๋ถํจ : ๊ณ ์์ค ๊ตฌ์ฑ์์๊ฐ ์ ์์ค ๊ตฌ์ฑ์์์ ์์กดํ๊ณ , ๊ทธ ์ ์์ค ๊ตฌ์ฑ์์๋ ๋ค์ ๊ณ ์์ค ๊ตฌ์ฑ์์์ ์์กดํ๊ณ , ๊ทธ ๊ณ ์์ค ๊ตฌ์ฑ์์๋ ๋ค์ ๋ ๋ค๋ฅธ ๊ตฌ์ฑ์์์ ์์กดํ๊ณ , ๊ทธ ๋ค๋ฅธ ๊ตฌ์ฑ์์๋ ๋ ์ ์์ค ๊ตฌ์ฑ์์์ ์์กดํ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ผ๋ก ์์กด์ฑ์ด ๋ณต์กํ๊ฒ ๊ผฌ์ฌ์๋ ๊ฒ
- Head First Design Patterns
Robert Martin
ย (Uncle BoB)์ ์ํด ์๊ฐ๋ย SOLID
ย ์์น ์ค ํ๋.
ํ์ ๋ ๋ฒจ ๋ชจ๋์ ๋ณ๊ฒฝ์ด ์์ ๋ ๋ฒจ ๋ชจ๋๊น์ง ์ ํ๋๋ ๊ตฌ์กฐ์ ๋ฌธ์ ์์ ๋ฐ์ํ๋ ์๊ณ๊ด๊ณ๋ฅผ ๋๊ธฐ ์ํ ์์น์ด๋ค.
์๋ 2๊ฐ์ง ์์น์ ๋ฐ๋ฅธ๋ค.
์ถ์ํ
์ ์์กดํด์ผ ํ๋ค.OCP
๋ฅผ ์งํฌ ์ ์๋ค.๋งํด ํ์ธ๋ฌ๊ฐ ์ฐฝ์ํ ๊ฐ๋ .
ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์กด์ฑ์ ์ ๊ณตํ๋ ํ ํฌ๋์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค(๋ชจ๋)๋ฅผ ์ง์ ๊ตฌ์ถํ๊ฑฐ๋ ์ฐพ๋ ๋์ , ํด๋ผ์ด์ธํธ์๊ฒ ์๋น์ค(๋ชจ๋)๋ฅผ ์ ๋ฌ(์ฃผ์ )ํ๋ ๊ฒ์ด ํจํด์ ๊ธฐ๋ณธ ์๊ฑด์ด๋ค.
'Dependency Injection'์ ์ฌ๋ฌ ๊ฐ์ง ์ฐ๋ฆฌ๋ง๋ก ๋ฒ์ญ๋ผ์ ์ฌ์ฉ๋๋ค. ๊ทธ์ค์์ ๊ฐ์ฅ ํํ ์ฌ์ฉ๋๋ ์ฉ์ด๊ฐ ์์กด์ฑ ์ฃผ์ ์ด๋ค. ํ์ง๋ง ์์กด์ฑ์ด๋ผ๋ ๋ง์ DI์ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง ์ ๋๋ฌ๋ด์ฃผ์ง ๋ชปํ๋ค.
(โฆ) ์๋ฐํ ๋งํด์ ์ค๋ธ์ ํธ๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ์ฃผ์ ํ ์ ์๋ ๊ฒ ์๋๋ค. ์ค๋ธ์ ํธ์ ๋ ํผ๋ฐ์ค๊ฐ ์ ๋ฌ๋ ๋ฟ์ด๋ค.
DI๋ ์ค๋ธ์ ํธ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์ ๊ณต(์ฃผ์ )๋ฐ๊ณ ์ด๋ฅผ ํตํด ์ฌํ ์ค๋ธ์ ํธ์ ๋ค์ด๋ด๋ฏนํ๊ฒ ์์กด๊ด๊ณ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์ฉ์ด๋ ๋์๋ฐฉ์(๋ฉ์ปค๋์ฆ)๋ณด๋ค๋ ์๋๋ฅผ ๊ฐ์ง๊ณ ์ด๋ฆ์ ์ง๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฐ ๋ฉด์์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๋ ๋ฒ์ญ์ด ์ ์ ํ ๋ฏ์ถ๊ณ , ์ด ์ฑ ์์๋ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
- ํ ๋น์ ์คํ๋ง 1.7.2 112์ชฝ
public interface Person {
String study();
String sleep();
}
public class Summer implements Person {
@Override
public String study() {
return "์จ๋จธ๋ ์ ๋ฆ์์ ๊ณต๋ถํ๋ค.";
}
@Override
public String sleep() {
return "์จ๋จธ๋ ์๋ค.";
}
}
public class Philz implements Person {
@Override
public String study() {
return "ํ์ฆ๋ ์ ์ค์์ ๊ณต๋ถํ๋ค.";
}
@Override
public String sleep() {
return "ํ์ฆ๋ ์๋ค.";
}
}
public class PersonService {
private Person person;
public PersonService(Person person) {
this.person = person;
}
public String wootecoLife() {
return person.study() + person.sleep();
}
}
public class PersonServiceFactory {
public static PersonService summerService() {
return new PersonService(new Summer())
}
public static PersonService philzService() {
return new PersonService(new Philz())
}
}
public class Application {
public static void main(String[] args) {
PersonService summerService = PersonServiceFactory.summerService()
summerService.wootecoLife();
// "์จ๋จธ๋ ์ ๋ฆ์์ ๊ณต๋ถํ๋ค. ์จ๋จธ๋ ์๋ค."
}
}
๐ย IoC๋ฅผ ๋ง์กฑํ๋ ์ค๊ณ ๊ตฌ์กฐ
PersonService
์ด๋ค.PersonService
๋ ๊ตฌํ ๋ชจ๋์ธ Person
์ ํธ์ถํด wootecoLife()
๋ก์ง์ ์์ํ๋ค!Person
์ PersonService
๋ฅผ ์์ง ๋ชปํ๋ค.๐ย DIP๋ฅผ ๋ง์กฑํ๋ ์ค๊ณ ๊ตฌ์กฐ
PersonService
๋ ๊ตฌ์ฒด ํด๋์ค Summer
๊ฐ ์๋, ์ถ์ํ๋ Person
์ ์์กดํ๊ณ ์๋ค.PersonService
, ํ์๋ชจ๋ Summer
๋ชจ๋ ์ถ์ํ๋ Person
์ ์์กดํ๊ณ ์๋ค!Person
์ Summer
๋ Philz
์ ์์กดํ์ง ์์ผ๋ฉฐ, Summer
, Philz
๋ง ์ถ์ํ๋ Person
์ ์์กดํ๋ค.๐ย DI๋ฅผ ๋ง์กฑํ๋ ์ค๊ณ ๊ตฌ์กฐ
PersonService
๋ ์์กด๊ด๊ณ Person
์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ธ์ง ์ง์ new๋ก ์ ์ํ์ง ์๋๋ค.PersonServiceFactory
์์ ์์ฑ์๋ฅผ ํตํด ์์กด๊ด๊ณ Person
์ ์ฃผ์
๋ฐ๋๋ค!IoC๋ ๋งค์ฐ ๋์จํ๊ฒ ์ ์๋ผ์ ํญ๋๊ฒ ์ฌ์ฉ๋๋ ์ฉ์ด์ด๋ค. ๋ช๋ช ์ฌ๋์ ์ ์์ผ๋ก ์คํ๋ง์ด ์ ๊ณตํ๋ IoC ๋ฐฉ์์ ํต์ฌ์ ์ง์ด์ฃผ๋ ์์กด๊ด๊ณ ์ฃผ์ (
Dependency Injection
)์ด๋ผ๋, ์ข ๋ ์๋๊ฐ ๋ช ํํ ๋๋ฌ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ค.
์คํ๋ง์ด ์ฌํ ํ๋ ์์ํฌ์ ์ฐจ๋ณํ๋ผ์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์
์์กด๊ด๊ณ ์ฃผ์
์ด๋ผ๋ ์๋ก์ด ์ฉ์ด๋ฅผ ์ฌ์ฉํ ๋ ๋ถ๋ช ํ๊ฒ ๋๋ฌ๋๋ค. ๊ทธ๋์ ์ด๊ธฐ์๋ ์ฃผ๋ก IoC ์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ์คํ๋ง์ด ์ง๊ธ์ ์์กด๊ด๊ณ ์ฃผ์ ์ปจํ ์ด๋ ๋๋ ๊ทธ ์๋ฌธ์ฝ์๋ฅผ ์จ์DI ์ปจํ ์ด๋
๋ผ๊ณ ๋ ๋ง์ด ๋ถ๋ฆฌ๊ณ ์๋ค.
- ํ ๋น์ ์คํ๋ง 1์ฅ
์๋์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ฃผ๋ ์คํ๋ง ํ๋ ์์ํฌ(์ปจํ ์ด๋)!
Bean
์ ์์ฑํ๊ณ ,๋ณดํต ๋น ํฉํ ๋ฆฌ
(BeanFactory
)๋ฅผ ์์ํ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ
(ApplicationContext
)๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
(๋น ํฉํ ๋ฆฌ `=. ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ = DI ์ปจํ ์ด๋)
์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ
๋ ์ ํ๋ฆฌ์ผ์ด์
์์ IoC
๋ฅผ ์ ์ฉํด์ ๊ด๋ฆฌํ โ๋ชจ๋ bean
๊ฐ์ฒด์ ๋ํ ์์ฑ๊ณผ ๊ด๊ณ ์ค์ โ์ ๋ด๋นํ๋ค.PersonServiceFactory
์ ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.bean
๊ฐ์ฒด์ ๋ํ ์๋ DI ๊ฐ ์ด๋ค์ง๋ค!POJO
๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค.TDD
๊ฐ ์ฉ์ดํ๋ค.@Component
์ด๋ @Configuration
๋ฐ @Bean
์ผ๋ก ๋น์ ๋ฑ๋กํ๋ฉด, ๋ฑ๋ก๋ ๋น๋ค ์ฌ์ด์ ์์กด๊ด๊ณ๊ฐ ์๋์ผ๋ก ์ฃผ์
๋๋ค.
๋ณ๋ค๋ฅธ ์ด๋
ธํ
์ด์
์์ด ๋งค๊ฐ๋ณ์ ์์ฑ์๋ง ์ด์ด๋๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ฆ, @Autowired
์ด๋
ธํ
์ด์
์ ์๋ตํด๋ ๋๋ค
@Component
public class Store {
private Item item;
public Store(Item item) {
this.item = item;
}
}
@Autowired
ย ์ฃผ์์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ ์ ์๋ค .
@Component
public class Store {
@Autowired
private Item item;
}
๋ง์ฝ ํ์์ ์ธ ์์กด์ฑ์ ์ค์ผํ๋ ๊ณณ์์ ์ธํฐ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด
null
์ ๋ํ ๊ฒ์ฆ ๋ก์ง์ ๋ชจ๋ ํ๋์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
@Component
public class Store {
private Item item;
@Autowired
public void setItem(Item item) {
this.item = item;
}
}
1. ๋จ์ผ ์ฑ ์์ ์์น
ํ๋ ์ฃผ์ ์ ์์กด์ฑ ์ฃผ์ ์ด ๋๋ฌด ์ฌ์ฐ๋ฏ๋ก ๋ฌด๋ถ๋ณํ ์์กด์ฑ์ ์ฃผ์ ํ ์๋ ์๋ค. ๊ทธ๋ฌ๋ฉด ํ๋์ ํด๋์ค์์ ์ง๋์น๊ฒ ๋ง์ ๊ธฐ๋ฅ์ ํ๊ฒ ๋ ์ ์๋ ์ฌ์ง๊ฐ ์๊ณ , โ๊ฐ์ฒด๋ ๊ทธ์ ๋ง๋ ๋์๋ง ํ๋คโ๋ผ๋ ๋จ์ผ ์ฑ ์์ ์์น์ด ๊นจ์ง๊ธฐ ์ฝ๋ค.
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ์ ์ฃผ์ ํด์ผ ํ๋ ๋์์ด ๋ง์์ง์๋ก ์์ฑ์์ ์ธ์๊ฐ ๋์ด๋๋ค. ์ด๋ ์์กด๊ด๊ณ์ ๋ณต์ก์ฑ์ ์ฝ๊ฒ ํ์ ํ ์ ์๋๋ก ๋์์ฃผ๋ฏ๋ก ๋ฆฌํฉํ ๋ง์ ์ค๋ง๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
2. DI ์ปจํ ์ด๋์์ ๋ฎ์ ๊ฒฐํฉ๋
ํ๋ ์ฃผ์
์ ์ฌ์ฉํ๋ฉด ์์กด ํด๋์ค๋ฅผ ๊ณง๋ฐ๋ก ์ธ์คํด์คํ ์ํฌ ์ ์๋ค. ๋ง์ฝ IoC ์ปจํ
์ด๋ ๋ฐ์ ํ๊ฒฝ์์ ์์กด์ฑ์ ์ฃผ์
๋ฐ๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋, Reflection
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ธ์๋ ์ฐธ์กฐํ ๋ฐฉ๋ฒ์ด ์๋ค. ์์ฑ์ ๋๋ ์ธํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์์กด ๊ฐ์ฒด ํ๋๋ฅผ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ฑ์ ์์ฑ์๋ก ์์กด์ฑ์ ์ฃผ์ ๋ฐ๊ธฐ ๋๋ฌธ์ IoC ์ปจํ ์ด๋์ ์์กดํ์ง ์๊ณ ์ฌ์ฉํ ์ ์๊ณ , ๊ทธ ๋๋ถ์ ํ ์คํธ์์๋ ๋ ์ฉ์ดํจ์ ๋ณด์ธ๋ค.
3. ํ๋์ ๋ถ๋ณ์ฑ ๋ณด์ฅ
ํ๋ ์ฃผ์
์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด์ฑ์ Reflection
์ผ๋ก ์ฃผ์
๋ฐ๊ธฐ ๋๋ฌธ์ ํ๋ ๋ณ์๋ฅผ ๋ถ๋ณ์ผ๋ก ์ ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์์ฑ์ ์ฃผ์
์ ํ๋๋ฅผ final
๋ก ์ ์ธํ ์ ์๋ค. ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋น์ฉ์ ์ ์ฝํ ์ ์๋ค.
4. ์ํ ์์กด ๋ฐฉ์ง
์์ฑ์ ์ฃผ์
์์๋ ์ํ ์์กด์ฑ์ ๊ฐ์ง ๊ฒฝ์ฐ BeanCurrentlyInCreationException
์ด ๋ฐ์ํด์ ๋ฌธ์ ์ํฉ์ ์ ์ ์๊ฒ ํด์ค๋ค.
Dependency Lookup
) : ์์กด๊ด๊ณ ๊ฒ์public Store() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(ItemFactory.class);
this.connectionMaker = context.getBean("item", Item.class);
}
์์กด๊ด๊ณ๋ฅผ ๋งบ๋ ๋ฐฉ๋ฒ์ด ์ธ๋ถ๋ก๋ถํฐ์ ์ฃผ์
์ด ์๋๋ผ ์ค์ค๋ก ๊ฒ์์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์์กด๊ด๊ณ ๊ฒ์(dependency lookup
)์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
์์กด๊ด๊ณ ๊ฒ์์ ์์ ์ด ํ์๋ก ํ๋ ์์กด ์ค๋ธ์ ํธ๋ฅผ ๋ฅ๋์ ์ผ๋ก ์ฐพ๋๋ค.
์์กด๊ด๊ณ ๊ฒ์์ ๋ฐํ์ ์ ์์กด๊ด๊ณ๋ฅผ ๋งบ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ๊ณผ ์ค๋ธ์ ํธ์ ์์ฑ ์์
์ ์ธ๋ถ ์ปจํ
์ด๋์๊ฒ IoC
๋ก ๋งก๊ธฐ์ง๋ง, ์ด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ ๋ฉ์๋๋ ์์ฑ์๋ฅผ ํตํ ์ฃผ์
๋์ ์ค์ค๋ก ์ปจํ
์ด๋์๊ฒ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
์์กด๊ด๊ณ ์ฃผ์
์ชฝ์ด ํจ์ฌ ๋จ์ํ๊ณ ๊น๋ํ๋ค.
์ฌ์ฉ์์ ๋ํ DB ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ๊ฒ์ธ๊ฐ์ ์ง์คํด์ผ ํ๋ UserDao์์ ์คํ๋ง์ด๋ ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ API๋ฅผ ์ด์ฉํ๋ ์ฝ๋๊ฐ ์์ฌ ์๋ ๊ฒ์ ์ด์ํ๋ค. ๋๊ฐ๋ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ ํธ์ด ๋ซ๋ค.
์์กด๊ด๊ณ ๊ฒ์
๋ฐฉ์์์๋ ๊ฒ์ํ๋ ์ค๋ธ์ ํธ๋ ์์ ์ด ์คํ๋ง์ ๋น์ผ ํ์๊ฐ ์์ผ๋ฏ๋ก, ๋น์ด ์๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์์กด๊ด๊ณ ๊ฒ์์ ์ฌ์ฉํ๋ค.
- ํ ๋น์ ์คํ๋ง 1์ฅ
IoC
: ์ ์ด์ ์ญ์ , ์์ ๋ชจ๋์ด ํ์ ๋ชจ๋ ํ๋ฆ์ ์ ์ดํ๋ GoF์ ๋ฑ์ฅํ๋ ๋์์ธ ์์น(ํ ๋ฆฌ์ฐ๋ ์์น)
DIP
: ์์กด์ฑ ์ญ์ ์์น, ์์ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ๊ตฌ์ฒด ํด๋์ค๊ฐ ์๋ ์ถ์ํ์ ์์กดํ๋ SOLID ๋์์ธ ์์น
DI
: ์์กด์ฑ ์ฃผ์
, ๋ชจ๋(๊ฐ์ฒด) ๊ฐ ์์กด์ฑ์ new๋ก ์ง์ ์ ์ํ์ง ์๊ณ ์ธ๋ถ์์ ์ฃผ์
ํ๋ ๋์์ธ ํจํด. (๊ผญ ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ฃผ์
์ผ ํ์๋ ์๋ค.)
Spring DI/IoC
: ์คํ๋ง์์๋ ์ดํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ผ๋ IoC/DI ์ปจํ
์ด๋๋ฅผ ํตํด bean
์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด์ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํด์ค๋ค.
์ด๋ DI ๋ฐฉ์์๋ ์ด 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ์ค ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ด ์ ์ผ ๊ถ์ฅ๋๋ค. ์์กด๊ด๊ณ ํ์ ์ด ์ฌ์ ๋จ์ผ์ฑ ์์์น์ ์งํค๋๋ก ๋๊ณ , DI ์ปจํ ์ด๋ ๋ฐ์์๋ ๊ฐ์ฒด ์ฃผ์ ์ด ๊ฐ๋ฅํ๊ณ , ํ๋ ๋ถ๋ณ์ฑ์ด ๋ณด์ฅ๋๋ฉฐ, ์ํ ์์กด์ด ๋ฐฉ์ง๋๋ค.
์คํ๋ง์์ DI ๋์ DL
์ ํตํด์๋ IoC๋ฅผ ์งํฌ ์ ์๋๋ก ์ง์ํ๋ค. DL
์ ๊ฐ์ฒด ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ IoC ์ปจํ
์ด๋์์ ํ๋, ์์กด์ฑ์ ์ฃผ์
๋ฐ๋ ๋์ ์ง์ ์ปจํ
์ด๋์์ ๊ฒ์ํด ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด๋ค. ๋น ๋ฐ๊นฅ์์ ๋น ๊ฐ์ฒด์ ์ ๊ทผํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
Dependency Injection, IoC, DIP, IoC container์ ๋ฆฌ
https://black-jin0427.tistory.com/194
Dependency Injection, IoC, DIP, IoC container์ ๋ฆฌ
ํ ๋น์ ์คํ๋ง 1์ฅ