[Spring] 8.๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ

 

1. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์‹œ์ž‘

- DB ์ปค๋„ฅ์…˜ ํ’€ / ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ํ•ด๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ์ ์— ์—ฐ๊ฒฐ์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ ค๋ฉด [๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”]์™€ [์ข…๋ฃŒ ์ž‘์—…]์ด ํ•„์š”

 

ex) ๊ฐ„๋‹จํ•˜๊ฒŒ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์— ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •

์‹ค์ œ๋กœ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋‹จ์ˆœํžˆ ๋ฌธ์ž๋งŒ ์ถœ๋ ฅ

NetworkClient ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— connect() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์—ฐ๊ฒฐ์„ ๋งบ์–ด๋‘์–ด์•ผ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด disConnect() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์—ฐ๊ฒฐ์„ ๋Š์–ด์•ผ ํ•จ

public class NetworkClient {
  private String url;
  
  public NetworkClient() { 
    System.out.println("์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = " + url);
    connect();
    call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
  }
  
  public void setUrl(String url) {
    this.url = url;
  }

  //์„œ๋น„์Šค ์‹œ์ž‘์‹œ ํ˜ธ์ถœ
  public void connect() {
    System.out.println("connect: " + url);
  }
      
  public void call(String message) {
    System.out.println("call: " + url + " message = " + message);
  }
  
  //์„œ๋น„์Šค ์ข…๋ฃŒ์‹œ ํ˜ธ์ถœ
  public void disconnect() {
    System.out.println("close: " + url);
  }
}

์Šคํ”„๋ง ํ™˜๊ฒฝ์„ค์ •๊ณผ ์‹คํ–‰

public class BeanLifeCycleTest {
  @Test
  public void lifeCycleTest() {
    ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
    NetworkClient client = ac.getBean(NetworkClient.class);
    ac.close(); //์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒ, ConfigurableApplicationContext ํ•„์š” 
  }
    
  @Configuration
  static class LifeCycleConfig {
    @Bean
    public NetworkClient networkClient() {
      NetworkClient networkClient = new NetworkClient();
      networkClient.setUrl("http://hello-spring.dev");
      return networkClient;
    } 
  }
}

 

๊ฒฐ๊ณผ

์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = null
connect: null
call: null message =
์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€

์ƒ์„ฑ์ž ๋ถ€๋ถ„์„ ๋ณด๋ฉด url ์ •๋ณด ์—†์ด connect๊ฐ€ ํ˜ธ์ถœ
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์—๋Š” url์ด ์—†๊ณ , ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ์— ์™ธ๋ถ€์—์„œ ์ˆ˜์ •์ž ์ฃผ์ž…์„ ํ†ตํ•ด์„œ setUrl() ์ด ํ˜ธ์ถœ๋˜์–ด์•ผ url์ด ์กด์žฌํ•˜๊ฒŒ ๋จ

<์Šคํ”„๋ง ๋นˆ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด>

๊ฐ์ฒด ์ƒ์„ฑ -> ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์Šคํ”„๋ง ๋นˆ์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋‹ค ๋๋‚œ ๋‹ค์Œ์—์•ผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ดˆ๊ธฐํ™” ์ž‘์—…์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๊ณ  ๋‚œ ๋‹ค์Œ์— ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ์‹œ์ ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?
์Šคํ”„๋ง์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋˜๋ฉด ์Šคํ”„๋ง ๋นˆ์—๊ฒŒ ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ดˆ๊ธฐํ™” ์‹œ์ ์„ ์•Œ๋ ค์ฃผ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
๋˜ํ•œ ์Šคํ”„๋ง์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ์†Œ๋ฉธ ์ฝœ๋ฐฑ์„ ์ค€๋‹ค.
๋”ฐ๋ผ์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ) ์ƒ์„ฑ์ž ์ฃผ์ž… (๊ฐ์ฒด ๋งŒ๋“ค๋•Œ ์ด๋ฏธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์Šคํ”„๋ง ๋นˆ์ด ๋“ค์–ด์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด๊ด€๊ณ„ ๋™์‹œ์—)

 

์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฒคํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด

[์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ] -> [์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ] -> [์˜์กด๊ด€๊ณ„ ์ฃผ์ž…] -> [์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ] -> [์‚ฌ์šฉ] -> [์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ] -> [์Šคํ”„๋ง ์ข…๋ฃŒ]

 

- ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ : ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ๋นˆ์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ

- ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ : ๋นˆ์ด ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ

 

์Šคํ”„๋ง์€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ์„ ์ง€์›

์ฐธ๊ณ : ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•˜์ž

