์ปจํ ์ด๋ ์ด๊ธฐํ์ ์ข ๋ฃ
์คํ๋ง ์ปจํ ์ด๋๋ ์ด๊ธฐํ์ ์ข ๋ฃ๋ผ๋ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฐ๋๋ค.
- ์ปจํ ์คํธ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ์ปจํ ์ด๋๋ฅผ ์ด๊ธฐํํจ
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ํด๋์ค์์ ์ ๋ณด๋ฅผ ์ฝ์ด์ ์๋ง์ Bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ฐ Bean์ ์ฐ๊ฒฐ(์์กด ์ฃผ์ )ํ๋ ์์ ์ํ
- ์ด๊ธฐํ๊ฐ ๋๋ ํ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ(getBean()๋ฑ์ ์์ ์ผ๋ก Bean ๊ฐ์ฒด๋ฅผ ๊ตฌํ๋ ํ์ ๋ฑ)
- ์ปจํ ์ด๋ ์ฌ์ฉ์ด ๋๋๋ฉด ์ปจํ ์ด๋๋ฅผ close() ๋งค์๋๋ฅผ ์ฌ์ฉํด ์ข ๋ฃ, Bean ๊ฐ์ฒด์ ์๋ฉธ
๊ธฐ๋ณธ์ ์ผ๋ก Spring์ ApplicationContext ๊ตฌํ์ ์ด๊ธฐํ ํ๋ก์ธ์ค์์ ๋ชจ๋ ์ฑ๊ธํค ๋น์ ์์ฑ ๋ฐ ์ค์
> ๋ฐ๋ผ์ Bean์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ์ด๊ธฐํ ๋จ๊ณ์์ ์ ์ ์๋ค๋ ์ฅ์ ์ด ์กด์ฌ
// 1. ์ปจํ
์ด๋ ์ด๊ธฐํ
AnnotationConfigApplicationiContext ctx =
new AnnotationConfigContext(AppContext.class);
// 2. ์ปจํ
์ด๋์์ ๋น ๊ฐ์ฒด๋ฅผ ๊ตฌํด์ ์ฌ์ฉ
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("์คํ๋ง");
System.out.println(msg);
// 3. ์ปจํ
์ด๋ ์ข
๋ฃ
ctx.close();
- AnnotationConfigApplicationiContext์ ์์ฑ์๋ฅผ ์ด์ฉํด์ context ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด ์์ ์์ ์คํ๋ง ์ปจํ ์ด๋ ์ด๊ธฐํ๊ฐ ์งํ๋๊ณ , ์ด ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ํด๋์ค์์ ์ ๋ณด๋ฅผ ์ฝ์ด์ ์๋ง์ ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ ๋น์ ์ฐ๊ฒฐ(์์กด์ฃผ์ )ํ๋ ์์ ์ ์ํํ๋ค. - (์์์ ์ด๊ธฐํ๋์ด ์ฌ์ฉ๊ฐ๋ฅํ ์ปจํ
์ด๋) getBean()๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ปจํ
์ด๋์ ๋ณด๊ด๋ ๋น ๊ฐ์ฒด๋ฅผ ๊ตฌํ๋ค.
- ์ปจํ
์ด๋ ์ฌ์ฉ์ ์ข
๋ฃํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋์ด๋ค. AbstractApplicationContext ํด๋์ค์ ์ ์๋์ด ์๋ค.
AnnotationConfigApplicationiContext๊ฐ AbstractApplicationContext๋ฅผ ์์ ๋ฐ๊ธฐ ๋๋ฌธ์ close() ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ปจํ ์ด๋ ์ด๊ธฐํ -> ๋น ๊ฐ์ฒด์ ์์ฑ, ์์กด ์ฃผ์ , ์ด๊ธฐํ
์ปจํ ์ด๋ ์ข ๋ฃ -> ๋น ๊ฐ์ฒด์ ์๋ฉธ
์คํ๋ง ๋น ๊ฐ์ฒด์ ๋ผ์ดํ ์ฌ์ดํด
๊ฐ์ฒด์์ฑ - ์์กด์ค์ - ์ด๊ธฐํ - ์๋ฉธ
์คํ๋ง ์ปจํ ์ด๋๋ ๋น ๊ฐ์ฒด์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ค.
1. ๋น ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์๋ฉธ : ์คํ๋ง ์ธํฐํ์ด์ค
- org.springframework.beans.factory.InitializingBean
- org.springframework.beans.factory.DisposableBean
๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค, ์ด๊ธฐํ ๊ณผ์ ์ด ํ์ํ๋ฉด
InitializingBean ์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ณ afterPropertiesSet()๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
๋น ๊ฐ์ฒด์ ์๋ฉธ ๊ณผ์ ์ด ํ์ํ๋ฉด DisposableBean ์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ณ destroy()๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
ex. ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ปค๋ฅ์
ํ, ์ฑํ
ํด๋ผ์ด์ธํธ
๋ฉ์๋ ์ ์ ์ธํฐํ์ด์ค
- org.springframework.beans.factory.InitializingBean
- org.springframework.beans.factory.DisposableBean
//์ด๊ธฐํ ์ธํฐํ์ด์ค
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
//์๋ฉธ ์ธํฐํ์ด์ค
public interface DisposableBean {
void Destroy() throws Exception;
}
ํด๋น ์ฝ๋๋ฅผ ์ํํ๋ฉด ์ฝ์ ํ๋ฉด์ ๋งค์๋์์ ์ ์ํ "Client.afterPropertiesSet() ์คํ" ๋ฐ "Client.destroy() ์คํ"์ด ์ถ๋ ฅ ๋จ
๋น ๊ฐ์ฒด ์์ฑ์ ๋ง๋ฌด๋ฆฌํ ๋ค์ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
๋, ๊ฐ์ฅ ๋ง์ง๋ง์ destroy() ๋ฉ์๋๋ฅผ ์คํํ๋ค.
์ปค์คํ ๋ฉ์๋
2. ๋น ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์๋ฉธ :์ธํฐํ์ด์ค๋ก ์์๋ฐ์ ๊ตฌํํ๋ ๊ฒ ๋ง๊ณ ์ธ๋ถ์์ ์ ๊ณต๋ฐ์ ํด๋์ค๋ฅผ ์คํ๋ง ๋น ๊ฐ์ฒด๋ก ์ค์ ํ๊ณ ์ถ์ ๋๋ ์๋ค.
์คํ๋ง ์ค์ ์์ ์ง์ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
@Beanํ๊ทธ์์ initMethod ์์ฑ๊ณผ destroyMethod ์์ฑ์ ์ฌ์ฉํด์ ์ด๊ธฐํ ๋ฉ์๋์ ์๋ฉธ ๋ฉ์๋์ ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.
//Client2.java
...
// ์ง์ ์ด๊ธฐํ ๋ฉ์๋ ์ง์
public void connect(){
System.out.println("Client2.connect() ์คํ");
}
// ์ง์ ์๋ฉธ ๋ฉ์๋ ์ง์
public void close(){
System.out.println("Client2.close() ์คํ");
}
...
์ด ๋ฉ์๋๋ค์ @Bean ์ ๋ ธํ ์ด์ ์ initMethod ์์ฑ๊ณผ destroyMethod ์์ฑ์ ์ฌ์ฉ๋ ๋ฉ์๋ ์ด๋ฆ์ธ connect์ close๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
@Bean(initMethod = "connect", destoryMethod = "close") public Client2 clien2(){ ... }
์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ง์ ์คํํ ๋ ์ด๊ธฐํ ๋ฉ์๋๊ฐ ๋ ๋ฒ ๋ถ๋ฆฌ์ง ์๋ค๋ก ์กฐ์ฌํ์. afterPropertiesSet()์ด ๋๋ฒ ๋ถ๋ฆด ์ํ ์์
๋น ๊ฐ์ฒด์ ์์ฑ๊ณผ ๊ด๋ฆฌ ๋ฒ์
// ํ ์๋ณ์์ ๋ํด ํ ๊ฐ์ ๊ฐ์ฒด๋ง ์กด์ฌํ๋ ๋น
// ์ฑ๊ธํค ๋ฒ์๋ฅผ ๊ฐ๋๋ค.
//client1 == client : true
Client client1 = ctx.getBean("client", Client.class);
Client client2 = ctx.getBean("client", Client.class);
------------------------
// client ๋น์ ๋ฒ์๊ฐ ํ๋กํ ํ์
์ผ ๊ฒฝ์ฐ
// ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑ
// client1 != client : true
Client client1 = ctx.getBean("client", Client.class);
Client client2 = ctx.getBean("client", Client.class);
๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ์ฑ๊ธํค ๋ฒ์๋ฅผ ๊ฐ๋๋ฐ, ํน์ ๋น์ ํ๋กํ ํ์ ์ผ๋ก ๋น์ ์ค์ ํ ์ ๋ ์๋ค. @Scope์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
@Bean
@Scope("prototype")
public Client client(){
...
}
- ์ฑ๊ธํค ๋ฒ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ฃผ๊ณ ์ถ์ผ๋ฉด @Scope("singleton)์ด๋ผ๊ณ ํด์ฃผ๋ฉด ๋๋ค.
- ํ๋กํ ํ์ ์ ๋ณ๋์ ์๋ฉธ ์ฒ๋ฆฌ๋ฅผ ์ฝ๋์์ ์ง์ ํด์ผ ํ๋ค.
Reference.
'์ด๋ณด ์น ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ๋ง5 ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ'
'๐ฅ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[spring] ์ปดํฌ๋ํธ ์ค์บ์ด๋ (0) | 2021.08.31 |
---|---|
[Spring] "ํ์ด๋ฆฌ๋จ" ์คํ๋ง ์คํฐ๋ 1์ฐจ (0) | 2021.08.20 |
[Spring] DI์ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2021.08.18 |
[Spring] ์์กด์ฑ ์ฃผ์ (DI)์ด๋ ? (0) | 2021.08.18 |