nyximos.log

[Spring] 빈 μŠ€μ½”ν”„ λ³Έλ¬Έ

Programming/Spring

[Spring] 빈 μŠ€μ½”ν”„

nyximos 2022. 1. 27. 21:11

πŸ€” 빈 μŠ€μ½”ν”„λž€?

빈이 μ‘΄μž¬ν•  수 μžˆλŠ” λ²”μœ„

  • 싱글톀 :  κΈ°λ³Έ μŠ€μ½”ν”„, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό μ’…λ£ŒκΉŒμ§€ μœ μ§€λ˜λŠ” κ°€μž₯ 넓은 λ²”μœ„μ˜ μŠ€μ½”ν”„μ΄λ‹€.
  • ν”„λ‘œν† νƒ€μž… : ν”„λ‘œν† νƒ€μž… 빈의 생성+μ˜μ‘΄κ΄€κ³„ μ£Όμž…κΉŒμ§€λ§Œ κ΄€μ—¬ν•˜λŠ” 맀우 짧은 λ²”μœ„μ˜ μŠ€μ½”ν”„μ΄λ‹€.
  • μ›Ή κ΄€λ ¨ μŠ€μ½”ν”„
    • request : μ›Ή μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆλ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.
    • session : μ›Ή μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.
    • application : μ›Ή μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈμ™€ 같은 λ²”μœ„λ‘œ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.

빈 μŠ€μ½”ν”„ 지정방식

1. μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” μžλ™ 등둝

@Scope("prototype")
@Component
public class HelloBean{}

2. μˆ˜λ™ 등둝

@Scope("prototype")
@Bean
PrototypeBean HelloBean(){
	return new HelloBean();
}

 

 

πŸ‘©‍πŸ”¬ ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ”

싱글톀 μŠ€μ½”ν”„μ˜ λΉˆμ„ μ‘°νšŒν•  λ•Œ 항상 같은 μΈμŠ€ν„΄μŠ€μ˜ μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜ν•œλ‹€.

ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„λ₯Ό μ‘°νšŒν•  λ•ŒλŠ” 항상 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해 λ°˜ν™˜ν•œλ‹€.

 

πŸ“ž 싱글톀 빈 μš”μ²­

  1. 싱글톀 μŠ€μ½”ν”„μ˜ λΉˆμ„ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μš”μ²­
  2. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 본인이 κ΄€λ¦¬ν•˜λŠ” μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜
  3. 이후 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 같은 μš”μ²­μ΄ 와도 같은 객체 μΈμŠ€ν„΄μŠ€μ˜ μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜

 

πŸ“ž ν”„λ‘œν† νƒ€μž… 빈 μš”μ²­

  1. ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„μ˜ λΉˆμ„ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μš”μ²­
  2. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ ν”„λ‘œν† νƒ€μž… 빈 생성 + ν•„μš”ν•œ μ˜μ‘΄κ΄€κ³„ μ£Όμž…
  3. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” μƒμ„±ν•œ ν”„λ‘œν† νƒ€μž… λΉˆμ„ ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜
  4. 이후 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 같은 μš”μ²­μ΄ 였면 항상 μƒˆλ‘œμš΄ ν”„λ‘œν† νƒ€μž… λΉˆμ„ μƒμ„±ν•΄μ„œ λ°˜ν™˜

 

🚒 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ

πŸ™†‍♀️ ν”„λ‘œν† νƒ€μž… 빈 생성, μ˜μ‘΄κ΄€κ³„ μ£Όμž…, μ΄ˆκΈ°ν™”κΉŒμ§€ 처리

πŸ™…‍♀️ μƒμ„±λœ ν”„λ‘œν† νƒ€μž… 빈 관리

 

→ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν”„λ‘œν† νƒ€μž… λΉˆμ„ κ΄€λ¦¬ν•œλ‹€.

    @PreDestroy 같은 μ’…λ£Œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

 

 

