Spring

Spring ํ•ต์‹ฌ์›๋ฆฌ-๊ธฐ๋ณธ[ ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ]

DAHLIA CHOI 2021. 7. 17. 02:22

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€์ด๋‚˜, ๋„คํŠธ์›Œํฌ ์†Œ์บฃ์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ํ•ด๋‘๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ์ ์— ์—ฐ๊ฒฐ์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋ ค๋ฉด ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

 

[ ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฒคํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด (์‹ฑ๊ธ€ํ†ค์ผ ๋•Œ) ]

  1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
  2. ์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ
  3. ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…
  4. ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ (๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ , ๋นˆ์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ)
  5. ์‚ฌ์šฉ
  6. ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ (๋นˆ์ด ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ)
  7. ์Šคํ”„๋ง ์ข…๋ฃŒ

โœ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜ ์ •๋ณด๋Š” ๋ฐ›๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๋ฐ˜๋ฉด์— ์ดˆ๊ธฐํ™”๋Š” ์ƒ์„ฑ๋œ ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ ์™ธ๋ถ€ ์ปค๋„ฅ์…˜์— ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ƒ์„ฑ์ž ์•ˆ์—์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์€ ์œ ์ง€๋ณด์ˆ˜๋ฉด์—์„œ ์ข‹์ง€ ์•Š๋‹ค.


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

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

 

[ ์ธํ„ฐํŽ˜์ด์Šค (InitializingBean, DisposableBean) ]

public class NetworkClient implements InitializingBean, DisposableBean {

    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);
    }

	@Override
    public void afterPropertiesSet() throws Exception{
        System.out.println("NetworkClient.afterPropertiesSet");
        connect();
        call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์„ธ์ง€");
    } //์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋๋‚˜๋ฉด ํ˜ธ์ถœํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋œป

    @Override
    public void destory() throws Exception{
        System.out.println("NetworkClient.destory");
        disconnect();
    } //bean์ด ์ข…๋ฃŒ๋ ๋•Œ ํ˜ธ์ถœ
}

InitializingBean, DisposableBean ์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ ์ดˆ๊ธฐํ™”์™€ ์†Œ๋ฉธ์„ ์ง€์›ํ•œ๋‹ค.

 

๐Ÿ‘‰๋‹จ์ 

  • ์Šคํ”„๋ง ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์— ์˜์กดํ•œ๋‹ค.
  • ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ง€๊ธˆ์€ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

[ ์„ค์ • ์ •๋ณด์— ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ, ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ ์ง€์ • ]

    public void init(){
        System.out.println("NetworkClient.init");
        connect();
        call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์„ธ์ง€");
    } //์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋๋‚˜๋ฉด ํ˜ธ์ถœํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋œป

    public void close() {
        System.out.println("NetworkClient.close");
        disconnect();
    } //bean์ด ์ข…๋ฃŒ๋ ๋•Œ ํ˜ธ์ถœ

์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ , ์„ค์ •์ •๋ณด์— ์ดˆ๊ธฐํ™”์™€ ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

@Bean(initMethod = "init", destroyMethod = "close")

๐Ÿ‘‰ ํŠน์ง•

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

 

[ @PostConstruct, @PreConstruct ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ ]

์ตœ๊ทผ์—๋Š” ์ด ๋ฐฉ๋ฒ•์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ์ € ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ์— ๊ฐ๊ฐ @PostConstruct, @PreDestroy์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

    @PostConstruct
    public void init(){
        System.out.println("NetworkClient.init");
        connect();
        call("์ดˆ๊ธฐํ™” ์—ฐ๊ฒฐ ๋ฉ”์„ธ์ง€");
    } //์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋๋‚˜๋ฉด ํ˜ธ์ถœํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋œป

    @PreDestroy
    public void close() {
        System.out.println("NetworkClient.close");
        disconnect();
    } //bean์ด ์ข…๋ฃŒ๋ ๋•Œ ํ˜ธ์ถœ

์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด ๋!!

๋ฌผ๋ก  ์„ค์ •์ •๋ณด์—๋Š” ๊ทธ๋ƒฅ @Bean์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

 

๐Ÿ‘‰ํŠน์ง•

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

๐Ÿ‘‰๋‹จ์ 

  • ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒํ•˜๋ ค๋ฉด @Bean์˜ initMethod, destroyMethod๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 


์Šคํ”„๋ง์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ, ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ, ์ข…๋ฃŒํ•˜๋Š” ์‹œ์ ์„ ๋ˆˆ์œผ๋กœ ์ง์ ‘ํ™•์ธํ•˜๊ฒŒ ๋˜๋‹ˆ ๋„ˆ๋ฌด ์‹ ๊ธฐํ–ˆ๋‹ค.

ํ™•์‹คํžˆ ์˜ˆ์ „๋ฐฉ๋ฒ•์ด ๋” ์–ด๋ ต๊ณ  ๋ณต์žกํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์‚ฌ์‹ค ์ด ๋ฐฉ๋ฒ•์„ ์–ด๋””์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€๋Š” ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ผ๋ฅธ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๋ฉด์„œ ๋” ์ดํ•ดํ•˜๊ณ  ์‹ถ๋‹ค.

์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ์›๋ฆฌ ๊ธฐ๋ณธํŽธ์„ ๋“ฃ๊ณ  ์ž‘์„ฑ๋œ ๋ณต์Šต ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.