์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ๊ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
์ง๊ธ๊น์ง ๋ค์ํ ๋น ์ค์ฝํ์ ๋ํด ์์๋ณด์๋ค. ๊ฐ๋ฐ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ํน์ฑ์ ๋ฐ๋ผ ์ ์ ํ ๋น ์ค์ฝํ๋ฅผ ์ ํํด์ผ ํ์ง๋ง, ํ๋กํ ํ์ ๋น๊ณผ ์ฑ๊ธํค ๋น์ ํจ๊ป ์ฌ์ฉํ ๋๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค.
๋จผ์ ์๋์ ๊ฐ์ด ๋์ํ๋ ํ๋กํ ํ์ ๋น์ด ์๋ค๊ณ ๊ฐ์ ํ์.
1. ํด๋ผ์ด์ธํธ A๊ฐ ์คํ๋ง ์ปจํ ์ด๋์ ํ๋กํ ํ์ ๋น์ ์์ฒญํ๋ค.
2. ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ๋กํ ํ์
๋น ์ธ์คํด์ค(PrototypeBean@x01
)๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
PrototypeBean@x01.count
: 0
3. ํด๋ผ์ด์ธํธ A๊ฐ addCount()
๋ฅผ ํธ์ถํ์ฌ count ํ๋๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
PrototypeBean@x01.count
: 1
์์ ๊ฐ์ ์ํฉ์์, ํด๋ผ์ด์ธํธ B๊ฐ ๋ฑ์ฅํ๋ค๊ณ ์๊ฐํด๋ณด์.
1. ํ๋กํ ํ์ ๋น์ ์ง์ ์์ฒญํ๋ ๊ฒฝ์ฐ
1. ํด๋ผ์ด์ธํธ B๊ฐ ์คํ๋ง ์ปจํ ์ด๋์ ํ๋กํ ํ์ ๋น์ ์์ฒญํ๋ค.
2. ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ๋กํ ํ์
๋น ์ธ์คํด์ค(PrototypeBean@x02
)๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
PrototypeBean@x02.count
: 0
3. ํด๋ผ์ด์ธํธ B๊ฐ addCount()
๋ฅผ ํธ์ถํ์ฌ count ํ๋๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
PrototypeBean@x02.count
: 1
ํ
์คํธ ์ฝ๋๋ฅผ ํตํด ํ์ธํด๋ณด์.
ExampleBean
public class ExampleBean {
private int count = 0;
public ExampleBean() {
System.out.println("create ExampleBean");
}
@PostConstruct
public void init() throws Exception {
System.out.println("ExampleBean.init");
}
@PreDestroy
public void close() throws Exception {
System.out.println("ExampleBean.destroy");
}
public void addCount() {
count++;
}
public int getCount() {
return count;
}
}
ExampleTest
public class ExampleTest {
@Test
public void exampleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(ExampleConfig.class);
System.out.println("ac = " + ac);
// exampleBean1
ExampleBean exampleBean1 = ac.getBean(ExampleBean.class);
exampleBean1.addCount();
System.out.println("exampleBean1.count = " + exampleBean1.getCount());
// exampleBean2
ExampleBean exampleBean2 = ac.getBean(ExampleBean.class);
exampleBean2.addCount();
System.out.println("exampleBean2.count = " + exampleBean2.getCount());
}
@Configuration
static class ExampleConfig {
@Bean
@Scope("prototype")
public ExampleBean exampleBean() {
return new ExampleBean();
}
}
}
์คํ ๊ฒฐ๊ณผ
count๊ฐ์ด ์์๋๋ก ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด์ฒ๋ผ ํ๋กํ ํ์ ๋น์ ์ง์ ์์ฒญํ ๋๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ฑ๊ธํค ๋น์์ ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
2. ์ฑ๊ธํค ๋น์์ ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
1. ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์์ฑ๋๋ฉด, ์ฑ๊ธํค์ธ singletonBean
์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์์กด๊ด๊ณ ์๋ ์ฃผ์
์ด ๋ฐ์ํ๋ค.
2. singletonBean
์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
๋ฐ๊ธฐ ์ํด ์คํ๋ง ์ปจํ
์ด๋์ ํ๋กํ ํ์
๋น์ ์์ฒญํ๋ค.
3. ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ๋กํ ํ์
๋น ์ธ์คํด์ค(PrototypeBean@x02
)๋ฅผ ์์ฑํ์ฌ ์ฑ๊ธํค ๋น์๊ฒ ์ฐธ์กฐ๊ฐ์ ๋ฐํํด์ค๋ค.
PrototypeBean@x02.count
: 0
singletonBean
์ ์ฑ๊ธํค ๋น์ด๊ธฐ ๋๋ฌธ์, ์ฃผ์
๋ฐ์ ํ๋กํ ํ์
๋น์ ์ฐธ์กฐ๊ฐ PrototypeBean@x02
๋ ์ด ์์ ์ดํ๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค.
4. ํด๋ผ์ด์ธํธ A๊ฐ ์คํ๋ง ์ปจํ ์ด๋์๊ฒ ์ฑ๊ธํค ๋น์ ์์ฒญํ๋ค.
5. ์คํ๋ง ์ปจํ
์ด๋๋ singletonBean@x01
์ ๋ฐํํด์ค๋ค.
6. ํด๋ผ์ด์ธํธ A๊ฐ singletonBean.logic()
์ ํธ์ถํ๋ฉด, ์ฑ๊ธํค ๋น์ prototypeBean.addCount()
๋ฅผ ํธ์ถํ์ฌ count๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
PrototypeBean@x02.count
: 1
7. ํด๋ผ์ด์ธํธ B๊ฐ ์คํ๋ง ์ปจํ ์ด๋์๊ฒ ์ฑํดํค ๋น์ ์์ฒญํ๋ค.
8. ์คํ๋ง ์ปจํ
์ด๋๋ singletonBean@x01
์ ๋ฐํํด์ค๋ค.
- ์ฑ๊ธํค ๋น์ด ์ฃผ์ ๋ฐ์ ์ฐธ์กฐ๊ฐ์ ์ฃผ์ ์์ ์ดํ๋ก ๋ฐ๋์ง ์์
- ํ๋กํ ํ์
๋น์ ์ฑ๊ธํค ๋น์ด ์คํ๋ง ์ปจํ
์ด๋์ ์์ฒญํ ๋ ์์ฑ๋จ
(์ฌ์ฉํ ๋๋ง๋ค ์์ฑ๋๋ ๊ฒ ์๋)
9. ํด๋ผ์ด์ธํธ B๊ฐ singletonBean.logic()
์ ํธ์ถํ๋ฉด, ์ฑ๊ธํค ๋น์ prototypeBean.addCount()
๋ฅผ ํธ์ถํ์ฌ count๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
PrototypeBean@x02.count
: 2
์ฝ๋๋ฅผ ํตํด ์ง์ ํ์ธํด๋ณด์.
public class ExampleTest {
@Test
public void exampleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class, PrototypeBean.class);
// ํด๋ผ์ด์ธํธ A
SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
System.out.println("client A call logic()");
singletonBean1.logic();
// ํด๋ผ์ด์ธํธ B
SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);
System.out.println("client B call logic()");
singletonBean2.logic();
}
@Scope("singleton")
static class SingletonBean {
private PrototypeBean prototypeBean;
@Autowired
public SingletonBean(PrototypeBean prototypeBean) {
this.prototypeBean = prototypeBean;
}
public void logic() {
prototypeBean.addCount();
System.out.println("count = " + prototypeBean.getCount());
}
}
@Scope("prototype")
static class PrototypeBean {
private int count = 0;
public int getCount() {
return count;
}
public void addCount() {
count++;
}
}
}
count๊ฐ์ด 1์ด ๋์ด์ผ ํ๋ ์์๊ณผ ๋ฌ๋ฆฌ count๊ฐ์ด 2๊ฐ ๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ์ฑ๊ธํค ๋น์ด ์์ฑ ์์ ์๋ง ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ๋น์ ์ฃผ์ ๋ ํ๋กํ ํ์ ๋น๋ ์ฑ๊ธํค ๋น๊ณผ ํจ๊ป ๊ณ์ ์ด์์์ด์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ค.
ํ๋กํ ํ์
๋น์ ์คํ๋ง ์ปจํ
์ด๋์ ์์ฒญ๋ ๋๋ง๋ค ์์ฑ๋๋ฏ๋ก, ํ๋กํ ํ์
๋น์ ์ฌ์ฉํ ๋๋ง๋ค ์ฑ๊ธํค ๋น์์ ac.getBean(PrototypeBean.class)
๋ฅผ ํตํด ํ๋กํ ํ์
๋น์ ์์ฒญํ๋ฉด ํด๊ฒฐ๋๊ธฐ๋ ํ๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ๋ฒ์ ๋น์ด ApplicationContext๋ฅผ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์, ์คํ๋ง์ ์ข
์์ ์ด๊ฒ ๋๊ณ ๋จ์ ํ
์คํธ๊ฐ ์ด๋ ค์์ง๋ค.
3. ํด๊ฒฐ ๋ฐฉ๋ฒ: Provider ์ฌ์ฉํ๊ธฐ
์ฑ๊ธํค ๋น์ ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๋ ค ํ ๋๋ง๋ค ์คํ๋ง ์ปจํ ์ด๋์ ์์กด๊ด๊ณ๋ฅผ ์์ฒญํด์ผ ํ๋ค. ์ด์ฒ๋ผ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ์ง ์๊ณ , ํ์ํ ๋ ์ง์ ์์ฒญํ๋ ๊ฒ์ Dependency Lookup (์์กด๊ด๊ณ ์กฐํ) ๋ผ๊ณ ํ๋ค.
์คํ๋ง์์๋ ObjectProvider
๋ฅผ ํตํด ํน์ ๋น์ ์ปจํ
์ด๋์์ ๋์ ์ฐพ์์ฃผ๋ DL ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. SingletonBean์ ์๋์ ๊ฐ์ด ์์ ํ ๋ค ํ
์คํธ๋ฅผ ๋ค์ ์คํํด๋ณด์.
@Scope("singleton")
static class SingletonBean {
private ObjectProvider<PrototypeBean> objectProvider;
@Autowired
public SingletonBean(ObjectProvider<PrototypeBean> objectProvider) {
this.objectProvider = objectProvider;
}
public void logic() {
PrototypeBean prototypeBean = objectProvider.getObject();
prototypeBean.addCount();
System.out.println("count = " + prototypeBean.getCount());
}
}
count๊ฐ์ด 1์ด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์์กด๊ด๊ณ ์ฃผ์
์์ ์ ObjectProvider๋ฅผ ๋์ ์ฃผ์
๋ฐ๊ณ , ํ๋กํ ํ์
๋น์ด ํ์ํ ์์ ์ objectProvider.getObject()
๋ฅผ ํตํด ํ๋กํ ํ์
๋น์ ์์ฒญํ์ฌ ์๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ObjectProvider๋ ์คํ๋ง์ ์์กด์ ์ด๋ค. ์คํ๋ง์ ์์กดํ๊ณ ์ถ์ง ์๋ค๋ฉด, javax.inject.Provider
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. (gradle ์ถ๊ฐ ์ค์ ํ์)
@Scope("singleton")
static class SingletonBean {
private Provider provider;
@Autowired
public SingletonBean(Provider<PrototypeBean> provider) {
this.provider = provider;
}
public void logic() {
PrototypeBean prototypeBean = provider.get();
prototypeBean.addCount();
System.out.println("count = " + prototypeBean.getCount());
}
}
'๐๐ฉ๐ซ๐ข๐ง๐ > ๐๐๐ฌ๐ข๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น ์ค์ฝํ๋? (0) | 2023.09.12 |
---|---|
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.09.12 |
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2023.09.12 |
์ปดํฌ๋ํธ ์ค์บ (0) | 2023.09.02 |
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด (0) | 2023.09.02 |