์๋
ํ์ธ์! JavaRush ๊ด๋ฆฌ๊ฐ ์๋ก์ด ์์ค์์ ์์
ํ๋ ๋์ ์ ๋ Spring Framework์ ๋ํ ์ผ๋ จ์ ๊ต์ก ๊ธฐ์ฌ๋ฅผ ์์ํ๊ณ ์ถ์ต๋๋ค. ์, ์ธํฐ๋ท์ ์ด๋ฏธ ์ด ์ฃผ์ ์ ๊ดํ ๋ง์ ์๋ฃ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ค์ต์์ ์ ์ ์๋ฏ์ด ๋ชจ๋ Hello World ์์ค์ ์์ต๋๋ค. ์ ๋ ์ฃผ์์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ผ ์ด ๋ชจ๋ ๊ฒ์ด "๋ด๋ถ์ ์ผ๋ก" ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ์ด ๊ธ์ ์ด๋ฏธ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์๊ณ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ต์ํ ์ฌ๋๋ค์ ๋์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํํ๋ ์ค์ ๋๋ค.
์ด์ ๊ธฐ๋ณธ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์ ์๊ฐ์๋ ๊ฐ์ฅ ์ค์ํ ์ ์ค ํ๋๋ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์ค์ ๋๊ณ Bean์ด ์ด๊ธฐํ๋๋์ง ์ดํดํ๋ ๊ฒ์ ๋๋ค. ์์ ๋ค์ํผ Spring์ด ์๋ํ๊ธฐ ์ ์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๋ํ์ ์ด์ ์๋ xml ํ์ผ์ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ์ต๋๋ค(์ผ๋ถ ํ๋ก์ ํธ, ์ฃผ๋ก ์ค๋๋ ํ๋ก์ ํธ์์๋ ์ค๋๋ ๊น์ง ๊ณ์ ์ด ์์ ์ ์ํํฉ๋๋ค). ๋ค์์ ์ด๋ฌํ ๊ตฌ์ฑ ํ์ผ์ ์์ ์์ ๋๋ค.<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="ru.javarush.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
์ ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ๋ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๊ณ ์คํํธ์
์ ์์ํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค(์ด๋ฅํ์ง๋ ์์ต๋๋ค). ํ์ง๋ง ์ด ๊ตฌ์ฑ์ผ๋ก Spring์ด ์ด๋ป๊ฒ ์๋ํ๊ฒ ๋ ๊น์? ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ผ์ด ํฅ๋ฏธ๋ก์์ง๋๋ค. Spring์ด ์ฐ๋ฆฌ์ ๊ตฌ์ฑ์ ์ดํดํ๊ธฐ ์ํด์๋ XmlBeanDefinitionReader
. ์ด๊ฒ์ xml์ ์ค์บ(ํ์ฑ)ํ๊ณ ๊ฑฐ๊ธฐ์ ์์ฑํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก BeanDefinition
์ ์์ฑํ๋ ๋ด๋ถ Spring ๊ตฌ์ฑ ์์์
๋๋ค. BeanDefinition
Bean์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด์
๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค. ํด๋น ํด๋์ค(๋น)๊ฐ ์์ฑ๋์ด์ผ ํ๋ ํด๋์ค; ๋ฒ์; ์ง์ฐ ์ด๊ธฐํ๊ฐ ์ค์น๋์ด ์๋์ง ์ฌ๋ถ ์ด Bean ์ ์ xml์ ์ค๋ช
๋ ๋ค๋ฅธ ์์ฑ๊ณผ ๋ค๋ฅธ ์์ฑ์ ์ด๊ธฐํํด์ผ ํฉ๋๊น? ์์ ๋ ๋ชจ๋ BeanDefinition
๋ ์ ์ถ๊ฐ๋๋ฉฐ HashMap
, ์ฌ๊ธฐ์ ์๋ณ์๋ Bean(์ฌ์ฉ์๊ฐ ์ค์ ํ๊ฑฐ๋ Spring์์ ํ ๋นํ)์ ์ด๋ฆ๊ณผ BeanDefinition
๊ฐ์ฒด ์์ฒด์
๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ง๋ค์ด์ง ํ BeanDefinition
์๋ก์ด ์์
์ด ๋ฌด๋์ ๋ฑ์ฅํฉ๋๋ค - BeanFactory
. HashMapโe
์ด ๊ฐ์ฒด๋ s๋ฅผ ๋ฐ๋ณตํ๊ณ BeanDefinition
์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น์ ์์ฑํ์ฌ IoC ์ปจํ
์ด๋์ ๋ฃ์ต๋๋ค. ์ค์ ๋ก ์ฌ๊ธฐ์๋ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋๋ฉด IoC ์ปจํ
์ด๋์๋ ์ฑ๊ธํค ๋ฒ์(๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋จ)๊ฐ ์๋ Bean์ด ํฌํจ๋๊ณ ๋๋จธ์ง๋ ํ์ํ ๋(ํ๋กํ ํ์
, ์์ฒญ, ์ธ์
) ์์ฑ๋ฉ๋๋ค. ์ด์ ์ฝ๊ฐ์ ์ฌ๋ด์ผ๋ก ๋ค๋ฅธ ์บ๋ฆญํฐ์ ๋ํด ์์ ๋ณด๊ฒ ์ต๋๋ค.
BeanPostProcessor๋ฅผ ๋ง๋๋ณด์ธ์. (BPP)
์ฌ์ค ๋น์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง ํด๋์ค๊ฐ ์๋ ์๋ ์์ต๋๋ค. ๋น์ ์ธํ๋ผ ๋น(Infrastructure Bean)์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด์ ์ธํ๋ผ ๋น์ ๋น์ฆ๋์ค ๋ก์ง ๋น(์, ๋น์ด ๋๋ฌด ๋ง์)์ ๊ตฌ์ฑํ๋ ํด๋์ค์ ๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋์์ ์ค๋ช ํ๊ฒ ์ง๋ง BPP๊ฐ ์ ํํ ๋ฌด์์ ๊ตฌ์ฑํ๋์ง ์ข ๋ ๋ช ํํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ๋ค๋ค ์์ฝ์ ์ ์์์ฃ@Autowired
? ๋ฐ๋ผ์ AutowiredAnnotationBeanPostProcessor
๋ชจ๋ ํด๋์ค๊ฐ ์๋ก ๋ด์ฅ๋์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ ๊ทํ์ ์ฑ
์์
๋๋ค.
BeanFactory๋ก ๋์๊ฐ์
HashMap
์ด์ BPP์ ๋ํด ์์์ผ๋ฏ๋ก ์ ๋ฐ๋ณตํ ๋ ๋ชจ๋ ๊ฐ ๋จผ์ ์์ฑ๋์ด ๋ณ๋๋ก ๋ฐฐ์น๋๋ค๋ ์ ์ ๋ช
ํํ ํด์ผ ํฉ๋๋ค BeanDefinition
(IoC ์ปจํ
์ด๋๊ฐ ์๋) BeanPostProcessor
. ๊ทธ๋ฐ ๋ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ผ๋ฐ Bean์ด ์์ฑ๋์ด IoC ์ปจํ
์ด๋์ ๋ฐฐ์น๋๋ฉฐ ๋ณ๋๋ก ์ง์ฐ๋ BPP๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ด ์์๋ฉ๋๋ค. ์ด๊ฒ์ด ์ผ์ด๋๋ ๋ฐฉ์์
๋๋ค. ๊ฐ BPP์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
postProcessorBeforeInitialization(Object bean, String beanName);
postProcessorAfterInitialization(Object bean, String beanName);
bin์ ๋ ๋ฒ ๋ฐ๋ณตํฉ๋๋ค. ๋ฉ์๋๊ฐ ์ฒ์ ํธ์ถ๋ ๋ postProcessorBeforeInitialization
์ ๋ ๋ฒ์งธ๋ก ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ postProcessorAfterInitialization
. ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ํ์ํ์ง์ ๋ํ ์๋ฌธ์ด ์๊ฒผ์ต๋๋ค. ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ์ฌ์ค์ ์ผ๋ถ ์ฃผ์(์: @Transactional
)์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Bean์ด ํ๋ก์ ํด๋์ค๋ก ๋์ฒด๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ์ํ๋๋ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ์๋ ๋ฐฉ์์ ์์์ผ ํ๋ฉฐ @Transactional
์ด๊ฒ์ด ์๋ํ๋ ๋ฐฉ์์
๋๋ค. ์ด ์ฃผ์์ผ๋ก ํ์๋ ๋ฉ์๋์ ์ฆ์ ๋ช ์ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ํ๋์? ๋ง์ต๋๋ค. ํ๋ก์ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ํ์ํ ์ฝ๋๊ฐ ํ์ํ ๋ฉ์๋์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด์ ์ด๋ฐ ์ํฉ์ ์์ํด ๋ณด์ธ์. ์์
์ด ์์ต๋๋ค.
class A {
@Autowired
private SomeClass someClass;
@Transactional
public void method() {
// ะผะพะดะธัะธะบะฐัะพั ะดะพัััะฟะฐ ะพะฑัะทะฐัะตะปัะฝะพ public
}
}
์ด ํด๋์ค์๋ 2๊ฐ์ ์ฃผ์ @Autowired
๊ณผ @Transactional
. ๋ ์ฃผ์ ๋ชจ๋ ์๋ก ๋ค๋ฅธ BPP์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋จผ์ ์๋ํ๋ฉด AutowiredBPP
๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ์ฌ์ค ํ๋ก์ ํด๋์ค๊ฐ ์์ฑ๋๋ฉด ๋ชจ๋ ๋ฉํ ์ ๋ณด๊ฐ ์์ค๋ฉ๋๋ค. ์ฆ, @Autowired
ํ๋ก์ ํด๋์ค์ ์ฃผ์์ ๋ํ ์ ๋ณด๊ฐ ์์ผ๋ฏ๋ก AutowiredBPP
์๋ํ์ง ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ ํ๋๊ฐ someClass
๊ฐ์ ๊ฐ์ง๊ฒ ๋์ด null
NPE๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฉ์๋ ํธ์ถ ์ฌ์ด์ -method๊ฐ ์๋ ๊ฒฝ์ฐ ํธ์ถ postProcessorBeforeInitialization
๋๋ค๋ ์ ๋ ์์๋๋ ๊ฒ์ด ์ข์ต๋๋ค . ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋ฒ์งธ ์์ฑ์์ด์ง๋ง ์ฐจ์ด์ ์ ํ์ฌ ๋ชจ๋ ์ข
์์ฑ์ด ์ด๋ฏธ ํด๋์ค์ ํฌํจ๋์ด ์์ผ๋ฉฐ -method์์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํ ๋ฒ ์ปจํ
์คํธ ์ด๊ธฐํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. postProcessorAfterInitialization
init
init
XmlBeanDefinitionReader
xml ๊ตฌ์ฑ ํ์ผ์ ์ค์บํฉ๋๋ค.- ์(๋ฅผ) ๋ง๋ค์ด์
BeanDefinition
๋ฃ์ต๋๋คHashMap
. - ์ค๊ณ
BeanFactory
์ด๊ฒ์ผ๋ก๋ถํฐHashMap
๋ชจ๋ '๋ฅผ ๋ณ๋๋ก ํฉ์ฐํฉ๋๋คBeanPostProcessor
. BeanDefinition
์์ ๋น์ ์์ฑํ์ฌ IoC ์ปจํ ์ด๋์ ๋ฐฐ์นํฉ๋๋ค.- ์ฌ๊ธฐ์ BPP๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ Bean์ ๊ตฌ์ฑํฉ๋๋ค.
- ์ค๋น๊ฐ ๋.
GO TO FULL VERSION