๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์—”๋“œ/Spring boot

Spring Boot์—์„œ Bean ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ดˆ๊ธฐํ™” ๋ฐ ์†Œ๋ฉธ ๊ณผ์ •

by sh119 2025. 3. 10.

๋ชฉ์ฐจ

  • ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ์ฃผ์š”๋‹จ๊ณ„
  • Bean ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•
  • Bean ์†Œ๋ฉธ ๊ณผ์ •

โœ… ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ์ฃผ์š” ๋‹จ๊ณ„

  1. ๊ฐ์ฒด ์ƒ์„ฑ -> @Component, @Bean๋“ฑ์„ ํ†ตํ•ด Bean ์ƒ์„ฑ
  2. ์˜์กด์„ฑ ์ฃผ์ž… (DI, Dependency Injection) -> ํ•„์š”ํ•œ ์˜์กด์„ฑ์ด ์ฃผ์ž…๋จ
  3. ์ดˆ๊ธฐํ™” ๊ณผ์ • -> @PostConstruct, InitializingBean, init-method ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ์„ค์ • ์ˆ˜ํ–‰
  4. ์‚ฌ์šฉ(Usage) -> ์ •์ƒ์ ์œผ๋กœ ๋นˆ์ด ์‚ฌ์šฉ๋จ
  5. ์†Œ๋ฉธ(Destruction) -> @PreDestroy, DisposableBean, destroy-method ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ฆฌ ์ž‘์—… ์ˆ˜ํ–‰
  6. Garbage Collection -> Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋” ์ด์ƒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด GC๋Œ€์ƒ์ด ๋จ 

 

โœ… Bean ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•

1๏ธโƒฃ @PostConstruct (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ)

@Component
public class MyBean {
    @PostConstruct
    public void init() {
        System.out.println("MyBean์ด ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
    }
}
  • Bean์ด ์ƒ์„ฑ๋œ ํ›„ ์ž๋™์œผ๋กœ ์‹คํ–‰๋จ
  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ @Component, @Service, @Repository๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๊ฐ€๋Šฅ

 

2๏ธโƒฃ InitializingBean ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

@Component
public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
        System.out.println("MyBean ์ดˆ๊ธฐํ™” - afterPropertiesSet ์‹คํ–‰๋จ!");
    }
}
  • afterPropertiesSet() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์ •์˜
  • Spring ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋ผ์„œ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ

 

3๏ธโƒฃ @Bean ๋“ฑ๋ก์‹œ initMethod ์ง€์ •

@Bean(initMethod = "init")
public MyBean myBean() {
    return new MyBean();
}
  • @Bean๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋กํ•  ๋•Œ ์ง์ ‘ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ์ง€์ • ๊ฐ€๋Šฅ

 

โœ… Bean ์†Œ๋ฉธ(Destroy) ๊ณผ์ •

* Spring Boot์—์„œ๋Š” Bean์ด ์ œ๊ฑฐ๋  ๋•Œ ๋ฆฌ์†Œ์Šค ํ•ด์ œ์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. *

1๏ธโƒฃ @PreDestroy(๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ)

@Component
public class MyBean {
    @PreDestroy
    public void destroy() {
        System.out.println("MyBean์ด ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค!");
    }
}
  • Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ApplicaionContext.close() ์ด ์‹คํ–‰๋จ

 

2๏ธโƒฃ DisposableBean ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

@Component
public class MyBean implements DisposableBean {
    @Override
    public void destroy() {
        System.out.println("MyBean ์†Œ๋ฉธ - destroy ์‹คํ–‰๋จ!");
    }
}
  • destory() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ ๊ฐ€๋Šฅ

 

3๏ธโƒฃ @Bean๋“ฑ๋ก์‹œ destroyMethod ์ง€์ •

@Bean(destroyMethod = "cleanup")
public MyBean myBean() {
    return new MyBean();
}
  • ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ๋ฉธ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •๊ฐ€๋Šฅ

 

 

๐Ÿ’ก ๊ฒฐ๋ก  :

  • Spring Boot์—์„œ๋Š” Bean์ด ์ƒ์„ฑ๋˜๊ณ  ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€์˜ ํ๋ฆ„์„ ์ƒ๋ช…์ฃผ๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค.
  • Bean์€ ์ƒ์„ฑ -> ์˜์กด์„ฑ ์ฃผ์ž… -> ์ดˆ๊ธฐํ™” -> ์‚ฌ์šฉ -> ์†Œ๋ฉธ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.
  • Spring์ด Bean ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ์ฒด ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • @PostConstruct(์ƒ์„ฑ ๊ณผ์ •)์™€ @PreDestroy(์†Œ๋ฉธ ๊ณผ์ •)๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • InitializingBean๊ณผ DisposableBean์€ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ ธ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • @Bean(initMethod, detroyMethod)๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™” ๋˜๋Š” ์†Œ๋ฉธ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.