ํ๋กํ ํ์
์ค์ฝํ - ์ฑ๊ธํค ๋น๊ณผ ํจ๊ป ์ฌ์ฉ์ ๋ฌธ์ ์
์คํ๋ง ์ปจํ ์ด๋์ ํ๋กํ ํ์ ์ค์ฝํ์ ๋น์ ์์ฒญํ๋ฉด ํญ์ ์๋ก์ด ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
ํ์ง๋ง ์ฑ๊ธํค ๋น๊ณผ ํจ๊ป ์ฌ์ฉํ ๋๋ ์๋ํ ๋๋ก ์ ๋์ํ์ง ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
์์
clientBean ์ด๋ผ๋ ์ฑ๊ธํค ๋น์ด ์์กด๊ด๊ณ ์ฃผ์ ์ ํตํด์ ํ๋กํ ํ์ ๋น์ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ๋ ์๋ฅผ ๋ณด์.
void prototypeFind() {
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(PrototypeBean.class, ClientBean.class);
clientBean ์ ์ฑ๊ธํค์ด๋ฏ๋ก, ๋ณดํต ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ์์ ์ ํจ๊ป ์์ฑ๋๊ณ , ์์กด๊ด๊ณ ์ฃผ์ ๋ ๋ฐ์ํ๋ค.
static class ClientBean {
private final PrototypeBean prototypeBean;
@Autowired
public ClientBean(PrototypeBean prototypeBean) {
this.prototypeBean = prototypeBean;
}
clientBean ์ ์์กด๊ด๊ณ ์๋ ์ฃผ์ ์ ์ฌ์ฉํ๋ค. ์ฃผ์ ์์ ์ ์คํ๋ง ์ปจํ ์ด๋์ ํ๋กํ ํ์ ๋น์ ์์ฒญํ๋ค.
์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑํด์ clientBean ์ ๋ฐํํ๋ค. ํ๋กํ ํ์ ๋น์ count ํ๋ ๊ฐ์ 0์ด๋ค.
์ด์ clientBean ์ ํ๋กํ ํ์
๋น์ ๋ด๋ถ ํ๋์ ๋ณด๊ดํ๋ค. (์ ํํ๋ ์ฐธ์กฐ๊ฐ์ ๋ณด๊ดํ๋ค.)
ClientBean clientBean1 = ac.getBean(ClientBean.class);
ํด๋ผ์ด์ธํธ A๋ clientBean ์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํด์ ๋ฐ๋๋ค.์ฑ๊ธํค์ด๋ฏ๋ก ํญ์ ๊ฐ์ clientBean ์ด ๋ฐํ๋๋ค.
public int logic() {
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
int count1 = clientBean1.logic();
ํด๋ผ์ด์ธํธ A๋ clientBean.logic() ์ ํธ์ถํ๋ค.
clientBean ์ prototypeBean์ addCount() ๋ฅผ ํธ์ถํด์ ํ๋กํ ํ์ ๋น์ count๋ฅผ ์ฆ๊ฐํ๋ค. count๊ฐ์ด 1์ด ๋๋ค.
ClientBean clientBean2 = ac.getBean(ClientBean.class);
ํด๋ผ์ด์ธํธ B๋ clientBean ์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํด์ ๋ฐ๋๋ค.์ฑ๊ธํค์ด๋ฏ๋ก ํญ์ ๊ฐ์ clientBean ์ด ๋ฐํ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ด ์๋๋ฐ, clientBean์ด ๋ด๋ถ์ ๊ฐ์ง๊ณ ์๋ ํ๋กํ ํ์
๋น์ ์ด๋ฏธ ๊ณผ๊ฑฐ์ ์ฃผ์
์ด ๋๋ ๋น์ด๋ค.
์ฃผ์ ์์ ์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํด์ ํ๋กํ ํ์ ๋น์ด ์๋ก ์์ฑ์ด ๋ ๊ฒ์ด์ง, ์ฌ์ฉ ํ ๋๋ง๋ค ์๋ก ์์ฑ๋๋ ๊ฒ์ด ์๋๋ค!
int count2 = clientBean2.logic();
ํด๋ผ์ด์ธํธ B๋ clientBean.logic() ์ ํธ์ถํ๋ค.
clientBean ์ prototypeBean์ addCount() ๋ฅผ ํธ์ถํด์ ํ๋กํ ํ์
๋น์ count๋ฅผ ์ฆ๊ฐํ๋ค.
์๋ count ๊ฐ์ด 1์ด์์ผ๋ฏ๋ก 2๊ฐ ๋๋ค.
์ ๋ฆฌ
์คํ๋ง์ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๊ธํค ๋น์ ์ฌ์ฉํ๋ฏ๋ก, ์ฑ๊ธํค ๋น์ด ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฑ๊ธํค ๋น์ ์์ฑ ์์ ์๋ง ์์กด๊ด๊ณ ์ฃผ์ ์ ๋ฐ๊ธฐ ๋๋ฌธ์,
ํ๋กํ ํ์ ๋น์ด ์๋ก ์์ฑ๋๊ธฐ๋ ํ์ง๋ง, ์ฑ๊ธํค ๋น๊ณผ ํจ๊ป ๊ณ์ ์ ์ง๋๋ ๊ฒ์ด ๋ฌธ์ ๋ค.
์๋ง ์ํ๋ ๊ฒ์ด ์ด๋ฐ ๊ฒ์ ์๋ ๊ฒ์ด๋ค.
ํ๋กํ ํ์ ๋น์ ์ฃผ์ ์์ ์๋ง ์๋ก ์์ฑํ๋๊ฒ ์๋๋ผ, ์ฌ์ฉํ ๋ ๋ง๋ค ์๋ก ์์ฑํด์ ์ฌ์ฉํ๋ ๊ฒ์ ์ํ ๊ฒ์ด๋ค.
ํ๋กํ ํ์
์ค์ฝํ - ์ฑ๊ธํค ๋น๊ณผ ํจ๊ป ์ฌ์ฉ์ Provider๋ก ๋ฌธ์ ํด๊ฒฐ
์ฑ๊ธํค ๋น๊ณผ ํ๋กํ ํ์ ๋น์ ํจ๊ป ์ฌ์ฉํ ๋,
์ด๋ป๊ฒ ํ๋ฉด ์ฌ์ฉํ ๋ ๋ง๋ค ํญ์ ์๋ก์ด ํ๋กํ ํ์
๋น์ ์์ฑํ ์ ์์๊น?
ObjectFactory, ObjectProvider
์ง์ ํ ๋น์ ์ปจํ ์ด๋์์ ๋์ ์ฐพ์์ฃผ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ฐ๋ก ObjectProvider ์ด๋ค.
์ฐธ๊ณ ๋ก ๊ณผ๊ฑฐ์๋ ObjectFactory ๊ฐ ์์๋๋ฐ, ์ฌ๊ธฐ์ ํธ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ ObjectProvider ๊ฐ ๋ง๋ค์ด์ก๋ค.
- ObjectFactory: ๊ธฐ๋ฅ์ด ๋จ์, ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์์, ์คํ๋ง์ ์์กด
- ObjectProvider: ObjectFactory ์์, ์ต์
, ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฑ ํธ์ ๊ธฐ๋ฅ์ด ๋ง๊ณ , ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์์, ์คํ๋ง์ ์์กด
@Scope("singleton")
static class ClientBean {
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
์คํํด๋ณด๋ฉด prototypeBeanProvider.getObject() ์ ํตํด์ ํญ์ ์๋ก์ด ํ๋กํ ํ์ ๋น์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ObjectProvider ์ getObject() ๋ฅผ ํธ์ถํ๋ฉด ๋ด๋ถ์์๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํด๋น ๋น์ ์ฐพ์์ ๋ฐํํ๋ค.
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
@Autowired ์ ๋์์ด getBean ๊ณผ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๊ณ , ์ด ๋ ProtoTypeBean ์ ์์ฒญํ๋ค
ํ๋กํ ํ์ ์ธ bean๋ค์ getbean์ ํ๋ฉด ์๋ก ๋ง๋ค์ด ์ง๋ ๊ฒ์ธ๊ฐ์?? -> ๋ค ๋ง์ต๋๋ค.
JSR-330 Provider
๋ง์ง๋ง ๋ฐฉ๋ฒ์ javax.inject.Provider ๋ผ๋ JSR-330 ์๋ฐ ํ์ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
javax.inject:javax.inject:1 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ gradle์ ์ถ๊ฐํด์ผ ํ๋ค.
@Autowired
private Provider<PrototypeBean> provider;
public int logic() {
PrototypeBean prototypeBean = provider.get();
์คํํด๋ณด๋ฉด provider.get() ์ ํตํด์ ํญ์ ์๋ก์ด ํ๋กํ ํ์ ๋น์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
provider ์ get() ์ ํธ์ถํ๋ฉด ๋ด๋ถ์์๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํด๋น ๋น์ ์ฐพ์์ ๋ฐํํ๋ค. (DL)
์๋ฐ ํ์ค์ด๊ณ , ๊ธฐ๋ฅ์ด ๋จ์ํ๋ฏ๋ก ๋จ์ํ ์คํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ mock ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ๋ ํจ์ฌ ์ฌ์์ง๋ค.
Provider ๋ ์ง๊ธ ๋ฑ ํ์ํ DL ์ ๋์ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค.
get() ๋ฉ์๋ ํ๋๋ก ๊ธฐ๋ฅ์ด ๋งค์ฐ ๋จ์ํ๋ค.
๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค.
์๋ฐ ํ์ค์ด๋ฏ๋ก ์คํ๋ง์ด ์๋ ๋ค๋ฅธ ์ปจํ
์ด๋์์๋ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฆฌ
๊ทธ๋ฌ๋ฉด ํ๋กํ ํ์ ๋น์ ์ธ์ ์ฌ์ฉํ ๊น?
๋งค๋ฒ ์ฌ์ฉํ ๋ ๋ง๋ค ์์กด๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ๋ ์๋ก์ด ๊ฐ์ฒด๊ฐ ํ์ํ๋ฉด ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฑ๊ธํค ๋น์ผ๋ก ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ๋น์ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ผ์ ๋งค์ฐ ๋๋ฌผ๋ค.
ObjectProvider , JSR330 Provider ๋ฑ์ ํ๋กํ ํ์ ๋ฟ๋ง ์๋๋ผ DL์ด ํ์ํ ๊ฒฝ์ฐ๋ ์ธ์ ๋ ์ง ์ฌ์ฉํ ์ ์๋ค.
> ์ฐธ๊ณ :
์ค๋ฌด์์ ์๋ฐ ํ์ค์ธ JSR-330 Provider๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง,
์๋๋ฉด ์คํ๋ง์ด ์ ๊ณตํ๋ ObjectProvider๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ณ ๋ฏผ์ด ๋ ๊ฒ์ด๋ค.
ObjectProvider๋ DL์ ์ํ ํธ์ ๊ธฐ๋ฅ์ ๋ง์ด ์ ๊ณตํด์ฃผ๊ณ ์คํ๋ง ์ธ์ ๋ณ๋์ ์์กด๊ด๊ณ ์ถ๊ฐ๊ฐ ํ์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๋ค.
๋ง์ฝ ์ฝ๋๋ฅผ ์คํ๋ง์ด ์๋ ๋ค๋ฅธ ์ปจํ ์ด๋์์๋ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ฉด JSR-330 Provider๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
์คํ๋ง์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด ๊ธฐ๋ฅ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค๋ ์๋ฐ ํ์ค๊ณผ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ๊ฒน์น ๋๊ฐ ๋ง์ด ์๋ค.
๋๋ถ๋ถ ์คํ๋ง์ด ๋ ๋ค์ํ๊ณ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์, ํน๋ณํ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ์ผ์ด ์๋ค๋ฉด,
์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋๋ค.