์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ๊ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
1. ๋น ์ค์ฝํ๋?
๋น ์ค์ฝํ๋, ๋น์ด ์์ฑ๋์ด ์๋ฉธ๋๊ธฐ๊น์ง์ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค.
์ง๊ธ๊น์ง๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋ฐ ๋ ์คํ๋ง ๋น์ด ์์ฑ๋๊ณ , ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ํจ๊ป ์๋ฉธํ๋ค๊ณ ๋ฐฐ์ ๋ค. ํ์ง๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๋ค์ํ ์ค์ฝํ๋ฅผ ๊ฐ์ง ๋น์ด ํ์ํด์ง๋ค.
์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ํด ๋ก๊ทธ๋ฅผ ์ฐ์ผ๋ ค๋ฉด ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋น์ ์์ฑํ๊ณ , ์์ฒญ์ด ์ข ๋ฃ๋๋ฉด ๋น์ ์๋ฉธ์์ผ์ผ ํ๋ค. ์ด์ฒ๋ผ ๋น์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฑ๊ธํค๊ณผ ๋ค๋ฅด๊ฒ ์ ์ดํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์คํ๋ง ์ปจํ ์ด๋์์๋ ๋ค์ํ ๋น ์ค์ฝํ๋ฅผ ์ง์ํ๋ค.
๋น ์ค์ฝํ์๋ ๋ค์๊ณผ ๊ฐ์ ์ข ๋ฅ๊ฐ ์๋ค.
- ์ฑ๊ธํค: ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ํ ๋ ์์ฑ๋์ด ์ข ๋ฃ๋ ๋ ์๋ฉธ๋๋, ์คํ๋ง ์ปจํ ์ด๋์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ์ค์ฝํ
- ํ๋กํ ํ์ : ๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ , ์ด๊ธฐํ๊น์ง๋ง ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋๋ ์ค์ฝํ์ด๋ค. ํ๋กํ ํ์ ๋น์ ๋น ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
- ์น ๊ด๋ จ ์ค์ฝํ
- request: ์น ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ถํฐ ๋๊ฐ ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
- session: ์น ์ธ์ ์ด ์์ฑ๋ ๋๋ถํฐ ์ข ๋ฃ๋ ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
- application: ์น์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
๐ก์๋ธ๋ฆฟ ์ปจํ ์คํธ?
์๋ธ๋ฆฟ๋ค์ด ๊ณตํต์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ์ค์ ๋ฐ์ดํฐ ์ ์ฅ์๋ก, ์น ์ดํ๋ฆฌ์ผ์ด์ ๋น ํ๋๊ฐ ์์ฑ๋๋ค. ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ์์ฑ๋์ด ์ข ๋ฃ๋ ๋ ์๋ฉธํ๋ค.
2. ๋น ์ค์ฝํ ์ง์ ํ๊ธฐ
๋น ์๋ ๋ฑ๋ก ์
@Scope("prototype")
@Component
public class ExampleBean {
...
๋น ์๋ ๋ฑ๋ก ์
@Scope("prototype")
@Bean
PrototypeBean ExampleBean() {
return new exampleBean();
}
3. ์ฑ๊ธํค ์ค์ฝํ
์ฑ๊ธํค ์ค์ฝํ๋, ์คํ๋ง ์ปจํ ์ด๋์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ์ค์ฝํ๋ก ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ํ ๋ ์์ฑ๋์ด ์ข ๋ฃ๋ ๋ ์๋ฉธ๋๋ค.
๋ฑ 1๊ฐ์ ์ธ์คํด์ค๋ง ์์ฑ๋์ด ๋น ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋์ผํ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ ํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ ์ด์ ๊ธ์ ์ฐธ๊ณ ํ์.
4. ํ๋กํ ํ์ ์ค์ฝํ
ํ๋กํ ํ์ ์ค์ฝํ๋, ๋น ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ ์ค์ฝํ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ๋กํ ํ์ ์ค์ฝํ ๋น์ ์์ฒญํ๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑํ์ฌ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๊ณ ์ด๊ธฐํ๋ฅผ ์งํํ๋ค.
๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ง ๋น์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๊ณ ๋๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ๋ ์ด์ ๋น์ ๊ด๋ฆฌํ์ง ์๋๋ค.
๊ทธ๋์ ์คํ๋ง ์ปจํ
์ด๋๋ ํ๋กํ ํ์
์ค์ฝํ ๋น์ ์๋ฉธ ์์ ์ ๋ํด ์ ์ ์๊ณ , @PreDestroy
๊ฐ์ ์ข
๋ฃ ๋ฉ์๋ ํธ์ถํด์ฃผ์ง ์๋๋ค. ์คํ๋ง ์ปจํ
์ด๋์ ์์ ๋ ๋ ๋น์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ข
๋ฃ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ํธ์ถํด์ผ ํ๋ค.
ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ํ์ธํด ๋ณด์.
ExampleBean
public class ExampleBean {
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");
}
}
ExampleTest
public class ExampleTest {
@Test
public void exampleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(ExampleConfig.class);
// ํ๋กํ ํ์
์ค์ฝํ ๋น ์์ฒญ
System.out.println("request ExampleBean1");
ExampleBean exampleBean1 = ac.getBean(ExampleBean.class);
System.out.println("request ExampleBean2");
ExampleBean exampleBean2 = ac.getBean(ExampleBean.class);
// ํ๋กํ ํ์
์ค์ฝํ ๋น ์ถ๋ ฅ
System.out.println("exampleBean1 = " + exampleBean1);
System.out.println("exampleBean2 = " + exampleBean2);
ac.close();
}
@Configuration
static class ExampleConfig {
@Bean
@Scope("prototype")
public ExampleBean exampleBean() {
return new ExampleBean();
}
}
}
์คํ ๊ฒฐ๊ณผ
ExampleBean
์ ํ๋กํ ํ์
์ค์ฝํ๋ก ์ง์ ํ๊ณ , ExampleBean
์ 2๋ฒ ์์ฒญํ๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
์ถ๋ ฅ ๊ฒฐ๊ณผ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ์๋ฉธ ๋ฉ์๋๋ ํธ์ถ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฒ์๋ ์์ ํ
์คํธ ์ฝ๋์์ @Scope("prototype")
๋ถ๋ถ์ ์ง์ฐ๊ณ ์คํํด๋ณด์.
์คํ ๊ฒฐ๊ณผ
create๊ฐ request๋ณด๋ค ๋จผ์ ์ฐํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ธฐ๋ณธ ์ค์ ์ธ ์ฑ๊ธํค ์ค์ฝํ๋ก ์ง์ ๋์ด ์คํ๋ง ์ปจํ
์ด๋ ์์๊ณผ ํจ๊ป ๋น์ด ์์ฑ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
exampleBean1
๊ณผ exampleBean2
๊ฐ ๋์ผ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค.
์ฑ๊ธํค ์ค์ฝํ ๋น์ ๋ฑ 1๊ฐ์ ์ธ์คํด์ค๋ง ์์ฑํด๋๊ณ , ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด๋ฏธ ์์ฑํด๋์๋ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
4. ์น ์ค์ฝํ
์น ์ค์ฝํ๋ ์น ํ๊ฒฝ์์ ๋์ํ๋ ์น๊ณผ ๊ด๋ จ๋ ์ค์ฝํ์ด๋ค. ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ์ข ๋ฃ ์์ ๊น์ง ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ์คํ๋ง์์ ์ง์ํ๋ ์น ์ค์ฝํ์๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- request: HTTP ์์ฒญ ํ๋๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ ๋๊น์ง ์ ์ง๋๋ ์ค์ฝํ. ์์ฒญ๋ง๋ค ๋ณ๋์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ค.
- session: HTTP ์ธ์ ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ์ค์ฝํ. ๊ฐ์ ์ธ์ ๋ด์์๋ ๋์ผํ ์ธ์คํด์ค๊ฐ ๊ณต์ ๋๊ณ , ์ธ์ ์ด ์ข ๋ฃ๋๋ฉด ๋น๋ ํจ๊ป ์๋ฉธ๋๋ค.
- application: ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ์ค์ฝํ. ์๋ธ๋ฆฟ ์ปจํ ์คํธ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋น 1๊ฐ๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ํ ๋ ์์ฑ๋๊ณ , ์ข ๋ฃ๋ ๋ ์๋ฉธ๋๋ค.
- websocket: ์น ์์ผ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ์ค์ฝํ. ์น ์์ผ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ์ ์ฐ๊ฒฐ์ ์๋ํ ๋ ์์ฑ๋์ด, ์น ํ์ด์ง๋ฅผ ๋ซ๊ฑฐ๋ ์น ํด๋ผ์ด์ธํธ/์๋ฒ ์ธก์์ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ฉด ์๋ฉธ๋๋ค.
๐ก ์น ์์ผ?
์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์๋ฐฉํฅ ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. HTTP ์์ฒญ-์๋ต๊ณผ ๋ฌ๋ฆฌ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ์ง ์์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ผ๋ฉฐ, ์ฐ๊ฒฐ์ด ์ ์ง๋๋ค.
์์ฑ: ์น ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์๋ํ๋ฉฐ ์์ฑ๋๋ค.
์๋ฉธ: ์น ํ์ด์ง๋ฅผ ๋ซ๊ฑฐ๋, ํด๋ผ์ด์ธํธ/์๋ฒ์์ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ฉด ์๋ฉธ๋๋ค.
์์ฃผ ์ฌ์ฉํ๋ request ์ค์ฝํ ๋น์ ํตํด ์น ์ค์ฝํ ๋น์ ๋์ ๊ณผ์ ์ ์ดํด๋ณด์. ๋๋จธ์ง ๋น๋ค๋ ๋์ ๊ณผ์ ์ ๋น์ทํ๋ค.
ํด๋ผ์ด์ธํธ๋ง๋ค ์ฃผ๋ฌธ ์์ฒญ ๋ก๊ทธ๋ฅผ ์ฐ๊ธฐ ์ํด ClientLogger
๋ผ๋ ํด๋์ค๋ฅผ request ์ค์ฝํ๋ก ๋ฑ๋กํด ๋์๋ค๊ณ ์๊ฐํด๋ณด์.
ํด๋ผ์ด์ธํธ A์ B๊ฐ ๋์์ ์ฃผ๋ฌธ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์คํ๋ง์ ์์ฒญ๋ง๋ค ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ค. A์ ์์ฒญ๊ณผ B์ ์์ฒญ์ ์๋ก ๋ค๋ฅธ ClientLogger
์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋๋ฐ, ํด๋ผ์ด์ธํธ A์ ์์ฒญ๊ณผ B์ ์์ฒญ์ ์๋ก ๋ค๋ฅธ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ฒ๋ผ request ์ค์ฝํ ๋น์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๋๋๊ณ ์๋ต์ด ๋๊ฐ๋ฉด ํ๊ดด๋๋ค.
'๐๐ฉ๐ซ๐ข๐ง๐ > ๐๐๐ฌ๐ข๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฑ๊ธํค ๋น์์ ํ๋กํ ํ์ ๋น ์ฌ์ฉํ๊ธฐ (0) | 2023.10.17 |
---|---|
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.09.12 |
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2023.09.12 |
์ปดํฌ๋ํธ ์ค์บ (0) | 2023.09.02 |
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด (0) | 2023.09.02 |