Spring Bean
Spring Bean์ด๋?
Spring IoC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋น(Bean)์ด๋ผ๊ณ ํ๋ค
โ Spring DI Container์ ์ํด ๊ด๋ฆฌ๋๋ POJO (Plain Old Java Object)
Java ํ๋ก๊ทธ๋๋ฐ์์๋ Class๋ฅผ ์์ฑํ๊ณ new keyword๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ํ์ ์ฌ์ฉํ๋ ๊ฒ์,
Spring์์๋ ์ง์ new๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ ๊ฐ์ฒด๊ฐ ์๋๋ผ,
Spring์์ ๊ด๋ฆฌ๋๋ ์๋ฐ ๊ฐ์ฒด
๋ฅผ ์ฌ์ฉํ๋ค์ด๋ ๊ฒ
Spring์ ์ํ์ฌ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ์๋ฐ ๊ฐ์ฒด
๋ฅผBean
์ด๋ผ๊ณ ํ๋ค
Spring Framework์์๋
Spring Bean
์ ์ป๊ธฐ ์ํ์ฌApplicationContext.getBean()
์ ๊ฐ์ method๋ฅผ ์ฌ์ฉํ์ฌ Spring์์ ์ง์ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ป์ด์ ์ฌ์ฉํ๋ค
Spring Bean์ ํน์ง
POJO (Plain Old Java Object) ๋ก์จ, Spring application์ ๊ตฌ์ฑํ๋ ํต์ฌ ๊ฐ์ฒด์ด๋ค
Spring IoC ์ปจํ ์ด๋ (or DI ์ปจํ ์ด๋)์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ค
Spring์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก
Singleton
๋ฐฉ์์ผ๋ก Bean์ด ์์ฑ๋๋ค
Spring Bean์ ๊ตฌ์ฑ ์์
class
Bean์ผ๋ก ๋ฑ๋กํ Java class
id
Bean์ ๊ณ ์ ์๋ณ์
scope
Bean์ ์์ฑํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
singleton, prototype ๋ฑ
constructor-arg
Bean ์์ฑ ์ ์์ฑ์์ ์ ๋ฌํ ํ๋ผ๋ฏธํฐ
property
Bean ์์ฑ ์ setter์ ์ ๋ฌํ ์ธ์
Spring Bean Scope
Spring Bean Scope๋?
Bean์ด ๊ด๋ฆฌํ๋ ๋ฒ์๋ฅผ Bean Scope๋ผ๊ณ ํ๋ค
Bean์ default๋ก๋
Singleton scope
๋ก ์์ฑ๋๋คํน์ ํ์ ์ Bean์
ํ๋๋ง
๋ง๋ค์ด๋๊ณ๊ณต์
ํด์ ์ฌ์ฉํ๊ธฐ ์ํด์์ธ๋ฐ,์ด๋ก ์ธํด Bean์ ์ํ๋ฅผ ์ ์ฅํ๋ ์ฝ๋ (
Stateful
ํ ์ฝ๋)๋ฅผ ์์ฑํ๋ ๊ฒ์๋์์ฑ ๋ฌธ์
๋ฅผ ์ ๋ฐํ ์ ์๋ค
์๊ตฌ ์ฌํญ๊ณผ ๊ตฌํํ๋ ค๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋น ์ฑ๊ธํค์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ณ , ์ด๊ฒ์ ๋ช ์์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด์
scope
๋ผ๋ ํค์๋๋ฅผ ์ ๊ณตํ๋ค
Scope์ ์ข
๋ฅ
singleton
scopeSpring framework์์ ๊ธฐ๋ณธ์ด ๋๋ scope
Spring container์ ์์๋ถํฐ ์ข ๋ฃ๊น์ง
1๊ฐ์ ๊ฐ์ฒด
๋ก ์ ์ง๋๋ค
prototype
scope@Scope("prototype")
์ผ๋ก ์ ์ธํ๋ค์คํ๋ง ์ปจํ ์ด๋๋ Prototype Bean์
์์ฑ๊ณผ ์์กด ๊ด๊ณ ์ฃผ์ ๊น์ง๋ง ๊ด์ฌ
ํ๊ณ , ๋์ด์ ๊ด๋ฆฌํ์ง ์๋ scopePrototype scope๋ singleton๊ณผ ๋ฌ๋ฆฌ,
์์กด ๊ด๊ณ ์ฃผ์ ๊น์ง๋ง
ํด์ฃผ๊ธฐ ๋๋ฌธ์ Bean์ ๋ฐํํด ์ฃผ๋๊ฑด client๊ฐ ์ง์ ํด์ผํ๋ค์์ฒญ์ด ์ค๋ฉด
ํญ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํ
ํ๊ณ , ์ดํ์ ๊ด๋ฆฌํ์ง ์๋๋คPrototype์ผ๋ก Bean์ ๋ฑ๋กํ๋ฉด,
.getBean()
์ ํ ๋๋ง๋ค ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค์์กด ๊ด๊ณ๊น์ง๋ง ์ฃผ์ ํ๊ณ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์
@preDestroy
๋ฅผ ๋ณผ ์ ์๋คclose()
method๋ก ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ์ ๋@preDestroy
method๊ฐ ํธ์ถ๋์ง ์๋๋ค
์์
ํด๋ผ์ด์ธํธ๊ฐ Bean ์ ์์ฒญํ๋ค.
์คํ๋ง DI ์ปจํ ์ด๋๋ ์์ฒญ์ ๋ํด ์๋ก์ด Bean์ ์์ฑํ๋ค.
์๋ก ๋ง๋ Bean์ ์์กด ๊ด๊ณ ์ฃผ์ (DI) ์ ํ๋ค.
@PostConstruct ์ ๊ฐ์ ์ด๊ธฐํ์์ ์ ์งํํ๋ค.
์ด ์์ฑ๋ Bean์ ์คํ๋ง ์ปจํ ์ด๋์์ ๊ด๋ฆฌํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ค.
โ ์ฌ๊ธฐ์ ์ ์ ์๋ ์ ์, ๊ฐ์ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ๊ฐ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ๋น์ ๊ฐ์ง๊ฒ ๋๋ค๋ ๊ฒ๊ณผ @PostConstruct ๋ ํธ์ถ ๋๊ฒ ์ง๋ง @PreDestroy ๋ ํธ์ถ๋์ง ์์๊ฒ์ด๋ ์ฌ์ค์ด๋ค.
singleton scope์ prototype scope๊ฐ ์์์ ๋์ ๋ฌธ์ ์
์ฑ๊ธํค ๋น ์์ ์๋ ํ๋กํ ํ์ ๋น์ ์ฑ๊ธํค ๋น ์์กด ๊ด๊ณ ์ฃผ์ ์์ ์ ์๋ก ์๊ธฐ์ง๋ง, ๊ทธ ์ฐธ์กฐ๊ฐ ๊ณ์ ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ก ์์ฑ๋ง ๋๊ณ ์ฑ๊ธํค ๊ฐ์ฒด์ ํจ๊ป ์ ์ง๋๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค
์ฑ๊ธํค ๋น์ ์์ฒญํ ๋๋ง๋ค ๋ด๋ถ์ ํ๋กํ ํ์ ๋น์ ์๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ
Dependency Lockup
โ ์์กด ๊ด๊ณ๋ฅผ ์ง์ ์ฐพ์์ ์ฐ๊ธฐ์คํ๋ง ๋น ์ปจํ ์ด๋ ์์ฒด๋ฅผ ์์กด ๊ด๊ณ๋ก ์ฃผ์ ๋ฐ๊ณ , ํ๋กํ ํ์ ์ค์ฝํ ๋น์ด ํ์ํ ๋ ์ปจํ ์ด๋์์
์ง์ ์์กด ๊ด๊ณ ๋น์ ์ฐพ์ ์ด๋ค
์ด๋ ๊ฒ ํ์ํ ์์กด ๊ด๊ณ๋ฅผ ์ง์ ์ฐพ์ ์ฐ๋ ๋ฐฉ๋ฒ์
Dependency Lockup
์ด๋ผ๊ณ ํ๋ค๋ฌธ์ ์
์ฝ๋ ์์ฒด๊ฐ Spring Context ์ ์ฒด์ ์ข ์์ ์ด๊ฒ ๋๋ค
๋จ์ ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋ค
ObjectProvider
ํ๋กํ ํ์ ์ค์ฝํ ๋น์ ์์กด์ ์์กด๊ด๊ณ์ ์ฃผ์ ํ์ง ์๊ณ , ์๋์ ๊ฐ์ด ํ๋กํ ํ์ ์ค์ฝํ ๋น์ ํ์ ์ผ๋ก ๊ฐ์ง๋ ObjectProvider๋ฅผ ์์กด ๊ด๊ณ ๋น์ผ๋ก ์ฃผ์ ํ๋ค
ํ๋กํ ํ์ ์ค์ฝํ ๋น์ด ํ์ํ ๋
getObject()
method๋ฅผ ํตํด ํ๋กํ ํ์ ์ค์ฝํ ๋น์ ์๋ก ์์ฑํด ๊ฐ์ ธ์ฌ ์ ์๋ค
web scope
web ํ๊ฒฝ์์๋ง ๋์ํ๋ scope
์คํ๋ง์์๋ web scope๋ก ์ค์ ๋ Bean๋ค์ ํด๋น scope์ ์ข ๋ฃ ์์ ๊น์ง ๊ด๋ฆฌํ๋ค
์ข ๋ฃ method๊ฐ ํธ์ถ๋๋ค (@PreDestroy, @PostConstruct ๋ ๋ค ๊ฐ๋ฅ)
request
โ @Scope(value = "request")HTTP ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ ๋๊น์ง ์ ์ง๋๋ scope
๊ฐ๊ฐ์ HTTP ์์ฒญ๋ง๋ค ๋ณ๋์ ๋น ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ๊ด๋ฆฌ๋๋ค
web scope request๋ ๋ง์ ์ฌ์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ๊ฐ๊ฐ์ Bean์ ์์ฑํ๋๋ก ํ๋ ๊ฒ์ด๋ค
session
HTTP Session์ด ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ scope
application
ServletContext
์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ scope
websocket
Websocket
๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ scope
Spring Bean Lifecycle
Bean Lifecycle
์คํ๋ง ์ปจํ ์ด๋๋ Bean ๊ฐ์ฒด์ lifecycle์ ๊ด๋ฆฌํด ์ฃผ๋ฉฐ, ์๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
Bean ๊ฐ์ฒด ์์ฑ
์์กด ์ค์
์ด๊ธฐํ (์ฝ๋ฐฑ)
๋น ์ฌ์ฉ
๋น ์๋ฉธ (์๋ฉธ ์ ์ฝ๋ฐฑ)
์คํ๋ง ์ปจํ ์ด๋ ์ข ๋ฃ
Spring container๊ฐ ๊ด๋ฆฌํ๋ Bean์ ๋ผ์ดํ์ฌ์ดํด ์์
โ
๊ฐ์ฒด ์์ฑ - ์์กด ์ค์ - ์ด๊ธฐํ - ์๋ฉธ
์คํ๋ง ์ปจํ ์ด๋๊ฐ
์ด๊ธฐํ
๋ ๋, Bean ๊ฐ์ฒด๋ฅผ ์ค์ ์ ๋ณด์ ๋ฐ๋ผ ์์ฑํ๊ณ ,์์กด ๊ด๊ณ
๋ฅผ ์ค์ ํ๋ค์์กด ์ค์ ์ด ์๋ฃ๋๋ฉด, Bean ๊ฐ์ฒด๊ฐ ์ง์ ํ method๋ฅผ ํธ์ถํด
์ด๊ธฐํ
ํ๋ค์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ์ Bean ๊ฐ์ฒด๊ฐ ์ง์ ํ method๋ฅผ ํธ์ถํด Bean ๊ฐ์ฒด์
์๋ฉธ
์ ์ฒ๋ฆฌํ๋ค
Bean Lifecycle callback
Bean Lifecycle callback์ด๋?
์คํ๋ง์
์์กด๊ด๊ณ ์ฃผ์
์ด ์๋ฃ๋๋ฉด, Bean์๊ฒcallback
method๋ฅผ ํตํด์ด๊ธฐํ ์์
์ ์๋ ค์ฃผ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.๋ํ ์คํ๋ง ์ปจํ ์ด๋๊ฐ
์ข ๋ฃ
๋๊ธฐ์ง์
์์๋ฉธ callback
์ ์ค๋ค์ด๊ธฐํ ์ฝ๋ฐฑ
Bean์ด ์์ฑ๋๊ณ , Bean์ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ๋ ํ ํธ์ถ๋๋ค
์๋ฉธ ์ ์ฝ๋ฐฑ
Bean์ด ์๋ฉธ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค
singleton
bean์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋, singleton bean๋ ๊ฐ์ด ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์์๋ฉธ ์ ์ฝ๋ฐฑ
์ด ์ผ์ด๋๋ค
์ฝ๋ฐฑ ์ข ๋ฅ
์ธํฐํ์ด์ค(InitializingBean, DisposableBean)
โ ์ ์์ด๋ค
์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋, ์ข ๋ฃ ๋ฉ์๋ ์ง์
๋น ๋ฑ๋ก ์ค์ ์ ๋ณด์ ์๋์ ๊ฐ์ด ์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ฅ์
method
์ด๋ฆ
์ ์์ ๋กญ๊ฒ ์ค์ ๊ฐ๋ฅBean์ด ์คํ๋ง ์ฝ๋์ ์์กดํ์ง ์๋๋ค
์ฝ๋๊ฐ ์๋๋ผ
์ค์ ์ ๋ณด
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์๋ ์ด๊ธฐํ, ์ข ๋ฃ method๋ฅผ ์ ์ฉํ ์ ์๋ค
@PostConstruct, @PreDestroy ์ ๋ ธํ ์ด์ ์ง์
โ ์ ์ผ ๋ง์ด ์ฌ์ฉ์ฅ์
๊ฐ์ฅ ํธ๋ฆฌํ๊ฒ ์ด๊ธฐํ์ ์ข ๋ฃ๋ฅผ ์คํํ ์ ์๋ค.
์ต์ ์คํ๋ง์์ ๊ฐ์ฅ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ๋ ธํ ์ด์ ํ๋๋ง ๋ถ์ด๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ํธ๋ฆฌํ๋ค. (์ธํฐํ์ด์ค ๊ตฌํํ๊ณ ์ค๋ฒ๋ผ์ด๋ฉ ํ ํ์์๋ค.)
์คํ๋ง์ ์ข ์์ ์ธ ๊ธฐ์ ์ด ์๋
์๋ฐ ํ์ค
์ด๋ค.javax.annotation.PostConstruct
๋ฐ๋ผ์ ์คํ๋ง์ด ์๋ ๋ค๋ฅธ ์ปจํ ์ด๋์์๋ ๋์ํ๋ค.
์ปดํฌ๋ํธ ์ค์บ
๊ณผ ์ ์ด์ธ๋ฆฐ๋ค. (@Bean ์ค์ ์ด ์๋๋๊น!)
๋จ์
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉํ์ง ๋ชปํ๋ค
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐํ, ์ข ๋ฃํด์ผํ๋ค๋ฉด @Bean์ ๊ธฐ๋ฅ์ ์ด์ฉํ์!
Last updated