์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ๋ผ๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ–๋Š”๋‹ค.

  • ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•จ
  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ • ํด๋ž˜์Šค์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด์™€ ์•Œ๋งž์€ 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();

 

 

 

 

  1. AnnotationConfigApplicationiContext์˜ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ context ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ์ด ์‹œ์ ์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๊ฐ€ ์ง„ํ–‰๋˜๊ณ , ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ • ํด๋ž˜์Šค์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด์™€ ์•Œ๋งž์€ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ๋นˆ์„ ์—ฐ๊ฒฐ(์˜์กด์ฃผ์ž…)ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  2. (์œ„์—์„œ ์ดˆ๊ธฐํ™”๋˜์–ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ) getBean()๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์— ๋ณด๊ด€๋œ ๋นˆ ๊ฐ์ฒด๋ฅผ ๊ตฌํ•œ๋‹ค.

  3. ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์„ ์ข…๋ฃŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. 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 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ' 

+ Recent posts