(Spring) Bean 생λͺ…μ£ΌκΈ°

Spring

06/13/2021





μŠ€ν”„λ§ 빈의 이벀트 라이프사이클

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 β†’ μŠ€ν”„λ§ 빈 생성 β†’ μ˜μ‘΄κ΄€κ³„ μ£Όμž… β†’ μ΄ˆκΈ°ν™” 콜백 β†’ μ‚¬μš© β†’ μ†Œλ©Έ μ „ 콜백 β†’ μŠ€ν”„λ§ μ’…λ£Œ

  • μ΄ˆκΈ°ν™” 콜백 : 빈이 μƒμ„±λ˜κ³ , μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλœ ν›„ 호좜
  • μ†Œλ©Έμ „ 콜백 : μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜μ–΄ μ†Œλ©Έλ˜κ±°λ‚˜, 빈이 μ†Œλ©Έλ˜κΈ° 직전에 호좜

μŠ€ν”„λ§μ€ 3κ°€μ§€ λ°©λ²•μœΌλ‘œ 빈 생λͺ…μ£ΌκΈ° μ½œλ°±μ„ μ§€μ›ν•œλ‹€.

  • μΈν„°νŽ˜μ΄μŠ€ (InitializingBean, DisposableBean)
  • μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ, μ’…λ£Œ λ©”μ„œλ“œ μ§€μ •
  • μ–΄λ…Έν…Œμ΄μ…˜ 지원 (@PostConstruct, @PreDestroy)


객체의 생성과 μ΄ˆκΈ°ν™”μ˜ λΆ„λ¦¬λž€?

μŠ€ν”„λ§λΉˆλ„ 객체이기 λ•Œλ¬Έμ— μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•˜λ‹€. 주둜 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” μ‹œμ μ— μ–΄λ–€ μž‘μ—…μ„ ν•  λ•Œμ—λŠ” λŒ€λΆ€λΆ„ μƒμ„±μžμ—μ„œ 이루어진닀.

κ·ΈλŸ¬λ‚˜ μ™ΈλΆ€ 컀λ„₯μ…˜ μ—°κ²°(DB 컀λ„₯μ…˜, μ†ŒμΌ“ 톡신) λ“± 무거운 λ™μž‘μ„ μˆ˜ν–‰ν•  κ²½μš°λ§ˆλ‹€ μƒμ„±μž μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£ΌλŠ”κ²ƒμ€ λΉ„νš¨μœ¨ 적이닀.

λ•Œλ¬Έμ— 객체의 생성과 μ΄ˆκΈ°ν™”μž‘μ—…μ˜ 뢄리λ₯Ό ν†΅ν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것은 μƒμ„±μ—λ§Œ μ§‘μ€‘ν•˜κ³ , μ΄ˆκΈ°ν™”λŠ” μ΄ˆκΈ°ν™”μ—μ„œλ§Œ μž‘μ—…ν•˜λŠ” 것.







1. μΈν„°νŽ˜μ΄μŠ€ InitializingBean, DisposableBean 이용


JAVA
public class TestDao implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// 빈 μ΄ˆκΈ°ν™” μ‹œ μ½”λ“œ κ΅¬ν˜„
}
@Override
public void destroy() throws Exception {
// 빈 μ†Œλ©Έ μ‹œ μ½”λ“œ κ΅¬ν˜„
}
}

InitializingBean

  • afterPropertiesSet()

DisposableBean

  • destroy()

단점 )

  • μžλ°”ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€κ°€ μ•„λ‹ˆλΌ μŠ€ν”„λ§ μ „μš© μΈν„°νŽ˜μ΄μŠ€λΌμ„œ μŠ€ν”„λ§μ— 쒅속적이닀. μŠ€ν”„λ§ μ˜μ‘΄μ„±μ΄ 높아짐. (ν•˜μ§€λ§Œ implements둜 μ΄ˆκΈ°ν™”, μ†Œλ©Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ κ΅¬ν˜„ν•˜κ³  있기 λ•Œλ¬Έμ— μ’€ 더 μ§κ΄€μ μœΌλ‘œ 확인이 κ°€λŠ₯ν•˜κ³  νŽΈλ¦¬ν•΄μ„œ 아직 μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©λ°©λ²•μ„ μœ μ§€ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. )
  • μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ†Œλ“œμ˜ 이름을 λ³€κ²½ν•  수 μ—†λ‹€.
  • 직접 μ œμ–΄λ₯Ό ν•΄μ£Όμ–΄μ•Όν•˜λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ— μ μš©ν•  수 μ—†λ‹€.
  • ν˜„μž¬λŠ” 거의 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ°©λ²•μž„.

BUT




2. μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ, μ’…λ£Œ λ©”μ„œλ“œ μ§€μ •