์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜ ์ •๋ณด(ํŒŒ๋ผ๋ฏธํ„ฐ)๋ฅผ ๋ฐ›๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง„๋‹ค. 
๋ฐ˜๋ฉด์— ์ดˆ๊ธฐํ™”๋Š”
์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ’๋“ค์„ ํ™œ์šฉํ•ด์„œ ์™ธ๋ถ€ ์ปค๋„ฅ์…˜์„ ์—ฐ๊ฒฐํ•˜๋Š”๋“ฑ ๋ฌด๊ฑฐ์šด ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ์•ˆ์—์„œ ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•จ๊ป˜ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š”,
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ ์ข‹๋‹ค
๋ฌผ๋ก  ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๋‚ด๋ถ€ ๊ฐ’๋“ค๋งŒ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•˜๋Š” ์ •๋„๋กœ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž์—์„œ ํ•œ๋ฒˆ์— ๋‹ค ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค

์ฐธ๊ณ : 

์‹ฑ๊ธ€ํ†ค ๋นˆ๋“ค์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์‹ฑ๊ธ€ํ†ค ๋นˆ๋“ค๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ์ด ์ผ์–ด๋‚œ๋‹ค.
์‹ฑ๊ธ€ํ†ค ์ฒ˜๋Ÿผ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๊นŒ์ง€ ์ƒ์กดํ•˜๋Š” ๋นˆ๋„ ์žˆ์ง€๋งŒ,
์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์งง์€ ๋นˆ๋“ค๋„ ์žˆ๋Š”๋ฐ - ์ด ๋นˆ๋“ค์€ ์ปจํ…Œ์ด๋„ˆ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ด๋‹น ๋นˆ์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ์ด ์ผ์–ด๋‚œ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ์Šค์ฝ”ํ”„์—์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

์Šคํ”„๋ง์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ์„ ์ง€์›ํ•œ๋‹ค.

1) ์ธํ„ฐํŽ˜์ด์Šค(InitializingBean, DisposableBean)
2) ์„ค์ • ์ •๋ณด์— ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ, ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ ์ง€์ •

3) @PostConstruct, @PreDestroy ์• ๋…ธํ…Œ์ด์…˜ ์ง€์›


2. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์› 1 - ์ธํ„ฐํŽ˜์ด์Šค(initializingBean, DisposableBean)

- DB ์ปค๋„ฅ์…˜ ํ’€ / ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ํ•ด๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ์ ์— ์—ฐ๊ฒฐ์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ ค๋ฉด [๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”]์™€ [์ข…๋ฃŒ ์ž‘์—…]์ด ํ•„์š”

public class NetworkClient implements InitializingBean, DisposableBean {
  private String url;
  
  public NetworkClient() {
    System.out.println("์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = " + url); 
  }
  
  public void setUrl(String url) {
    this.url = url;
  }

  //์„œ๋น„์Šค ์‹œ์ž‘์‹œ ํ˜ธ์ถœ
  public void connect() {
    System.out.println("connect: " + url);
  }

  public void call(String message) {
    System.out.println("call: " + url + " message = " + message);
  }

  //์„œ๋น„์Šค ์ข…๋ฃŒ์‹œ ํ˜ธ์ถœ
  public void disConnect() {
    System.out.println("close + " + url);
  }
  
  @Override
  public void afterPropertiesSet() throws Exception {
    connect();
    call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
  }
  
  @Override
  public void destroy() throws Exception {
    disConnect();
  }
}

- InitializingBean ์€ afterPropertiesSet() ๋ฉ”์„œ๋“œ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค.

- DisposableBean ์€ destroy() ๋ฉ”์„œ๋“œ๋กœ ์†Œ๋ฉธ์„ ์ง€์›ํ•œ๋‹ค.

์ถœ๋ ฅ๊ฒฐ๊ณผ

์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = null
NetworkClient.afterPropertiesSet
connect: http://hello-spring.dev
call: http://hello-spring.dev message =
์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€
13:24:49.043 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.destroy
close + http://hello-spring.dev

 - ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๊ฐ€ ์ฃผ์ž… ์™„๋ฃŒ ํ›„ ์ ์ ˆํ•˜๊ฒŒ ํ˜ธ์ถœ ๋จ

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฃŒ๊ฐ€ ํ˜ธ์ถœ๋˜์ž ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋จ

 

[์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ์ธํ„ฐํŽ˜์ด์Šค ๋‹จ์ ]

- ์Šคํ”„๋ง ์ „์šฉ (์Šคํ”„๋ง ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด)

- ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

- ๋‚ด๊ฐ€ ์ฝ”๋“œ ๊ณ ์น ์ˆ˜์—†๋Š” ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ์šฉ ๋ถˆ๊ฐ€

 

์ฐธ๊ณ ) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”,์ข…๋ฃŒ ๋ฐฉ๋ฒ•์€ ์Šคํ”„๋ง ์ดˆ์ฐฝ๊ธฐ ๋ฐฉ๋ฒ• / ์ง€๊ธˆ์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด ๊ฑฐ์˜ ์‚ฌ์šฉ X


3. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์› 2 - ๋นˆ ๋“ฑ๋ก ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ์ง€์ •

- ์„ค์ • ์ •๋ณด์— @Bean(initMethod = "init", destroyMethod = "close") ์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ค์ • ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

public class NetworkClient {
  private String url;
  
  public NetworkClient() {
    System.out.println("์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = " + url); 
  }
  