🀷‍♀️ ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„ - 싱글톀 빈과 ν•¨κ»˜ μ‚¬μš©μ‹œ 문제점

ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„μ˜ λΉˆμ„ 싱글톀 빈과 ν•¨κ»˜ μ‚¬μš©ν•  λ•ŒλŠ” μ˜λ„ν•œ λŒ€λ‘œ 잘 λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

μŠ€ν”„λ§μ€ 일반적으둜 싱글톀 λΉˆμ„ μ‚¬μš©ν•˜λ―€λ‘œ 싱글톀 빈이 ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.

ν”„λ‘œν† νƒ€μž… 빈이 μƒˆλ‘œ 생성이 되긴 ν•˜μ§€λ§Œ 싱글톀 빈과 ν•¨κ»˜ 계속 μœ μ§€λœλ‹€.

(과거에  싱글톀 빈 μƒμ„±μ‹œμ μ— μ£Όμž…μ΄ λλ‚œ ν”„λ‘œν† νƒ€μž… λΉˆμ„ 가지고 μžˆμ–΄μ„œ)

μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ±° μ•„λ‹˜πŸ˜΅

 

πŸ™Ž‍♀️ ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„ - 싱글톀 빈과 ν•¨κ»˜ μ‚¬μš©μ‹œ Provider둜 문제 ν•΄κ²°

 

😎 DL Dependency Lookup

μ˜μ‘΄κ΄€κ³„ 쑰회(탐색)

DI와 λ‹€λ₯΄κ²Œ 직접 ν•„μš”ν•œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ°ΎλŠ” 것

 

μ§€μ •ν•œ ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ»¨ν…Œμ΄λ„ˆμ—μ„œ λŒ€μ‹  μ°Ύμ•„μ£ΌλŠ” DL κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 게 ν•„μš”ν•˜λ‹€ !

 

ObjectFactory, ObjectProvider

μ§€μ •ν•œ λΉˆμ„ μ»¨ν…Œμ΄λ„ˆκ°€ λŒ€μ‹  μ°Ύμ•„μ£ΌλŠ” DL κΈ°λŠ₯ 제곡

ObjectProvider : ObjectFactory+편의기λŠ₯ μΆ”κ°€

μŠ€ν”„λ§ μ™Έμ˜ μ˜μ‘΄κ΄€κ³„ μΆ”κ°€(라이브러리 μΆ”κ°€) ν•„μš” μ—†μ–΄μ„œ 편리, μŠ€ν”„λ§μ— 의쑴

 

prototypeBeanProviderλ₯Ό 생성후

prototypeBeanProvider.getObject()둜 μƒˆλ‘œμš΄ ν”„λ‘œν† νƒ€μž… 빈 생성

ObjectProvider의 getObject() : μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 ν•΄λ‹Ή 빈 μ°Ύμ•„μ„œ λ°˜ν™˜

 

 

JSR-330 Provider

javax.inject.Provider

JSR-330 μžλ°” ν‘œμ€€ μ‚¬μš©

μ“°λ €λ©΄ javax.inject:javax.inject:1 라이브러리λ₯Ό gradle에 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

μŠ€ν”„λ§μ΄ μ•„λ‹Œ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ μžλ°” ν‘œμ€€ μ‚¬μš©

 

provider 생성후

provider.get() λ©”μ„œλ“œλ‘œ μƒˆλ‘œμš΄ ν”„λ‘œν† νƒ€μž… 빈 생성

provider의 get() : μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 ν•΄λ‹Ή 빈 μ°Ύμ•„μ„œ λ°˜ν™˜

 

 

 

🌏 μ›Ή μŠ€μ½”ν”„

μ›Ή ν™˜κ²½μ—μ„œλ§Œ λ™μž‘

μŠ€ν”„λ§μ΄ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ’…λ£Œ μ‹œμ κΉŒμ§€ κ΄€λ¦¬ν•΄μ€Œ

