๋น ์ค์ฝํ๋?
์คํ๋ง ๋น์ด ์คํ๋ง ์ปจํ ์ด๋์ ์์๊ณผ ํจ๊ป ์์ฑ๋์ด์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ค๊ณ ํ์ตํ๋ค.
์ด๊ฒ์ ์คํ๋ง ๋น์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค ์ค์ฝํ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ฝํ๋ ๋ฒ์ญ ๊ทธ๋๋ก ๋น์ด ์กด์ฌํ ์ ์๋ ๋ฒ์๋ฅผ ๋ปํ๋ค.
๋ค์ํ ์ค์ฝํ ์ง์
์ฑ๊ธํค: ๊ธฐ๋ณธ ์ค์ฝํ, ์คํ๋ง ์ปจํ ์ด๋์ ์์๊ณผ ์ข ๋ฃ๊น์ง ์ ์ง๋๋ ๊ฐ์ฅ ๋์ ๋ฒ์์ ์ค์ฝํ์ด๋ค.
ํ๋กํ ํ์ : ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋กํ ํ์ ๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ ๊น์ง๋ง ๊ด์ฌํ๊ณ
๋๋ ๊ด๋ฆฌํ์ง ์๋ ๋งค์ฐ ์งง์ ๋ฒ์์ ์ค์ฝํ์ด๋ค.
์น ๊ด๋ จ ์ค์ฝํ
request: ์น ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
session: ์น ์ธ์ ์ด ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
application: ์น์ ์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ์ด๋ค.
์ฑ๊ธํค ์ค์ฝํ
์ฑ๊ธํค ์ค์ฝํ์ ๋น์ ์กฐํํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํญ์ ๊ฐ์ ์ธ์คํด์ค์ ์คํ๋ง ๋น์ ๋ฐํํ๋ค.
1. ์ฑ๊ธํค ์ค์ฝํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํ๋ค.
2. ์คํ๋ง ์ปจํ ์ด๋๋ ๋ณธ์ธ์ด ๊ด๋ฆฌํ๋ ์คํ๋ง ๋น์ ๋ฐํํ๋ค.
3. ์ดํ์ ์คํ๋ง ์ปจํ
์ด๋์ ๊ฐ์ ์์ฒญ์ด ์๋ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค์ ์คํ๋ง ๋น์ ๋ฐํํ๋ค.
ํ๋กํ ํ์ ์ค์ฝํ
๋ฐ๋ฉด์ ํ๋กํ ํ์ ์ค์ฝํ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ์กฐํํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ ํญ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
1. ํ๋กํ ํ์ ์ค์ฝํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํ๋ค.
2. ์คํ๋ง ์ปจํ
์ด๋๋ ์ด ์์ ์ ํ๋กํ ํ์
๋น์ ์์ฑํ๊ณ , ํ์ํ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ค.
3. ์คํ๋ง ์ปจํ ์ด๋๋ ์์ฑํ ํ๋กํ ํ์ ๋น์ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ค.
4. ์ดํ์ ์คํ๋ง ์ปจํ
์ด๋์ ๊ฐ์ ์์ฒญ์ด ์ค๋ฉด ํญ์ ์๋ก์ด ํ๋กํ ํ์
๋น์ ์์ฑํด์ ๋ฐํํ๋ค.
์ฝ๋
@PostConstruct
public void init() {
System.out.println("SingletonBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("SingletonBean.destroy");
}
@PostConstruct : ์ด๊ธฐํ ์ฝ๋ฐฑ
@ PreDestroy : ์๋ฉธ์ ์ฝ๋ฐฑ
์คํ๋ง์ปจํ ์ด๋์์ฑ -> ์คํ๋ง๋น์์ฑ -> ์์กด๊ด๊ณ์ฃผ์ -> ์ด๊ธฐํ ์ฝ๋ฐฑ -> ์๋ฉธ์ ์ฝ๋ฐฑ -> ์คํ๋ง ์ข ๋ฃ
์ฑ๊ธํค ์ค์ฝํ์ ๋น์ ์กฐํ
@Scope("singleton")
static class SingletonBean {
@Test
void singletonBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);
์ปจํ ์ด๋ ์์ฑ
System.out.println("find singletonBean1");
SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
System.out.println("singletonBean1 = " + singletonBean1);
System.out.println("find singletonBean2");
SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);
System.out.println("singletonBean2 = " + singletonBean2);
Assertions.assertThat(singletonBean1).isSameAs(singletonBean2);
ac.close();
singletonBean1 , singletonBean2 ๊ฐ์ฒด ๋๊ฐ ์์ฑ
๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ธ์คํด์ค์ธ์ง ํ์ธ
์ฑ๊ธํค ๋น์ ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ์์ ์ ์ด๊ธฐํ ๋ฉ์๋๊ฐ ์คํ
-- > init : @PostConstruct ์ด๊ธฐํ ์ฝ๋ฐฑ ํธ์ถ
๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค์ ์คํ๋ง ๋น์ ๋ฐํ ( singletonBean1 == singletonBean2 , ์ฐธ์กฐ๊ฐ์ด ๊ฐ๋ค )
์ฑ๊ธํค ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ๋น์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ์คํ
--> destroy : ์คํ๋ง ์ปจํ ์ด๋์ ์ข ๋ฃ๊ฐ ํธ์ถ๋์ ์๋ฉธ ๋ฉ์๋๊ฐ ํธ์ถ ๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค.
ํ๋กํ ํ์ ์ค์ฝํ ๋น ํ ์คํธ
@Scope("prototype")
static class PrototypeBean {
@Test
void PrototypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
์ปจํ ์ด๋ ์์ฑ
System.out.println("find prototypeBean1");
PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
System.out.println("prototypeBean1 = " + prototypeBean1);
System.out.println("find prototypeBean2");
PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
System.out.println("prototypeBean2 = " + prototypeBean2);
Assertions.assertThat(prototypeBean1).isNotSameAs(prototypeBean2);
ac.close();
prototypeBean1 , prototypeBean2 ๊ฐ์ฒด ๋๊ฐ ์์ฑ
๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค์ธ์ง ํ์ธ
ํ๋กํ ํ์ ์ค์ฝํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ ์กฐํํ ๋ ์์ฑ๋๊ณ , ์ด๊ธฐํ ๋ฉ์๋๋ ์คํ๋๋ค.
ํ๋กํ ํ์
๋น์ 2๋ฒ ์กฐํํ์ผ๋ฏ๋ก ์์ ํ ๋ค๋ฅธ ์คํ๋ง ๋น์ด ์์ฑ๋๊ณ , ์ด๊ธฐํ๋ 2๋ฒ ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํญ์ ์๋ก์ด ํ๋กํ ํ์ ๋น์ ์์ฑํด์ ๋ฐํ
ํ๋กํ ํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์ ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ ๊น์ง๋ง ๊ด์ฌํ๊ณ , ๋๋ ๊ด๋ฆฌํ์ง ์๋๋ค.
๋ฐ๋ผ์ ํ๋กํ ํ์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ @PreDestroy ๊ฐ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ์ ํ ์คํ๋์ง ์๋๋ค.
ํ๋กํ ํ์ ๋น์ ํน์ง ์ ๋ฆฌ
์คํ๋ง ์ปจํ ์ด๋์ ์์ฒญํ ๋ ๋ง๋ค ์๋ก ์์ฑ๋๋ค.
์คํ๋ง ์ปจํ
์ด๋๋ ํ๋กํ ํ์
๋น์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ ์ฃผ์
, ์ด๊ธฐํ๊น์ง๋ง ์ฒ๋ฆฌํ๋ค๋๊ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ์ ๋น์ ๋ฐํํ๊ณ , ์ดํ ์คํ๋ง ์ปจํ ์ด๋๋ ์์ฑ๋ ํ๋กํ ํ์ ๋น์ ๊ด๋ฆฌํ์ง ์๋๋ค.
ํ๋กํ ํ์ ๋น์ ๊ด๋ฆฌํ ์ฑ ์์ ํ๋กํ ํ์ ๋น์ ๋ฐ์ ํด๋ผ์ด์ธํธ์ ์๋ค.
๊ทธ๋์ @PreDestroy ๊ฐ์ ์ข ๋ฃ ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์๋๋ค.