μ„€μ • 정보에 λ‹€μŒκ³Ό 같이 μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•  수 μžˆλ‹€.

JAVA
@Bean(initMethod="init", destroyMethod = "close")
  • λ©”μ†Œλ“œ 이름을 자유둭게 쀄 수 μžˆλ‹€.
  • μŠ€ν”„λ§ 빈이 μŠ€ν”„λ§ μ½”λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μ½”λ“œκ°€ μ•„λ‹ˆλΌ μ„€μ • 정보λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ μ΄ˆκΈ°ν™”, μ’…λ£Œ λ©”μ†Œλ“œλ₯Ό μ μš©ν•  수 μžˆλ‹€.

μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”κ°€?

μ™ΈλΆ€λΌμ΄λΈŒλŸ¬λ¦¬λ₯Ό μ‚¬μš©ν•  μ‹œμ—λŠ” μ™ΈλΆ€ 라이브러리 λ‚΄λΆ€ μ½”λ“œλ₯Ό λ³€κ²½/μˆ˜μ • ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, μ΄ˆκΈ°ν™”/μ†Œλ©Έ λ©”μ„œλ“œ μ‚¬μš©μ— μ œμ•½μ΄ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ™Έμš°λΌμ΄λΈŒλŸ¬λ¦¬λ₯Ό ν˜ΈμΆœν•˜λŠ” λ‚΄λΆ€ μ†ŒμŠ€ ν΄λž˜μŠ€μ—μ„œ @Bean μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ΄ˆκΈ°ν™”/μ†Œλ©Έ λ©”μ„œλ“œλ₯Ό μ§€μ •ν•΄μ£Όκ³  μ‚¬μš©ν•˜λ©΄ λœλ‹€.


μ’…λ£Œ λ©”μ†Œλ“œ μΆ”λ‘ κΈ°λŠ₯

  • @Bean 은 μ’…λ£Œλ©”μ„œλ“œλ₯Ό λ”°λ‘œ μ§€μ •ν•˜μ§€ μ•Šμ„ μ‹œμ— μŠ€ν”„λ§μ΄ μ’…λ£Œλ©”μ„œλ“œλ₯Ό μΆ”λ‘ ν•΄μ„œ μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ€€λ‹€.
  • destroyMethod = "" 둜 ν•˜κ±°λ‚˜ 섀정을 μ•„μ˜ˆ ν•˜μ§€ μ•Šμ„ 경우 μΆ”λ‘ κΈ°λŠ₯이 μž‘λ™ν•œλ‹€.
  • λ“±λ‘λœ Bean μ•ˆμ— 일반적으둜 많이 μ“°μ΄λŠ” μ’…λ£Œ λ©”μ„œλ“œ 이름 (close, shutdown λ“±) 의 λ©”μ„œλ“œκ°€ 있으면 μŠ€ν”„λ§μ΄ μ’…λ£Œν•  λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ€Œ



3. @PostConstruct, @PreDestroy

μ΄ˆκΈ°ν™”μ™€ μ†Œλ©Έμ„ μ§€μ •ν•˜λŠ” 두 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•˜κ²Œ μ΄ˆκΈ°ν™”μ™€ μ’…λ£Œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.

  • μŠ€ν”„λ§μ— 쒅속적인 기술이 μ•„λ‹ˆλΌ μžλ°” ν‘œμ€€ κΈ°μˆ μž„. λ”°λΌμ„œ μŠ€ν”„λ§μ΄ μ•„λ‹Œ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ 잘 μž‘λ™.
  • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό 잘 μ–΄μšΈλ¦Ό (μ–΄λ–»κ²Œ 잘 μ–΄μšΈλ¦°λ‹€λŠ” κ±°μ§€?)
  • 단점 ) μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ μš©ν•˜μ§€ λͺ»ν•¨. μ΄λŸ΄λ•ŒλŠ” @Bean κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ 해결됨

  1. @PostConstruct
  • μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•  λ©”μ†Œλ“œμ— μ μš©λœλ‹€.
  • WASκ°€ λ„μ›Œμ§ˆ λ•Œ μ‹€ν–‰λœλ‹€. (객체가 μƒμ„±λ˜κ³  μ˜μ‘΄μ„± μ£Όμž…μ΄ 된 후에)
  1. @PreDestroy
  • μ»¨ν…Œμ΄λ„ˆμ—μ„œ 객체λ₯Ό μ œκ±°ν•˜κΈ° 전에 μ‹€ν–‰λœλ‹€.






μ°Έμ‘°

https://velog.io/@hellozin/μŠ€ν”„λ§-빈의-μƒμ„±μž-afterPropertiesSet-PostConstruct

https://velog.io/@hyungjungoo95/Spring-빈-생λͺ…μ£ΌκΈ°-콜백


WRITTEN BY

Keep It Simple, Stupid