IoC ์ปจํ ์ด๋ - ApplicationContext
์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๋น(bean)์ด๋ผ๊ณ ํ๊ณ , ์ด ๋น(bean)๋ค์ ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ๋ก ์ปจํ ์ด๋๋ฅผ
๋น ํฉํ ๋ฆฌ(BeanFactory) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
BeanFactory์ ์ฌ๋ฌ ๊ฐ์ง ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ค(ApplicationContext)๋ผ๊ณ ๋ถ๋ฆ
ApplcationContext : ์๊ฐ Bean๋ค์ ๋ง๋ค๊ณ , ๊ทธ Bean๋ค์ ์์กด์ฑ์ ์ฎ์ด์ค๋ค. ์ค๋ก์ง Bean๋ค๋ง ๊ด๋ฆฌ!
OwnerController ๊ฐ IoC ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ค์ด์ค๊ณ , ์ปจํ ์ด๋์์ OwnerController ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๋ค.
๊ทธ๋ฆฌ๊ณ , OwnerRepository ์ ๊ฐ์ฒด๋ ๋ง๋ค์ด ์ค๋ค. -> Bean
์ฆ, Bean๋ค์ ์์กด์ฑ๋ค์ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค๋ค.
IoC ์ปจํ ์ด๋๋ Bean๋ค์ ์์กด์ฑ์ ์ฎ์ด์ฃผ๋ฉฐ ์ฃผ์ ์ ์๋์ ์ผ๋ก ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
IoC ์ปจํ ์ด๋ : OwnerController๊ฐ Bean์ผ๋ก ๋ฑ๋ก์ด ๋๊ณ (@Controller๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์๊ธฐ ๋๋ฌธ์), IoC ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ค์ด๊ฐ์ ๊ทธ ๊ฐ์ฒด๋ค์ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ค์ ์์กด์ฑ์ ์ฎ์ด์ค๋ค. OwnerRepository ๋ผ๋ Bean์ ์ฐพ์์ ์์ฑ์์๋ค๊ฐ ์์กด์ฑ์ ์ฃผ์ ์์ผ์ฃผ๋ ์ผ์ ํ๋ค.
Bean์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
1. @Component Scanning
Annotation (์ด๋ ธํ ์ด์ )
- @Component
@Repository
@Service
@Autowired (์์กด์ฑ ์ฃผ์ )
class ์๋จ์ @Component , @Repository , @Service , @Controller ์ด๋ ธํ ์ด์ ์ด ๋ถ์ผ๋ฉด ์๋์ผ๋ก
IoC ์ปจํ ์ด๋์ Bean์ผ๋ก ๋ฑ๋ก์ด ๋๋ค.
2. @Bean์ ์ง์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ. ( ์ ์์)
๋น์ ์ง์ ์ผ์ผํ ๋ฑ๋กํ ๋์๋ @Configuration ์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ๋ฑ๋ก๋ ํด๋์ค ์์ ์ ์ํด์ผํ๋ค.
@SpringBootApplication ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ณด๋ฉด @Configuration ์ด๋ ธํ ์ด์ ์ด ์๋ค.
@Autowired : Bean์ ๊บผ๋ด์ฐ๋ ๋ฐฉ๋ฒ
@RestController //#@RestController์์ @Controller๊ฐ ์๊ณ , ๊ทธ์์ @Component๊ฐ ์์ผ๋ฏ๋ก Bean์ด๋ค.
public class SampleController {
@Autowired
ApplicationContext applicationContext;
@Autowired
String bean_name; // Stringํ์
์ bean_name ์ด๋ผ๋ ์ด๋ฆ์ Bean์ ์ฐ๊ฒ ๋ค.
//IoC ์ปจํ
์ด๋๊ฐ bean_name์ด๋ผ๋ Bean์ ์ฐพ์์ ์์์ ๋ฃ์ด์ค๋ค. (์ปจํ
์ด๋์ ์ญํ !)
@GetMapping("/context")
public String context(){
return "hello " + bean_name; //์ฐ๋ฉด ๋๋ค. (์๋ ์๋๊ฒ์ฒ๋ผ)
}
}
@Autowired ๋ฅผ ์ฌ์ฉํด์ ApplicationContext ์์ ์๋ Bean๋ค์ ๊บผ๋ด์ธ ์ ์๋ค.
xml ์ค์ ํ์ผ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
<context:component-scan base-package = "com.application.demo">
com.application.demo ๋ผ๋ package์ ์๋ bean์ *์ค์บํ์ฌ ๋ฑ๋กํ๊ฒ ๋ค ๋ผ๋ ๋ป.
*Scanning์ ํ ๋์๋ ์ด๋ ธํ ์ด์ ์ ํ์ธํ๊ณ bean์ผ๋ก ์๋์ผ๋ก ๋ฑ๋กํด์ค๋ค.
?? @Autowired๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ์ด๋ป๊ฒ ๋น์ผ๋ก ๋ฑ๋ก์ด ๋๊ฑธ๊น?
์ด๋ค ๋น์ด ๋๋ ํด๋์ค์
์์ฑ์๊ฐ ์ค์ง ํ๋๋ง ์๊ณ ๊ทธ ์์ฑ์์ ๋งค๊ฐ๋ณ์ ํ์
์ด ๋น์ผ๋ก ๋ฑ๋ก์ด ๋์ด์๋ค๋ฉด
@Autowired๊ฐ ์๋๋ผ๋ ์๋์ผ๋ก ์ฃผ์
์ ์์ผ์ค๋ค.
Repository๋ผ๋ interface ๋ฅผ ๊ตฌํํ interface๋ Spring Data JPA์์ .. LifeCycle .. ์ด์ฉ๊ณ ์์ bean์ผ๋ก ์๋์ผ๋ก ๋ฑ๋กํด์ค๋ค.... ๊ทธ๋์ ๋ฐ๋ก @Autowired๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์์ด๋ bean์ผ๋ก ๋ฑ๋ก์ด ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด @Autowired ๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์ ์ ์ฌ๋ผ์ง๋ค๊ณ ํ๋ค. ์ด๋ฐ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด.
@Autowired / @Inject๋ฅผ ์ด๋์ ๋ถ์ผ๊น?
- ์์ฑ์ ( ์ด๋ ํ ํด๋์ค์ ๋ฐ๋์ ํ์ํ ์์กด์ฑ์ด๋ค ํ๋ฉด ์์ฑ์)
๋น์ด ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑ์ ํ์ง ๋ชปํ๋ค. ->
- Setter (๋ง์ฝ *์ด๋ ์์กด์ฑ์ ๋ํ Setter๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด Setter)
*์ด๋ ์์กด์ฑ -> private final PetRepository pets;
- ํ๋ (Setter๊ฐ ์๋ค๋ฉด .. ํ์ง๋ง @Autowired๋ฅผ ์ํด์ ๊ตณ์ด Setter๋ฅผ ๋ง๋ค์ด์๊น์ง ํ ํ์๋ ์๋ค.)
๋ด๊ฐ ์ด๋ค ๋น์ ์ฃผ์ ๋ฐ์๋์ง ํ์ธ ํ๊ณ ์ถ์๋
1. Runner๋ฅผ ํ๋ ๋ง๋ค์ด ์ค๋ค. (implements ApplicationRunner)
2. ๋น์ ์ฃผ์ ๋ฐ์ผ๋ฉด, ์ฃผ์ ๋ฐ์ ๋น์ ํด๋์ค์ด๋ฆ์ ์ถ๋ ฅํ๊ฒ๋ ํด์ค๋ค.
3. @Primary - ๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ ์ผ๋
๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ฌ๋ @Primary๋ก ๋ฑ๋กํด์ฃผ๋ฉด ๊ทธ ๋น์ด ์ฃผ์ ์ด ๋๋ค.
์๋๋ ์คํํ์๋์ ์ถ๋ ฅ๋ฌธ ์ด๋ค.
๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ผ๋, ๋ช ํํ๊ฒ ํ์๋ฅผ ์ํด์ฃผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค.
๊ทธ๋ฆฌํ์ฌ ์ด ์ค๋ฅ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง๊ฐ ์๋ค.
- @Primary ("์ด ๋น์ ๋ฐ์๊ฑฐ๋ค" ๋ผ๊ณ ๋งํนํ๋ ์ฉ๋)
- ํด๋น ํ์ ์ ๋น ๋ชจ๋ ์ฃผ์ ๋ฐ๊ธฐ
- @Qualify (๋น ์ด๋ฆ์ผ๋ก ์ฃผ์ )
@Primary
์ด ๋น์ ์ฃผ์ ํ๋๋ก ํ์ํ๋ ์ฉ๋.
@Qualifier (๋น ์ด๋ฆ์ผ๋ก ์ฃผ์ ) *์ด ๋ฐฉ๋ฒ๋ณด๋จ @Primary๊ฐ ๋ ์์ ํ๋ค.
ํ๋์๋ค๊ฐ ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
@Autowired @Qualifier("๋น์ ์ด๋ฆ")
ํด๋น ํ์ ์ ๋น ๋ชจ๋ ์ฃผ์ ๋ฐ๊ธฐ
๋ชจ๋ ํ์ ์ ๋น์ ์ฃผ์ ๋ฐ์ผ๋ ค๋ฉด ์์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ด ์ถ๋ ฅ์ด ๋๋ค.
- AutowiredAnnotationBeanPostProcessor ๊ฐ ๋น์ผ๋ก ๋ฑ๋ก์ด ๋์ด์๋์ง ํ์ธํ๋ ์ฝ๋