  public void setUrl(String url) {
    this.url = url;
  }
  
  //์„œ๋น„์Šค ์‹œ์ž‘์‹œ ํ˜ธ์ถœ
  public void connect() {
    System.out.println("connect: " + url);
  }

  public void call(String message) {
    System.out.println("call: " + url + " message = " + message);
  }
  
  //์„œ๋น„์Šค ์ข…๋ฃŒ์‹œ ํ˜ธ์ถœ
  public void disConnect() {
    System.out.println("close + " + url);
  }

  public void init() { System.out.println("NetworkClient.init"); connect();
    call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
  }

  public void close() {
    System.out.println("NetworkClient.close");
    disConnect();
  }
}

์„ค์ • ์ •๋ณด์— ์ดˆ๊ธฐํ™” ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ์ง€์ •

@Configuration
static class LifeCycleConfig {
  @Bean(initMethod = "init", destroyMethod = "close")
  public NetworkClient networkClient() {
    NetworkClient networkClient = new NetworkClient();
    networkClient.setUrl("http://hello-spring.dev");
    return networkClient;
  } 
}

 

์„ค์ • ์ •๋ณด ์‚ฌ์šฉ ํŠน์ง•

1) ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
2) ์Šคํ”„๋ง ๋นˆ์ด ์Šคํ”„๋ง ์ฝ”๋“œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.
3) ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ • ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

์ข…๋ฃŒ ๋ฉ”์„œ๋“œ ์ถ”๋ก 

- @Bean์˜ destroyMethod ์†์„ฑ์—๋Š” ์•„์ฃผ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.
- ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ close , shutdown ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
- @Bean
์˜ destroyMethod ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด (inferred) (์ถ”๋ก )์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค.
- ์ด ์ถ”๋ก  ๊ธฐ๋Šฅ์€ close , shutdown ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ด์ค€๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๋ก ํ•ด์„œ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
- ๋”ฐ๋ผ์„œ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๋Š” ๋”ฐ๋กœ ์ ์–ด์ฃผ์ง€ ์•Š์•„๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค.
- ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹ซ์œผ๋ฉด destroyMethod="" ์ฒ˜๋Ÿผ ๋นˆ ๊ณต๋ฐฑ์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

4. ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์› 3 - @PostConstruct, @PreDestroy

- ์ด๊ฑฐ ์‚ฌ์šฉํ•˜๋ฉด ๋จ!!!

public class NetworkClient {
  private String url;
  
  public NetworkClient() {
    System.out.println("์ƒ์„ฑ์ž ํ˜ธ์ถœ, url = " + url); 
  }
  
  public void setUrl(String url) {
    this.url = url;
  }
  
  //์„œ๋น„์Šค ์‹œ์ž‘์‹œ ํ˜ธ์ถœ
  public void connect() {
    System.out.println("connect: " + url);
  }

  public void call(String message) {
    System.out.println("call: " + url + " message = " + message);
  }

  //์„œ๋น„์Šค ์ข…๋ฃŒ์‹œ ํ˜ธ์ถœ
  public void disConnect() {
    System.out.println("close + " + url);
  }
  
  @PostConstruct
  public void init() {
    System.out.println("NetworkClient.init"); connect();
    call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์‹œ์ง€");
  }
  
  @PreDestroy
  public void close() {
    System.out.println("NetworkClient.close");
    disConnect();
  }
}

 

@Configuration
static class LifeCycleConfig {
  @Bean
  public NetworkClient networkClient() {
    NetworkClient networkClient = new NetworkClient();
    networkClient.setUrl("http://hello-spring.dev");
    return networkClient;
  } 
}

javax.annotaion.PostConstruct

javax.annotaion.PreDestroy

-> javax ์‹œ์ž‘ํ•˜๋ฉด ์ž๋ฐ” ์ง„์˜์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ง€์›

 

@PostConstruct, @PreDestroy ์• ๋…ธํ…Œ์ด์…˜ ํŠน์ง•

- ์ตœ์‹  ์Šคํ”„๋ง์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
- ์• ๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋งŒ ๋ถ™์ด๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค.
- ํŒจํ‚ค์ง€๋ฅผ ์ž˜ ๋ณด๋ฉด javax.annotation.PostConstruct ์ด๋‹ค.
  ์Šคํ”„๋ง์— ์ข…์†์ ์ธ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ JSR-250 ๋ผ๋Š” ์ž๋ฐ” ํ‘œ์ค€์ด๋‹ค.
  ๋”ฐ๋ผ์„œ ์Šคํ”„๋ง์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ๋™์ž‘ํ•œ๋‹ค.

- ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž˜ ์–ด์šธ๋ฆฐ๋‹ค.
- ์œ ์ผํ•œ ๋‹จ์ ์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒ ํ•ด์•ผ ํ•˜๋ฉด @Bean์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ž.

 

์ •๋ฆฌ

@PostConstruct, @PreDestroy ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์ž
์ฝ”๋“œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋ฉด @Bean ์˜ initMethod , destroyMethod ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