μ’…λ£Œ λ©”μ„œλ“œ 호좜됨

 

  • request : HTTP μš”μ²­μ΄ λ“€μ–΄μ™”λ‹€ λ‚˜κ°ˆλ•ŒκΉŒμ§€ μœ μ§€, HTTP μš”μ²­λ§ˆλ‹€ λ³„λ„μ˜ 빈 μΈμŠ€ν„΄μŠ€ 생성, 관리
  • session : HTTP Sessionκ³Ό λ™μΌν•œ 생λͺ…μ£ΌκΈ° κ°€μ§€λŠ” μŠ€μ½”ν”„
  • application : μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈ(ServletContext)와 λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” μŠ€μ½”ν”„
  • websocket : μ›Ή μ†ŒμΌ“κ³Ό λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” μŠ€μ½”ν”„

 

 

πŸ’ μŠ€μ½”ν”„μ™€ ν”„λ‘μ‹œ

CGLIB Code Generator Library

μ½”λ“œμƒμ„± 라이브러리둜 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‘°μž‘ν•΄μ„œ Proxy 객체λ₯Ό 생성해쀀닀고 ν•œλ‹€.

κΉƒν—ˆλΈŒλ₯Ό λ³΄λ‹ˆ 더 이상 μœ μ§€ 관리 λ˜μ§€ μ•Šκ³ , μ΅œμ‹  JDKμ—μ„œλŠ” μ œλŒ€λ‘œ μž‘λ™ ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€.

 

λ‚΄ 클래슀λ₯Ό 상속 받은 κ°€μ§œ ν”„λ‘μ‹œ 객체λ₯Ό λ§Œλ“€μ–΄μ„œ μ£Όμž…ν•œλ‹€.

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—λŠ” 같은 μ΄λ¦„μœΌλ‘œ $EnhancerBySpringCGLIBλΌλŠ” 클래슀둜 λ§Œλ“€μ–΄μ§„ κ°€μ§œ ν”„λ‘μ‹œ 객체가 λ“±λ‘λœλ‹€.ac.getBean으둜 μ‘°νšŒν•΄λ„ ν”„λ‘μ‹œ 객체가 μ‘°νšŒλœλ‹€.

 

κ°€μ§œ ν”„λ‘μ‹œ κ°μ²΄λŠ” μ‹€μ œ μš”μ²­μ΄ 였면 κ·Έλ•Œ λ‚΄λΆ€μ—μ„œ μ‹€μ œ λΉˆμ„ μš”μ²­ν•˜λŠ” μœ„μž„ 둜직이 λ“€μ–΄μžˆλ‹€.request μŠ€μ½”ν”„μ˜ μ§„μ§œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œλŠ” 원본인지 μ•„λ‹Œμ§€ λͺ¨λ₯΄κ²Œ λ™μž‘ν•œλ‹€.객체 쑰회λ₯Ό κΌ­ ν•„μš”ν•œ μ‹œμ ‘κΉŒμ§€ μ§€μ—°μ²˜λ¦¬ν•œλ‹€.

 

μ‹±κΈ€ν†€μ²˜λŸΌ λ™μž‘ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ―€λ‘œ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•  ν•„μš”κ°€ μžˆλ‹€.

 

 

 

μ°Έμ‘°

κΉ€μ˜ν•œ, μŠ€ν”„λ§ 핡심 원리 - 기본편 https://inf.run/ryWP

 

μŠ€ν”„λ§ 핡심 원리 - 기본편 - μΈν”„λŸ° | κ°•μ˜

μŠ€ν”„λ§ μž…λ¬Έμžκ°€ 예제λ₯Ό λ§Œλ“€μ–΄κ°€λ©΄μ„œ μŠ€ν”„λ§μ˜ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μŠ€ν”„λ§ κΈ°λ³ΈκΈ°λ₯Ό ν™•μ‹€νžˆ λ‹€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€., μŠ€ν”„λ§ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μ„±μž₯ν•˜λŠ” λ°±μ—”λ“œ κ°œλ°œμžκ°€ λ˜μ–΄λ³΄μ„Έμš”! πŸ“’

www.inflearn.com

 

https://github.com/cglib/cglib

 

GitHub - cglib/cglib: cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is use

cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept f...

github.com