DI
์ค๋ช
์์กด์ฑ ์ฃผ์
์ด๋ผ๊ณ ๋ ํ๋ฉฐ, IoC (Inversion of Control) ๋ผ๊ณ ํ๋ ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค ํ๋.
์ด๋ค ํด๋์ค๊ฐ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ธ๋ถ์์ ์์ฑํ ํ, ๋ด๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ณผ์
DI ์ปจํ
์ด๋๋ฅผ ํตํด ๊ฐ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํตํฉ ๊ด๋ฆฌํ๋ฉด์ ์ปดํฌ๋ํธ๊ฐ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
โณ๏ธ ๋น (@bean)
spring DI container์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด
ApplicationContext.getBean(XXX.class) ์ผ๋ก ์ป์ด์ง๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
โณ๏ธ ์ปดํฌ๋ํธ (@Component)
์ฌ์ฉ์๊ฐ ๋ง๋ bean ์ ์๋์ผ๋ก ๊ฐ์งํ ์ ์๋๋ก ํ ๊ฒ
โณ๏ธ IoC ์ปจํ ์ด๋ (Inversion of Control)
์์กด์ฑ ์ฃผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฐ์ด๊ณ ์ธ์คํด์ค ๊ตฌ์ฑ ๋ฐ ๋น ์กฐ๋ฆฝ์ ๋ด๋นํ๋ค.
๋น ํฉํ ๋ฆฌ(Bean Factory)๋ผ๊ณ ๋ ํจ.
Bean Factory์ ์ฌ๋ฌ๊ฐ์ง ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ApplicationContext๋ผ๊ณ ๋ถ๋ฆ. (Bean Factory์ ํ์ฅ)
โณ๏ธ Bean Factory
Bean ์ ๋ฑ๋ก/์์ฑ/์กฐํ/๋ฐํ ๊ด๋ฆฌํจ.
โณ๏ธ ApplicationContext
spring bean์ ๋ณด์ ํ๊ณ ์๋๊ณณ
Bean Factory ์ ๊ธฐ๋ฅ ๊ฐ๊ณ , Spring์ ๋ถ๊ฐ ์๋น์ค๋ฅผ ์ถ๊ฐ๋ก ์ ๊ณต
์ด๋ค ์ปดํฌ๋ํธ๋ ์ฑ๊ธํด(singleton) ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ฉฐ, ์ด๋ค ์ปดํฌ๋ํธ๋ ํ๋กํ ํ์
(prototype) ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ฌํ ์ธ์คํด์ค ์ค์ฝํ(scope) ๊ด๋ฆฌ๋ฅผ DI ์ปจํ
์ด๋๊ฐ ๋์ ํด์ค๋ค.
DI ๋ฐฉ๋ฒ 3๊ฐ์ง
1. ์ค์ ์ ๊ธฐ๋ฐ (setter-based)
setter method ์ @Autowired ์ ์ ์ฉ
@RestController
public class AController {
private A a;
@Autowired
public void setA(A a) {
this.a = a;
}
}
2. ์์ฑ์ ๊ธฐ๋ฐ (contructor-based)
์์ฑ์ ์ธ์๋ฅผ ์ฌ์ฉํด ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์
@RestController
public class AController {
private final A a;
public AController(A a){
this.a = a;
}
}
3. ํ๋๊ธฐ๋ฐ (field-based)
์ฌ์ฉํ๊ณ ์ถ์ ํ๋์ @Autowired ์ ์ ์ฉ
@RestController
public class AController {
@Autowired
private A a;
}
โณ๏ธ @Autowired
๋น์ ์๋์ผ๋ก ์ฃผ์ ํ๋ ๋ฐฉ์
ํ๋ ๊ธฐ๋ฐ ๋ฐฉ์์ ์ถ์ฒํ์ง ์๋๋ค. (์์ฑ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋๊ฒ์ ๊ถ์ฅ)
์ถ์ฒํ์ง ์๋ ์ด์ ๋ ์ํ์ฐธ์กฐ ๋๋ฌธ!
โณ๏ธ ์ํ์ฐธ์กฐ
์๋ก ๋ค๋ฅธ ํด๋์ค๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ํ, ๋ฐ๋ผ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ด๋ค ๋น์ ๋จผ์ ์์ฑํด์ผํ ์ง ํ๋จ์ ํ์ง ๋ชปํด์ ๋ฐ์ํ๋ ๋ฌธ์ !
์์ฑ์ ๋ฐฉ์์ ์ถ์ฒํ๋ ์ด์ ๋ ํ
์คํธ ์ฝ๋ ์์ฑ์ ์ฉ์ํ๋ฉฐ, ์คํ ์ค ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
DI ์ปจํ ์ด๋ ์ฌ์ฉ์ ์ฅ์
์ฅ์
์ธ์คํด์ค ์ค์ฝํ ์ ์ด
์ธ์คํด์ค ์๋ช
์ฃผ๊ธฐ ์ ์ด
AOP ๋ฐฉ์์ผ๋ก ๊ณตํต๊ธฐ๋ฅ ์ ์ฉ ๊ฐ๋ฅ
์์กดํ๋ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ๋จ์ํ
์คํธ ์ฝ๊ฒ ๊ฐ๋ฅ
๋น ์ค์ ๋ฐฉ๋ฒ
์ค์ ๋ฐฉ๋ฒ 3๊ฐ์ง
1. ์๋ฐ ๊ธฐ๋ฐ ์ค์ ๋ฐฉ์ (Java-based configuration)
- ์๋ฐ ํด๋์ค์ @Configuration, ๋ฉ์๋์ @Bean ์ ์ฌ์ฉํด ๋น์ ์ ์ํ๋ ๋ฐฉ๋ฒ
2. XML ๊ธฐ๋ฐ ์ค์ ๋ฐ์ (XML-based configuration)
- XML ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ (<bean>, <constructor-arg>, <property>)
3. ์ ๋ํ
์ด์
๊ธฐ๋ฐ ์ค์ ๋ฐฉ์ (Annotation-based configuration)
- @Component ๊ฐ์ ๋ง์ปค ์ด๋
ธํ
์ด์
์ด ๋ถ์ฌ๋ ํด๋์ค๋ฅผ ํ์ํด์(Component Scan) IoC์ปจํ
์ด๋์ ๋น์ ์๋์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ.
์ปดํฌ๋ํธ ์ค์บ (Component Scan)
์ค๋ช
ํด๋์ค ๋ก๋(Class Loader)๋ฅผ ์ค์บํ๋ฉด์ ํน์ ํด๋์ค๋ฅผ ์ฐพ์ ๋ค์, DI ์ปจํ ์ด๋์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
์ข ๋ฅ
@Component, @Controller, @Service, @Repository, @Configuration, @RestController, @ControllerAdvice, @ManagedBean, @Named ..
์ฐธ๊ณ
(์ฑ
) ์คํ๋ง ์ฒ ์ ์
๋ฌธ
http://blog.naver.com/PostView.nhn?blogId=gngh0101&logNo=221179100057&parentCategoryNo=&categoryNo=32&viewDate=&isShowPopularPosts=false&from=postView
https://dog-developers.tistory.com/12
https://ict-nroo.tistory.com/120
https://www.baeldung.com/spring-component-annotation
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-basics
'๊ฐ๋ฐ > spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ (0) | 2021.11.25 |
---|---|
Spring - ์คํ๋ง MVC ๊ฐ๋จ ์ ๋ฆฌ (0) | 2021.06.05 |
Spring - AOP(Aspect-Oriented Programming) (0) | 2021.05.25 |
IOC/DI, DI์์ฉ (0) | 2017.11.20 |
spring ์์, maven ์ค์น (0) | 2017.11.12 |