๐น Bean Scope
์คํ๋ง์์ ๋น์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค ์ค์ฝํ๋ก ์์ฑ๋๋ค.
ํน์ ํ์ ์ ๋น์ ํ๋๋ง ๋ง๋ค์ด ๋๊ณ ๊ณต์ ํด์ ์ฌ์ฉํ๊ธฐ ์ํจ์ธ๋ฐ, ์ด๋ฌํ ์ด์ ๋ก ๋น์ ์ํ๋ฅผ ์ ์ฅํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ์ฌ ์ํํ ์ํฉ์ ์ด๋ํ ์ ์๋ค.
ํ์ง๋ง ์๊ตฌ์ฌํญ๊ณผ ๊ตฌํ ๊ธฐ๋ฅ ๋ฑ์ ํ์์ ๋ฐ๋ผ ๋น์ฑ๊ธํค์ด ํ์ํ ๊ฒฝ์ฐ๋ ๋ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด Scope๋ผ๋ ํค์๋๋ฅผ ์ ๊ณตํ๋ค.
๐น Scope ์ข ๋ฅ
1. ์ฑ๊ธํค
- ์คํ๋ง ํ๋ ์์ํฌ์์ ๊ธฐ๋ณธ์ด ๋๋ ์ค์ฝํ
- ์คํ๋ง ์ปจํ ์ด๋์ ์์๊ณผ ์ข ๋ฃ๊น์ง ํ ๊ฐ์ ๊ฐ์ฒด๋ก ์ ์ง๋๋ค.
- ๊ฐ์ฅ ๋์ ๋ฒ์์ ์ค์ฝํ์ด๋ค.
2. ํ๋กํ ํ์
- ํ๋กํ ํ์ ๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ ๊น์ง๋ง ๊ด์ฌํ๊ณ ๋๋ ๊ด๋ฆฌํ์ง ์๋ ๋งค์ฐ ์งง์ ๋ฒ์์ ์ค์ฝํ
- ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํญ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๊ณ ์ดํ์ ๊ด๋ฆฌํ์ง ์๋๋ค.
- ํ๋กํ ํ์ ์ ๋ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค.
3. ์น
- request : ๊ฐ๊ฐ์ ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ
- session : ์ธ์ ์ด ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ
- application : ์น์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ
๋น ์ค์ฝํ๋ ๋ค์๊ณผ ๊ฐ์ด @Scope ์ด๋ ธํ ์ด์ ์ ํตํด ์ง์ ํ ์ ์๋ค.
// ์๋ ๋น ๋ฑ๋ก
@Scope("prototype")
@Component
public class PrototypeBean {
public PrototypeBean() { }
}
// ์๋ ๋น ๋ฑ๋ก
@Configuration
class PrototypeBeanConfig {
@Scope("prototype")
@Bean
PrototypeBean prototypeBean() {
return new PrototypeBean();
}
}
[ ์ฑ๊ธํค ์ค์ฝํ(Singleton Scope) ]
์คํ๋ง ์ปจํ ์ด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค.
์คํ๋ง ์ค์ฝํ์ ๋น์ ์กฐํํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
์คํ๋ง ์ค์ฝํ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ Scope๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์ผ๋ฉด ๋๋ค.
// ๋ช
์์ ์ง์ , ๋๋ ์ง์ ํ์ง ์์ผ๋ฉด ์ฑ๊ธํค ์ค์ฝํ๋ก ๊ด๋ฆฌ
@Component
@Scope("singleton")
public class SingletonBean { }
@Component
public class SingletonBean { }
[ ํ๋กํ ํ์ ์ค์ฝํ(Prototype Scope) ]
ํ๋กํ ํ์ ์ค์ฝํ์ ๋น์ ์กฐํํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํญ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
ํ๋กํ ํ์ ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ์ ๋น์ ์์ฑํ๊ณ , ํ์ํ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ค.
์ฑ๊ธํค ๋น์ ์ปจํ ์ด๋ ์์ฑ ์์ ์ ๊ฐ์ด ์์ฑ๋๊ณ ์ด๊ธฐํ๋์ง๋ง,
ํ๋กํ ํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ ์กฐํํ ๋ ์์ฑ๋๊ณ ์ด๊ธฐํ ๋ฉ์๋๋ ์คํ๋๋ค.
์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑํ๊ณ , ์์กด ๊ด๊ณ ์ฃผ์ , ์ด๊ธฐํ๊น์ง๋ง ์ฒ๋ฆฌํ๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ๋น์ ๋ฐํํ ์ดํ์๋ ์์ฑ๋ ํ๋กํ ํ์ ๋น์ ๊ด๋ฆฌํ์ง ์๋๋ค.
ํ๋กํ ํ์ ๋น์ ๊ด๋ฆฌํ ์ฑ ์์ ์ปจํ ์ด๋๊ฐ ์๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ @PreDestory์ ๊ฐ์ ์ข ๋ฃ ์ฝ๋ฐฑ ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฉธ ๋ฉ์๋(@PreDestory) ๊ฐ์ ๊ฒ์ ์์ฒด์ ์ผ๋ก ๊ด๋ฆฌํด ์ฃผ์ด์ผ ํ๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด ํ๋กํ ํ์ ์ค์ฝํ๋ ์ธ์ ์ฌ์ฉ๋ ๊น?
1. ์ํ๋ฅผ ๊ฐ์ง(Statedul) ๋น ์ฌ์ฉ ์
์ดํดํ๊ธฐ ์ฝ๊ฒ ์จ๋ผ์ธ ์ผํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์.
๊ฐ ์ฌ์ฉ์์๊ฒ ์ฅ๋ฐ๊ตฌ๋ ์ญํ ์ ํ๋ ๋น์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ, ํด๋น ๋น์ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ ์ํ์ ๊ตฌ๋งค ํญ๋ชฉ ๋ชฉ๋ก์ ์ ์งํด์ผ ํ๋ค.
์ฌ๊ธฐ์์ ์ฑ๊ธํค ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ฅ๋ฐ๊ตฌ๋ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ด ๋ ํ๋กํ ํ์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
๊ฐ ์์ฒญ๋ง๋ค ์๋ก์ด ์ฅ๋ฐ๊ตฌ๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๊ฐ ์ฌ์ฉ์์ ์ํ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ ์ ์๋ค.
2. ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ค๋ ๋ ์์ ์ฑ(Thread Safety) ๋ณด์ฅ ํ์์
์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ธฐ์์ฌ์์ ์ฌ์ฉํ๋ ๊ณต์ฉ ์ฃผ๋ฐฉ์ ์๊ฐํด ๋ณด์.
๊ธฐ์์ฌ์๋ ์ฌ๋ฌ ์ฌ๋์ด ์ด๊ณ ์๊ณ , ๋ชจ๋ ํ๋์ ๊ณต์ฉ ์ฃผ๋ฐฉ์ ์ด์ฉํด์ผ ํ๋ค.
์ฃผ๋ฐฉ์๋ ํ๋์ ์กฐ๋ฆฌ ๋๊ตฌ ์ธํธ๋ง ์์ด, ์ฌ๋ฌ ์ฌ๋์ด ์๋ฆฌ๋ฅผ ํ๋ ค๋ฉด ์ ์ฌ๋์ ์๋ฆฌ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
์ด๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์์ ์๋ฆฌ ๋๊ตฌ ์ธํธ๋ฅผ ๋๋ ์ค๋ค๋ฉด ์ ์ฌ๋์ ์๋ฆฌ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์ ์์ด ๋ ํจ์จ์ ์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ ์ค๋ ๋(๊ธฐ์์ฌ ์ฌ์ฉ์)๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ์ ์ํํ๋ฉด์ ๋น์ ์ธ์คํด์ค(์๋ฆฌ ๋๊ตฌ ์ธํธ)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ฑ๊ธํค ๋น์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋์ด ์ค๋ ๋ ์์ ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ด ๋ ํ๋กํ ํ์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
๊ฐ ์ค๋ ๋๋ง๋ค ์๋ก์ด ๋น ์ธ์คํด์ค๊ฐ ํ ๋น๋์ด ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๋ฏ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
3. ๋ฆฌ์์ค ์ง์ฝ์ ์ธ์คํด์ค์ ์ฌ์ฉ ์ ์ด
์ดํดํ๊ธฐ ์ฝ๊ฒ ๋์๊ด์ ์ฐธ๊ณ ์์ ์ ์๊ฐํด ๋ณด์.
๋์๊ด์๋ ๋งค์ฐ ์ ์ฉํ์ง๋ง ์ ํ๋ ์๋๋ง ์๋ ์ฐธ๊ณ ์์ ์ด ์๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ด ์์ ์ ์ฌ์ฉํ๊ณ ์ถ์ด ํ์ง๋ง, ๋์์ ์ฌ๋ฌ ์ฌ๋์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ์์๋๊ฑฐ๋ ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ๋์๊ด์ ์ฐธ๊ณ ์์ ์ ํ์ํ ๋๋ง ๋์ฌํ๊ณ ์ฌ์ฉ ํ ๋ฐํ๋ฐ์ ๊ด๋ฆฌํ๋ค. ์ด๋ฅผ ํตํด ์์ ์ ์ํ๋ฅผ ์ ์งํ๊ณ , ๊ณต์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์คํ๋ง์์ ํ๋กํ ํ์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ฌํ ๋์๊ด ๋์ฌ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.
๋ฆฌ์์ค๊ฐ ๋ง์ด ์๋ชจ๋๋ ๋น(์ฐธ๊ณ ์์ )์ ํ์ํ ์์ ์๋ง ์๋ก ์์ฑํ์ฌ ์ ๊ณตํ๋ค. ์ฌ์ฉ์ด ๋๋ ๋น์ ๋ ์ด์ ์ ์ง๋์ง ์๋๋ค.
์ด๋ฅผ ํตํด ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ์ค์ด๊ณ ๋น์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
๐ธ ์ฑ๊ธํค ์ค์ฝํ์ ํ๋กํ ํ์ ์ค์ฝํ ํจ๊ป ์ฌ์ฉ ์ ๋ฌธ์ ์
์ฑ๊ธํค ์ค์ฝํ์ ํ๋กํ ํ์ ์ค์ฝํ๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ด ์๋ค.
์ฑ๊ธํค ์ค์ฝํ์ ๋น์ด ํ๋กํ ํ์ ์ ๋น์ ์ฃผ์ ๋ฐ์ผ๋ฉด ์ฑ๊ธํค์ ํ๋กํ ํ์ ๋น์ ๋งค๋ฒ ๋ฐ๋์ง ์๊ณ ๊ฐ์ ๋น์ด ์ฌ์ฉ๋๋ค.
์ฑ๊ธํค ๋น์ ApplicationContext(์คํ๋ง ์ปจํ ์ด๋)๊ฐ ์ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ ๋ ๋น์ ๋ง๋ค์ด์ฃผ๊ณ ,
๋น์ ์ฃผ์ ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ๊ณ์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ๋น ์์ ์๋ ํ๋กํ ํ์ ๋น๋ ์ฒ์ ๊ทธ๋๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฆฌํ์๋ฉด, ์ฑ๊ธํค ๋น ์์ ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ผ๋ฐ ๊ฐ์ฒด(๋น)์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ค๋ฅผ ๊ฒ ์๋ค.
์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
1. ํ๋ก์ ๋ชจ๋(Proxy Mode) ์ด์ฉ
// ํด๋์ค
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PrototypeBean { }
// ์ธํฐํ์ด์ค
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.INTERFACES)
public interface PrototypeInterface { }
ํ๋กํ ํ์ ์ผ๋ก ์ฌ์ฉํ ๋น์ @Scope ์ด๋ ธํ ์ด์ ์ proxy Mode ์์ฑ์ ScopedProxyMode.TARGET_CLASS๋ก ์ค์ ํ์ฌ ํ๋ค.
๋ง์ฝ ํด๋น ๋น์ด ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค๋ผ๋ฉด, ScopedProxyMode_INTERFACE๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์ง์ ์ฃผ์ ํ์ง ์๊ณ , ํ๋กํ ํ์ ํด๋์ค๋ฅผ ์์๋ฐ์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋์ ์ฃผ์ ํ๋ค. ์ด ํ๋ก์ ๊ฐ์ฒด๋ ํธ์ถ๋ ๋๋ง๋ค ํ๋กํ ํ์ ๋น์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ค.
2. ObjectFactory, ObjectProvider ์ฌ์ฉ
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก, ์ฑ๊ธํค ๋น์ด ํ๋กํ ํ์ ์ ๋น์ ์ฌ์ฉํ ๋๋ง๋ค ์คํ๋ง ์ปจํ ์ด๋์ ์๋ก ์์ฒญํ๋ ๋ฐฉ์์ด๋ค.
โฝ ObjectFactory
ObjectFactory๋ ์ง์ ๋ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์์ ์ฐพ์์ฃผ๋ ์์กด์ฑ ์กฐํ(Dependency Lookup, DI) ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.
getObject() ๋ฉ์๋๋ง์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋น์ ์์ฒญํ ์ ์๋ค. ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ ์ด ํ์ ์์ผ๋ฉฐ, ์คํ๋ง์ ์์กดํ๋ ๋ฐฉ์์ด๋ค.
โฝ ObjectProvider
ObjectProvider๋ ObjectFactory์ ๋ค์ํ ํธ์ ๊ธฐ๋ฅ(Optional, Stream ๋ฑ)์ ์ถ๊ฐํ ์ธํฐํ์ด์ค์ด๋ค.
ObjectFactory์ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ ์ข ๋ ์ ์ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ํ, ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ ์์ผ๋ฉฐ, ์คํ๋ง์ ์์กดํ๋ค
๋ค์ ์ฝ๋๋ ์ฑ๊ธํค ๋น์์ ํ๋กํ ํ์ ๋น์ ๋งค๋ฒ ์๋ก ์์ฒญํ๋ ๋ฐฉ์์ด๋ค.
getObect()๋ฅผ ํธ์ถํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋์์ ํด๋น ํ๋กํ ํ์ ๋น์ ์ฐพ์ ๋ฐํํ๋ค.
@Component
public class Singleton {
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public PrototypeBean getPrototypeBean() {
// ๋งค๋ฒ ์๋ก์ด PrototypeBean ์ธ์คํด์ค๋ฅผ ๋ฐํ๋ฐ์
return prototypeBeanProvider.getObject();
}
}
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋จ์ ํ ์คํธ๋ Mock ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค. ์ค์ ๊ฐ์ฒด์ mock ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌํ ์ ์์ด ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฉ์ดํ๋ค.
3. JSR-330 Provider
์ด ๋ฐฉ๋ฒ์ jakarta.injection.Provider๋ผ๋ JSR-330 ์๋ฐ ํ์ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Provider๋ ๋น์ ์ง์ฐ ๋ก๋ฉ(lazy loading) ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๋ฐ ํ์ค ์ธํฐํ์ด์ค๋ก, ์คํ๋ง๊ณผ ๊ฐ์ DI ์ปจํ ์ด๋์ ์์กดํ์ง ์๊ณ ๋ ๋ค์ํ DI ์ปจํ ์ด๋์์ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ jakarta.inject ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ํ, ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
@Component
public class Singleton {
@Autowired
private Provider<PrototypeBean> prototypeProvider;
public PrototypeBean getPrototype() {
// ๋งค๋ฒ ์๋ก์ด PrototypeBean ์ธ์คํด์ค๋ฅผ ๋ฐํ
return prototypeProvider.get();
}
}
Provider.get() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์คํ๋ง ์ปจํ ์ด๋์์ ํด๋น ํ๋กํ ํ์ ๋น์ ์ง์ฐ ๋ก๋ฉ ๋ฐฉ์์ผ๋ก ์ฐพ์ ๋ฐํํ๋ค. ์ด๋ฅผ ํตํด ํ์ํ ๋๋ง๋ค ์๋ก์ด ๋น์ ์์ฒญํ ์ ์๋ค.
Provider๋ ์ง์ฐ ๋ก๋ฉ์ ํตํด ํ๋กํ ํ์ ๋น์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์คํ๋ง ์ธ ๋ค์ํ DI ์ปจํ ์ด๋์์๋ ์ฌ์ฉํ ์ ์๋ค. ๋ํ, ๊ธฐ๋ฅ์ด ๋จ์ํ๊ณ ์์กด์ฑ์ด ์ ๊ธฐ ๋๋ฌธ์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ฑฐ๋ Mock ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ด ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฉ์ดํ๋ค.
[ ์น ์ค์ฝํ(Web Scope) ]
์น ์ค์ฝํ๋ ์น ํ๊ฒฝ์์๋ง ์๋ํ๋ค. ์น ์ค์ฝํ๋ ํ๋กํ ํ์ ์ค์ฝํ์ ๋ค๋ฅด๊ฒ ์คํ๋ง์ด ํด๋น ์ค์ฝํ ์ข ๋ฃ ์์ ๊น์ง ๊ด๋ฆฌํ๋ฏ๋ก, ์ข ๋ฃ ์์ ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
์น ์ค์ฝํ ๋น์ ์ฑ๊ธํค ๋น์ ์ฃผ์ ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ ์ด์ ๋ ์ฑ๊ธํค ๋น์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์์ฑ๋๋ฉฐ, ์น ์ค์ฝํ ๋น์ HTTP ์์ฒญ ์์ ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ฑ๊ธํค ๋น์ด ์์ฑ๋ ๋๋ ์น ์ค์ฝํ ๋น์ด ์์ง ์์ฑ๋์ง ์์ ์ํ์ฌ์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋์๋ง์ ์ฑ๊ธํค ๋น์ ์์ฑ๋์ง๋ง, ์น ์ค์ฝํ ๋น์ HTTP ์์ฒญ์ด ์ฌ ๋ ์์ฑ๋๋ฏ๋ก ์น ์ค์ฝํ ๋น์ ์ฃผ์ ๋ฐ์ผ๋ ค๋ ์์ ์์ ์คํ๋ง์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1. Provider ์ฌ์ฉ
Provider๋ฅผ ์ฌ์ฉํ๋ฉด getObject() ๋๋ get() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์์ ๊น์ง ์น ์ค์ฝํ ๋น์ ์์ฑ์ ์ง์ฐ์ํฌ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฑ๊ธํค ๋น์ด ์์ฑ๋ ๋ ์น ์ค์ฝํ ๋น์ด ์์ง ์์ฑ๋์ง ์๋๋ผ๋ ํ์ํ ์์ ์๋ง ์น ์ค์ฝํ ๋น์ ์์ฒญํ ์ ์๋ค.
2. Proxy ์ฌ์ฉ
Proxy๋ฅผ ์ฌ์ฉํ์ฌ @Scope ์ด๋ ธํ ์ด์ ์ proxyMode๋ฅผ ์ค์ ํ๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๋ CGLIB๋ผ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ค์ฝํ ๋น์ ์์๋ฐ์ ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ์น ์ค์ฝํ ๋น์ ์ญํ ์ ๋์ ํ๋ค.
์คํ๋ง ์ปจํ ์ด๋์๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋ฑ๋ก๋๊ณ , ์์กด๊ด๊ณ์์๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋๋ค. ์์ฒญ ์์ ์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ค์ ์น ์ค์ฝํ ๋น์ ํธ์ถํ์ฌ ํ์ํ ์์ ์๋ง ๋น์ ์์ฑํ๊ฒ ๋๋ค.
์ด์ ๊ฐ์ด, Provider์ Proxy๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ค์ฝํ ๋น์ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋ค. Provider๋ ๋น์ ์ง์ฐ ๋ก๋ฉํ๋ฉฐ, Proxy๋ CGLIB ํ๋ก์๋ฅผ ํตํด ์น ์ค์ฝํ ๋น์ ๋์ ํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ๋ฒ๋ค์ ํ๋กํ ํ์ ๋น์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.
๐ reference
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ๋กฌ๋ณต(Lombok), @RequiredArgsConstructor๋ฅผ ์ฌ์ฉํ ์์ฑ์ ์ฃผ์ (0) | 2025.02.04 |
---|---|
[Spring] @Autowired ๋น ํ์ ์ ๋ต, @Qualifier, @Primary (0) | 2025.01.23 |
[Spring] Spring @Transactional ์ธ๋ถ ์ค์ (0) | 2025.01.14 |
[Spring] Transaction, Spring์์ ์ ๊ณตํ๋ Transaction ํต์ฌ ๊ธฐ์ (0) | 2025.01.10 |
[Spring] Transaction(ํธ๋์ญ์ ) (0) | 2025.01.09 |