( ์ด ์ ๊ฒ์๋ฌผ์์ ์ ๋ฆฌํ ๊ฒ๊ณผ ๊ฐ์ด)
๊ฐ์ฒด ๊ต์ฒด์ ๊ฒฝ์ฐ ์์ ์ด ๋ถํธํ๊ธฐ ๋๋ฌธ์, ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ
๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ ์์กด์ฑ ์ฃผ์
์ด ๊ฐ๋ฅํ์ง๋ง, ์์ฑ์๋ฅผ ํตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๊ณ ์ด๋ ๊ฒ ํ๋ฉด, ์ค์ ๋ก ์คํ๋ง์์ ์์กด์ฑ ์ฃผ์
์ ๋์์ฃผ๊ฒ ๋จ
( ์คํ๋ง์์ ๊ณต์์ ์ผ๋ก ์ถ์ฒํ๋ ๋ฐฉ๋ฒ )
( ์๋๋ ๊ณต์ ๋ฌธ์์ ์์ฑ์ ๊ธฐ๋ฐ ๋ฐ setter ๊ธฐ๋ฐ DI๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ง๋ง, ์คํ๋ง์์๋ ์์ฑ์ ์ฃผ์
์ ์ถ์ฒํ๋ค๋ ๋ด์ฉ์ด ํฌํจ โฌ๏ธ )
[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-constructor-injection
โ ์๋๋ก ๋ฐ๋ก ์์ฑํด๋์ ํ์ผ ๋ณด๊ฑฐ ์ฐธ๊ณ ํ๊ธฐ !
(IoC ์ปจํ ์ด๋ / DI ์ปจํ ์ด๋ ๋ผ๊ณ ๋ ์์ฆ ๊ฝค ๋งํจ )
์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ ์ปดํฌ๋ํธ
( ์คํ๋ง์ด ์ด ์คํ๋ง ์ปจํ
์ด๋๋ฅผ ํตํด ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํจ )
โ๏ธ ์ปดํฌ๋ํธ (component)
์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ ํจ์๋ค์ ๋ชจ์ ํ๋์ ํน์ ํ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ๊ตฌ์ฑํ ์์ ๊ธฐ๋ฅ์ ๋จ์
๊ฐ๋ฐ์๊ฐ ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์ ๋น(Bean)(๊ฐ์ฒด)๋ค์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌํ๊ณ , ๊ฐ๋ฐ์๊ฐ ํ์๋กํ ๋ ์ ๊ณต ( IoC/DI ์๋ฆฌ๊ฐ ์ ์ฉ )
Ex. Bean ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ โ Bean ์์ฑ, ์ธ์คํด์คํ, ๊ตฌ์ฑ, ๊ด๋ฆฌ, ์ ๊ฑฐ ๋ฑ
(์์ฑ๋ถํฐ ์๋ฉธ๊น์ง)
์ด ์์ฒด๋ ์ธํฐํ์ด์ค๊ณ , ์ด๊ฒ์ ํ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ์ฌ์ฉ
( ๋์ ๋ณด์ด์ง๋ ์์ง๋ง ๋ชจ๋ ์ถ์ํ ๋์ด ์์ )
๊ฐ์ฒด ์์ฑ ํ, ์์กด์ฑ ์ฃผ์
์ ํตํด ๋น(๊ฐ์ฒด)๋ค์ ์ฐ๊ฒฐ
โ ๊ฐ๋ฐ์๊ฐ ๋ชจ๋ ๊ฐ์ ์์กด/๊ฒฐํฉ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ฒฝ ์์จ๋ ๋จ
โ ๋ฉ์๋๊ฐ ์ธ์ /์ด๋์ ํธ์ถ๋์ด์ผ ํ๋์ง, ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํ์ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ค๋นํด์ ์ ๋ฌํ์ง ์์๋ ๋จ
โ๏ธ ๋ชจ๋ (module)
๊ด๋ จ๋ ๋ฐ์ดํฐ์ ํจ์๋ฅผ ํ๋๋ก ๋ฌถ์ ๋จ์
โ ๋ณดํต ํ๋์ ์์ค ํ์ผ์ ๋ชจ๋ ํจ์ ์์ฑํ์ง ์๊ณ , ๊ธฐ๋ฅ๋ณ๋ก ๋ฐ๋ก ๋ชจ๋ ๊ตฌ์ฑํจ, ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋๋ค์ ํฉ์ณ ํ๋์ ํ์ผ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋จ ๋ง๋ฆ
์ด๋ฅผ ํตํด, ์ํ๋ ๋งํผ ๋ง์ ๊ฐ์ฒด ๊ฐ์ง ์ ์๊ณ , ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณํ ์ ์์
XML, ์ ๋ํ
์ด์
๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์ ์์
( But, ์ ์๋ ๊ฐ๋ฐ์๊ฐ xml์ ํตํด ๋ชจ๋ ์ค์ ํด์คฌ์ง๋ง, ๋ณต์กํ ๋ถ๋ถ๋ค์ Spring Boot๊ฐ ํด์ฃผ์ด ์์ฆ XML์ ๊ฑฐ์ ์ฌ์ฉ X)
โ ๐ฌ ์ ๋ฆฌํ์๋ฉด, ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ, ๊ฐ๋ฐ์์ ์์ ๋ ๋ ์ปจํ ์ด๋์ ๋ ๋ฆฝ์ ์ธ ์์ญ์ ์ข ์๋์ด, ๊ทธ ํ์ ์ปจํ ์ด๋ ๋ง๋๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ ๊ฒ !!
( IoC/DI ์ฌ์ฉ ์ด์ ์ ๊ฐ์ )
์คํ๋ง ์ปจํ ์ด๋์ ์ต์์ ์ธํฐํ์ด์ค
๋น์ ๊ด๋ฆฌํ๋ ์ญํ
Ex. ๋น ๋ฑ๋ก, ์์ฑ, ์กฐํ, ๋๋ ค์ฃผ๊ธฐ, ๊ฒ์ ๋ฑ
getBean()
๋ฉ์๋๋ฅผ ํตํด ๋น์ ์ธ์คํด์คํํ ์ ์์
( ์ฒ์ getBean()
๋ฉ์๋๊ฐ ํธ์ถ๋ ์์ ์์์ผ ํด๋น ๋น์ด ์์ฑ๋จ )
@Bean
์ด ๋ถ์ ๋ฉ์๋์ ์ด๋ฆ์ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ์ฌ ๋น์ ๋ฑ๋ก
BeanFactory
์ ๊ธฐ๋ฅ์ ์์๋ฐ์ ์ธํฐํ์ด์คโ But, ์คํ๋ง ์ปจํ
์ด๋ ํ๋ฉด ์ฃผ๋ก ์ด ApplicationContext
๋ฅผ ๋ปํจ
โ๏ธ ๋ถ๊ฐ๊ธฐ๋ฅ
- MessageSource
โ ๋ฉ์ธ์ง ๋ค๊ตญํ๋ฅผ ์ํ ์ธํฐํ์ด์ค- EnvironmentCapable
โ ๊ฐ๋ฐ, ์ด์ ๋ฑ ํ๊ฒฝ๋ณ์ ๋ฑ์ผ๋ก ๋๋ ์ฒ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์ ํ์ํ ์ ๋ณด๋ค์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ธํฐํ์ด์ค- ApplicationEventPublisher
โ ์ด๋ฒคํธ ๊ด๋ จ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค- ResourceLoader
โ ํ์ผ, ํด๋์ค ํจ์ค, ์ธ๋ถ ๋ฑ ๋ฆฌ์์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํ
1. ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
โ new AnnotationConfigApplicationContext(๊ตฌ์ฑ์ ๋ณด.class)
๋ก ์คํ๋ง์ ์๋ @Bean์ ๋ฉ์๋ ๋ฑ๋ก
(์ ๋ํ
์ด์
๊ธฐ๋ฐ์ Java ์ค์ ํด๋์ค๋ก Spring์ ๋ง๋๋ ๊ฒ )
โ ์์ฑํ ๋ ์ด๋ค ๊ตฌ์ฑ์ ๋ณด๋ฅผ ์ธ ๊ฒ์ธ์ง ์ง์ ํ๋๋ฐ, ์์ ์์์์๋ AppConfig.class
๋ฅผ ๊ตฌ์ฑ์ ๋ณด๋ก ์ง์ ํจ
( AppConfig.class์ ์๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ํตํด์ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ์ํ ๊ฐ์ฒด๋ค์ ์์ฑ )
โ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค๋ ๊ตฌ์ฑ ๋ฉํ๋ฐ์ดํฐ์ ๊ฒฐํฉ๋์ด ApplicationContext๊ฐ ์์ฑ/์ด๊ธฐํ๋ ํ, ์์ ํ ๊ตฌ์ฑ๋๊ณ ์คํ ๊ฐ๋ฅํ ์์คํ /์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๊ฒ ๋จ
XML ๊ธฐ๋ฐ์ผ๋ก ๋ง๋๋ ClassPathXmlApplicationContext๋ ์์
โ๏ธ
AnnotationConfigApplicationContext
โ ApplicatonContext ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด )
โ ์คํ๋ง ์ปจํ
์ด๋๊ฐ Configuration Metadata
์ฌ์ฉ
โ๏ธ Configuration Metadata
Spring ์ปจํ ์ด๋๊ฐ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ๊ฒ์ธ์ง ํํํ๊ธฐ ์ํ ๋ฉํ๋ฐ์ดํฐ
- XML-based metadata - ์ธ๋ถ XML ํ์ผ๋ก ํํ
โ ํด๋์ค์์ ํ๋ ์์ํฌ์ ๋ํ ์์กด์ฑ์ ์ค์ผ ์ ์์- Java-based metadata - ์ ๋ํ ์ด์ ๋ฑ์ ์๋ฐ ์ฝ๋๋ก ํํ
โ XML ๋ฐฉ์์ ๋นํด ๊ด๋ฆฌ๊ฐ ์ฌ์
2. ์คํ๋ง ๋น ๋ฑ๋ก
โ ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์ ํด๋์ค ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฑ๋ก
โ ๋น ์ด๋ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋ ์ด๋ฆ ์ฌ์ฉํ๊ณ ํญ์ ๋ค๋ฅด๊ฒ !
( @Bean(name="์ง์ ํ ์ด๋ฆ")
์ผ๋ก ์ง์ ๋ถ์ฌ๋ ๊ฐ๋ฅ )
( ๊ฐ์ ์ด๋ฆ ๋ถ์ฌํ ๊ฒฝ์ฐ ๊ธฐ์กด ๋น์ ๋ฎ์ด๋ฒ๋ฆด ์ ์๊ธฐ ๋๋ฌธ )
3. ์คํ๋ง ๋น ์์กด ๊ด๊ณ ์ค์ - ์ค๋น
โ ๋น ์์ฑ ํ, ์์กด ๊ด๊ณ ์ค์ ์ ์ํด ์ค๋น
4. ์คํ๋ง ๋น ์์กด ๊ด๊ณ ์ค์ - ์๋ฃ
โ ์์ฑ๋ ๋น๋ค๋ก ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ฐ ๊ฐ์ฒด๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
( ์ด๋ ๊ฒ Java ์ฝ๋๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ฉด ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด์ ์์กด๊ด๊ณ ์ฃผ์
๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋จ )
5. ์์ฑํ ๋น ์กฐํ
โ ๋ฑ๋ก๋ ๋น๋ค์ ๋ชจ๋ ์กฐํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, findAllBean()
๋ฉ์๋ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๊ฐ๋ฅ
findAllBean()
์ปจํ ์ด๋์์ ๋ชจ๋ ๋น์ ์ด๋ฆ์ ๊ฐ์ ธ์์ ์ถ๋ ฅํ๋ ๋ฉ์๋
( ์ด ๊ฒฝ์ฐ ์คํ๋ง์ด ์์ฒด์ ์ผ๋ก ๋ฑ๋กํ ๋น๋ ๋ชจ๋ ์ถ๋ ฅ๋จ )
โ ์ง์ ๋ฑ๋กํ ๋น๋ค๋ง ์กฐํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, findApplicationBean()
๋ฉ์๋ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๊ฐ๋ฅ
โ ์์๊ด๊ณ๊ฐ ์์ ์ ๋ถ๋ชจํ์
์ผ๋ก ์กฐํํ๋ฉด ์์ ํ์
๋ ํจ๊ป ์กฐํ๋จ
( object
ํ์
์ผ๋ก ์กฐํํ๋ฉด ๋ชจ๋ ์คํ๋ง ๋น ์กฐํ ๊ฐ๋ฅ )
โ๏ธ ApplicationContext ์ธํฐํ์ด์ค ๊ตฌํ์ฒด ํ์ธ๋ฒ
Windows์ ๊ฒฝ์ฐ
โ Ctrn + N โ ํด๋์ค์์ ApplicationContext๋ก ๊ฒ์
โ
โ ํ๋ฉด์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ํ์ผ์ธ ApplicationContext ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํ์ ํด๋์ค๋ค์ด ๋์ค๋ ๊ฑธ ํ์ธํ ์ ์์
โ ApplicationContext ์์ฑ์์ ์ ๊ณต๋ ์ธ๋ถ ๋ฆฌ์์ค๋ค๋ก๋ถํฐ ๊ตฌ์ฑ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ์ ์๋๋ก ํ๋ ๋ฆฌ์์ค ๋ฌธ์์ด
Ex. ์ฌ๊ธฐ์ ์ธ๋ถ ๋ฆฌ์์ค โ ์์น ๊ฒฝ๋ก, ๋ก์ปฌ ํ์ผ ์์คํ , Java CLASSPATH ๋ฑ
โ๏ธ Java Bean(Spring Bean)
โ ๋จ์ํ๊ฒ ํด๋์ค ๋ด์ Getter/Setter๋ง ๊ฐ์ง๊ณ ์๋ ํด๋์ค
( ์คํ๋ง ๋น์ ์๋ฐ ๋น๊ณผ ๋ค๋ฆ )
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์ ๋ฉํ๋ฐ์ดํฐ(BeanDefinition)๋ก ์์ฑ
@Bean์ด ์ ํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก
ApplicationContext
์ฌ์ฉ
โ bean ์ ์๋ฅผ ์ฝ๊ณ ์ก์ธ์คํ ์ ์์
getBean()
์ฌ์ฉ
โ bean์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
But, ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์๋
getBean()
๋ฉ์๋๋ก ํธ์ถํ์ฌ ์ฌ์ฉํ๋ฉด ์๋จ
โ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐgetBean(์ด๋ฆ, ํ์ )
์ผ๋ก ํธ์ถํด์ผํ๋๋ฐ ์ด๋ฆ๊ณผ ํ์ ์ ์์์ผ๋ง ํธ์ถ์ด ๊ฐ๋ฅ
But, ์์กด์ฑ์ ์ฃผ์ ํ์ด๋ ์ด๋ฆ๊ณผ ํ์ ์ ๋ชฐ๋ผ๋ ํธ์ถ์ด ๊ฐ๋ฅํด์ผํจ!
( ์์กด์ฑ ์ฃผ์ ์ด ์๋ฏธ๊ฐ ์๋ ๊ฒ )
( ์ถ์ํ๋์ด ์์ )
Configuration metadata๋ก ์ ์ํ ๋น ์ค์ ๋ฉํ๋ฐ์ดํฐ
( ๋น์ ์์ฑ ์ ๋ณด, ์ปจํ
์ด๋์ ๋ช
๋ น, ์ธ์คํด์คํ, ์ค์ , ์กฐ๋ฆฝํ ๊ฐ์ฒด ์ ์ )
์์ฑ์ ๋ฐ๋ผ ์ปจํ ์ด๋๊ฐ Bean์ ์ด๋ป๊ฒ ์์ฑ, ๊ด๋ฆฌํ ์ง ๊ฒฐ์
@Bean
or <bean>
๋น ๊ฐ 1๊ฐ์ฉ ๋ฉํ ์ ๋ณด๊ฐ ์์ฑ
์คํ๋ง์ด ์ค์ ๋ฉํ์ ๋ณด๋ฅผ BeanDefinition์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์คํ๋ง์ด XML, Java์ ๊ฐ์ ๋ค์ํ ์ค์ ํ์์ ์ง์ํ ์ ์๋ ๊ฒ
โ๏ธ BeanDefintion ๊ฐ์ฒด๊ฐ ํฌํจํ๊ณ ์๋ ๋ฉํ๋ฐ์ดํฐ
[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition
- BeanClassName
โ ์์ฑํ ๋น์ ํด๋์ค ๋ช (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ๋ฉด ์์)- factoryBeanName
โ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๋ฆ Ex. appConfig- factoryMethodName
โ ๋น์ ์์ฑํ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ง์ Ex. userService- Scope
โ ์ฑ๊ธํค (๊ธฐ๋ณธ๊ฐ)- lazyInit
โ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๋น์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ๋น์ ์ฌ์ฉํ ๋๊น์ง ์ต๋ํ ์์ฑ์ ์ง์ฐ์ฒ๋ฆฌ ํ๋์ง ์ฌ๋ถ- InitMethodName
โ ๋น์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ ์ฉํ ๋ค์ ํธ์ถ๋๋ ์ด๊ธฐํ ๋ฉ์๋ ๋ช- DestoryMethodName
โ ๋น์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋์ ์ ๊ฑฐํ๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋ ๋ช- Constructor arguments, Properties
โ ์์กด๊ด๊ณ ์ฃผ์ ์์ ์ฌ์ฉ (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํฐ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉํ๋ฉด ์์)
๋ง ๊ทธ๋๋ก ๋น(๊ฐ์ฒด)์ด ์ฌ์ฉ๋์ด์ง๋ ๋ฒ์
๋น ์ค์ ๋ฉํ์ ๋ณด(BeanDefinition
) ๋ง๋ค ๋, ๊ทธ๊ฑธ๋ก ๋ง๋ค ํด๋์ค์ ์ธ์คํด์ค ๋ง๋ค๊ธฐ ์ํด์, ๊ทธ ์ธ์คํด์ค(๋น)๊ฐ ์กด์ฌํ ์ ์๋ ๋ฒ์(๋ ์ํผ) ์ค์ ํ๋ ๊ฒ
Ex. ์ฑ ๊ตฌ๋๋๋ ๋์ ๋น(๊ฐ์ฒด)์ ๋ช๊ฐ ๋ง๋ค์ด์ ์ธ ๊ฑด์ง, HTTP ์์ฒญ๋ง๋ค ์์ฑํด์ ์ธ ๊ฑด์ง ๋ฑ ๊ฒฐ์
โ๏ธ ๋ ์ํผ
โ ๋น์ด ์กด์ฌํ ์ ์๋ ๋ฒ์
ํน์ Bean ์ ์์์ ์์ฑ๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ ๋ค์ํ ์์กด์ฑ, ๊ตฌ์ฑ ๊ฐ๋ฟ๋ง ์๋๋ผ, ํน์ Bean ์ ์์์ ์์ฑ๋ ๊ฐ์ฒด์ ๋ฒ์๋ ์ ์ด ๊ฐ๋ฅ
Spring Framework๋ 6๊ฐ์ Scope(๋ฒ์) ์ง์ํ๊ณ ์ด ์ค ํ๋์ ๋ฐฐ์น๋๋๋ก ์ ์ํ ์ ์์
( ์๋ <โ ๋น ์ค์ฝํ ์ข
๋ฅ>์์ ์ค๋ช
)
๊ตฌ์ฑ์ ํตํด ์์ฑํ๋ ๊ฐ์ฒด์ ๋ฒ์๋ฅผ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ฅํ๊ณ ์ ์ฐ
์ฌ์ฉ์๊ฐ ๋ฒ์๋ฅผ ์ ์ํ์ฌ ์์ฑํ ์๋ ์์
singleton (Default)
โ ์คํ๋ง ์ปจํ
์ด๋์ ๊ธฐ๋ณธ๊ฐ
โ ๊ฐ ์คํ๋ง ์ปจํ
์ด๋์ ๋จ์ผ ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ํ ๋จ์ผ BeanDefintion์ ๋ฒ์ ์ง์
( static ์ธ์คํด์ค ์ง์ ๋ง๋ค์ง ์์๋ ๋จ )
prototype
โ ์คํ๋ง ์ปจํ
์ด๋๋ ํ๋กํ ํ์
๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์
๊น์ง๋ง ๊ด์ฌํ๊ณ ๋๋ ๊ด๋ฆฌํ์ง ์๋ ๋งค์ฐ ์งง์ ๋ฒ์์ ์ค์ฝํ
request
โ ์น ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
session
โ ์น ์ธ์
์ด ์์ฑ๋๊ณ ์ข
๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
application
โ ์น์ ์๋ธ๋ฆฟ ์ปจํ
์ค์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ
websocket
โ ๋จ์ผ BeanDefintion ๋ฒ์๋ฅผ WebSocket์ ๋ผ์ดํ์ฌ์ดํด๊น์ง ํ์ฅ
โ Spring ApplicationContext์ ์ปจํ
์คํธ์์๋ง ์ ํจ
โ
( ์ด ์ค 4๊ฐ๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ )
[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes
ํด๋น ๋น์ ์ธ์คํด์ค๋ฅผ ๋ฑ 1๊ฐ๋ง ์์ฑํด์ ์ฌ์ฉํ๋ ๊ฒ
( โ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ 2๊ฐ ์ด์ ์์ฑํ์ง ๋ชปํ๋๋ก, ์ฝ๋์์ private ์์ฑ์ ์ฌ์ฉํ์ฌ ์ธ๋ถ์์ new ํค์๋ ์ฌ์ฉ ๋ชปํ๊ฒ ๋ง๊ธฐ )
์ด ๋จ์ผ ์ธ์คํด์ค๋ ์ฑ๊ธํค ๋น์ ์บ์์ ์ ์ฅ๋จ
์คํ๋ง ์ปจํ
์ด๋์ ์์๊ณผ ํจ๊ป ์์ฑ๋์ด์ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋ ๋ ๊น์ง ์ ์ง
( ์คํ๋ง ์ปจํ
์ด๋ ์ข
๋ฃ์ ์๋ฉธ ๋ฉ์๋๋ ์๋์ผ๋ก ์คํ )
ํด๋น BeanDefinition๊ณผ ์ผ์นํ๋ ID / ID๋ฅผ ๊ฐ์ง ๋น์ ๋ํ ๋ชจ๋ ์์ฒญ์ ์คํ๋ง ์ปจํ ์ด๋์์ ๊ทธ์ ํด๋นํ๋ ํน์ ๋น ์ธ์คํด์ค๋ฅผ ๋ฐํ
์ด๋ฆ์ด ์ ํด์ง ๋น์ ๋ํ ๋ชจ๋ ์์ฒญ๊ณผ ์ฐธ์กฐ๋ ์บ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ
( ์ฑ๊ธํค ์ค์ฝํ์ ์คํ๋ง ๋น์ ์ฌ๋ฌ๋ฒ ํธ์ถํด๋ ๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค ์ฐธ์กฐ ์ฃผ์๊ฐ์ ๊ฐ์ง )
โ ํด๋ผ์ด์ธํธ๋ค์ด ์คํ๋ง ๋น์ ์๊ตฌํ ๋, ๊ฐ์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง ๋น ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค
โ ๐ฌ ํต์ฌ
โ bean ํ๋์ ํ๋์ฉ ๋ฉํ ์ ๋ณด๊ฐ ์์ฑ๋๊ณ , ์คํ๋ง ์ปจํ ์ด๋๋ ์ด๋ฐ ๋ฉํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ๋น์ ์์ฑํ๋ค !!!!!
์ฑ๊ธํค ๋ฐฉ์์ ๊ตฌํํ๋ ์ฝ๋ ์์ฒด๊ฐ ๋ง์
์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กด
โ DIP ์๋ฐ ( OOP์ SOLID ์ค ํ๋ )
์ง์ ํด์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ์ด๋ ค์
์ ์ฐ์ฑ ๋จ์ด์ง
( private ์์ฑ์๋ฅผ ์ฌ์ฉํด ์์ ํด๋์ค ๋ง๋ค๊ธฐ๊ฐ ์ด๋ ค๊ธฐ ๋๋ฌธ )
์์ฑ ๊ณต์
โ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋์์ฑ ๋ฌธ์
( ์ฑ๊ธํค ๊ฐ์ฒด์ ์์ฑ์ด ์ฌ๋ฌ ์ฐ๋ ๋์ ์ํด ๋ฐ๋ ์ ์์ )
โ A ์ฐ๋ ๋์์ ์์ฑ ๊ฐ์ x๋ก ๋ฐ๊พธ๊ณ ์ถ๋ ฅํ๋ ๊ณผ์ ์์ B ์ฐ๋ ๋๊ฐ ์์ฑ ๊ฐ์ y๋ก ๋ฐ๊พธ๋ฉด ์ฐ๋ ๋ A์์ ์์ํ์ง ๋ชปํ ๊ฐ์ด ๋์ฌ ์ ์์
( 1๊ฐ์ ์ธ์คํด์ค์์ ์์ฑ๊ฐ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ )
์ฑ๊ธํค ๋น์ด ๋ง์ ์๋ก ๊ตฌ๋ ์๊ฐ์ด ์ฆ๊ฐ
( ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ๋ ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ )
โ๏ธ ์ด ๋ฌธ์ ์ ์ ์ฑ๊ธํค ์ปจํ ์ด๋๊ฐ ํด๊ฒฐํด์ค !
- ์ฑ๊ธํค ํจํด์ ์ ์ฉํ์ง ์์๋, ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ
- ์คํ๋ง ์ปจํ ์ด๋ โ ์ฑ๊ธํค ์ปจํ ์ด๋ ์ญํ
- ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ (Singleton Registry) ๊ธฐ๋ฅ ๊ฐ์ง
โ
โ ์ ๊ธฐ๋ฅ๋ค ๋๋ถ์, ์ฑ๊ธํค ๋ฐฉ์์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๋ฉด์, ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค(1๊ฐ๋ง ์์ฑ)์ผ๋ก ๊ด๋ฆฌํ ์ ์์
( ์คํ๋ง ๋น์ด ๋ฐ๋ก ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ธ ๊ฒ )
โ
( ์ฑ๊ธํค ํจํด์ ์ํ ์ง์ ๋ถํ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ง ์๊ณ , DIP, OCP ์๋ฐํ์ง ์์ผ๋ฉด์ ํ ์คํธ ์ฉ์ดํด์ง )
โ๏ธ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ (Singleton Registry)
์ฑ๊ธํค ๊ฐ์ฒด๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ
ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๊ณต์ ํ๋ ํ์์ด๋ฏ๋ก ๋ฌด์ํ(Stateless)๋ก ์ค๊ณํด์ผํจ
ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ด๊ฑฐ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋จ
๊ฐ๊ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผ ํจ
ํ๋ ๋์ , ๊ณต์ ๋์ง ์๋ ์ง์ญ๋ณ์,ํ๋ผ๋ฏธํฐ,ThreadLocal์ ์ฐ๊ธฐ
( ์คํ๋ง ๋น์ ๊ณต์ ๊ฐ์ ์ค์ ํ๋ฉด ์ฅ์ ๋ฐ์ )
Ex. ํ๋๊ฐ ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐํํ์
โ ์๋์ ์์ฑํด ๋์ ๊ฒ ์ฐธ๊ณ ํ๊ธฐ !!
์ค๋ ํ์ต ์ค๋ช
์ด ์ข ๊ผฌ์ด๊ณ ๊ผฌ์ธ ๋๋์ด์ด์ ์ดํดํ๊ธฐ ์ด๋ ค์ ๋คใ
๊ทธ๋์ ํ์ต ์๊ฐ์๋ ์ฝ์ผ๋ฉด์ ์ ๋ฆฌํ๊ณ ์์ง๋ง ๋์ ํ ์ดํด๊ฐ ์๊ฐ์๋๋ฐ ๊ทธ๋๋ ์ดํ ์ดํดํ๋ ค๊ณ ๋ง๋ก ์ค๋ช
ํด๋ณด๋ฉด์ ๋ธ๋ก๊ทธ ์์ฑํ๋๊น ๋ง์ด ์ดํด๊ฐ ๋๋ค !