[Spring] 핡심 원리 κΈ°λ³Έ (9) - 빈 μŠ€μ½”ν”„

2022. 3. 15. 21:04Β·Spring

πŸ“Œ λΉˆ μŠ€μ½”ν”„

기본적으둜 μŠ€ν”„λ§ λΉˆμ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹œ ν•¨κ»˜ μƒμ„±λ˜μ–΄ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€. 이것은 μŠ€ν”„λ§ 빈이 기본적으둜 싱글톀 μŠ€μ½”ν”„λ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. μŠ€μ½”ν”„λŠ” 빈이 μ‘΄μž¬ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λœ»ν•œλ‹€.

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

→ μŠ€μ½”ν”„λŠ” ν΄λž˜μŠ€μ— @Scope("prototype")κ³Ό 같이 μ• λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ£Όμ–΄ μ§€μ •ν•  수 μžˆλ‹€.

 

πŸ“Œ ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„

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

 

  • ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„ λΉˆμ„ μ‘°νšŒν•˜λ©΄ 항상 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ λ°˜ν™˜λœλ‹€.

→ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… λΉˆμ„ μƒμ„±ν•˜κ³  μ˜μ‘΄κ΄€κ³„ μ£Όμž…, μ΄ˆκΈ°ν™”κΉŒμ§€λ§Œ μ²˜λ¦¬ν•œλ‹€. λΉˆμ„ λ°˜ν™˜ν•œ 후에 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 더 이상 ν”„λ‘œν† νƒ€μž… λΉˆμ„ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ”λ‹€. ν”„λ‘œν† νƒ€μž… λΉˆμ„ 관리할 μ±…μž„μ€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μžˆλ‹€. κ·Έλž˜μ„œ @PreDestroy 같은 μ’…λ£Œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 직접 μ’…λ£Œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

πŸ“Œ ν”„λ‘œν† νƒ€μž… 빈과 싱글톀 λΉˆμ„ ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ 문제점

  • clientBeanμ΄λΌλŠ” 싱글톀 λΉˆμ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ„ 톡해 ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ£Όμž…λ°›μ•„ μ‚¬μš©ν•œλ‹€.
  • clientBean은 보톡 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 μ‹œμ μ— ν•¨κ»˜ μƒμ„±λ˜κ³  μ˜μ‘΄κ΄€κ³„ μ£Όμž…λ„ λ°œμƒν•œλ‹€.
  • μ£Όμž… μ‹œμ μ— μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— ν”„λ‘œν† νƒ€μž… λΉˆμ„ μš”μ²­ν•˜κ³  λ°˜ν™˜ 받은 ν”„λ‘œν† νƒ€μž… λΉˆμ„ λ‚΄λΆ€ ν•„λ“œμ— λ³΄κ΄€ν•œλ‹€.
  • 이제 clientBean이 λ³΄κ΄€ν•˜κ³  μžˆλŠ” ν”„λ‘œν† νƒ€μž… λΉˆμ„ κ°€μ Έμ˜€λ©΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ λ°˜ν™˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 싱글톀 빈 생성 μ‹œμ μ— μ£Όμž…λœ ν”„λ‘œν† νƒ€μž… λΉˆμ„ κ°€μ Έμ˜€λŠ” 것이기 λ•Œλ¬Έμ— μƒˆλ‘œ μƒμ„±λ˜μ§€ μ•Šκ³  같은 μΈμŠ€ν„΄μŠ€κ°€ λ°˜ν™˜λœλ‹€.

→ ν•˜μ§€λ§Œ μš°λ¦¬κ°€ μ›ν•˜λŠ” 것은 ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ ν”„λ‘œν† νƒ€μž… 빈이 μƒˆλ‘œ μƒμ„±λ˜λŠ” 것이닀. 

 

πŸ“Œ ν”„λ‘œν† νƒ€μž… 빈과 싱글톀 λΉˆμ„ ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ 문제 ν•΄κ²°

κ°€μž₯ μ‰¬μš΄ 방법은 싱글톀 빈이 ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•  λ–„λ§ˆλ‹€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μƒˆλ‘œ μš”μ²­ν•˜λŠ” 것이닀.

static class ClientBean {

    @Autowired
    private ApplicationContext ac;

    public int logic() {
		PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class);
		prototypeBean.addCount();
		int count = prototypeBean.getCount();
		return count;
 	}
	...
 }
  • μ΄λ ‡κ²Œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ™ΈλΆ€μ—μ„œ μ£Όμž…λ°›λŠ”κ²Œ μ•„λ‹ˆλΌ ν•„μš”ν•œ μ˜μ‘΄κ΄€κ³„λ₯Ό 직접 μ°ΎλŠ” 것을 Dependency Lookup(DL)이라고 ν•œλ‹€.
  • ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 전체λ₯Ό μ£Όμž…λ°›κ²Œ 되면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 쒅속적인 μ½”λ“œκ°€ 되고, λ‹¨μœ„ ν…ŒμŠ€νŠΈλ„ μ–΄λ €μ›Œμ§„λ‹€.

 

βœ… ObjectProvider

@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;

public int logic() {
	PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
	prototypeBean.addCount();
	int count = prototypeBean.getCount();
	return count;
}
  • ObjectProviderλŠ” μ§€μ •ν•œ λΉˆμ„ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ°Ύμ•„μ£ΌλŠ” λŒ€μ‹  DL μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.
  • prototypeBeanProvider.getObject()λ₯Ό 톡해 항상 μƒˆλ‘œμš΄ ν”„λ‘œν† νƒ€μž… 빈이 μƒμ„±λœλ‹€.
  • μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€λ§Œ (μŠ€ν”„λ§μ— 의쑴), κΈ°λŠ₯이 λ‹¨μˆœν•˜λ―€λ‘œ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€κ±°λ‚˜ mock μ½”λ“œλ₯Ό λ§Œλ“€κΈ°λŠ” 훨씬 μ‰¬μ›Œμ§„λ‹€.

 

βœ… JSR-330 Provider

//implementation 'javax.inject:javax.inject:1' gradle μΆ”κ°€ ν•„μˆ˜
@Autowired
private Provider<PrototypeBean> provider;

public int logic() {
	PrototypeBean prototypeBean = provider.get();
	prototypeBean.addCount();
	int count = prototypeBean.getCount();
	return count;
}
  • μžλ°” ν‘œμ€€ 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀.
  • get() λ©”μ„œλ“œ ν•˜λ‚˜λ₯Ό μ œκ³΅ν•˜μ—¬ κΈ°λŠ₯이 맀우 λ‹¨μˆœν•˜λ‹€.
  • κΈ°λŠ₯이 λ‹¨μˆœν•˜λ―€λ‘œ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€κ±°λ‚˜ mock μ½”λ“œλ₯Ό λ§Œλ“€κΈ° 쉽닀.
  • λ³„λ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν•„μš”ν•˜λ‹€.
  • μžλ°” ν‘œμ€€μ΄λ―€λ‘œ μŠ€ν”„λ§μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

πŸ“Œ μ •리

  • 맀번 μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλœ μƒˆλ‘œμš΄ 객체가 ν•„μš”ν•  λ•Œ μ‚¬μš©
  • μ‹€λ¬΄μ—μ„œλŠ” 싱글톀 빈으둜 λŒ€λΆ€λΆ„μ˜ 문제λ₯Ό ν•΄κ²°ν•  수 있기 λ•Œλ¬Έμ— ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 일은 맀우 λ“œλ¬Όλ‹€.
  • ObjectProvider, JSR330 Provider 등은 ν”„λ‘œν† νƒ€μž… 뿐만 μ•„λ‹ˆλΌ DL이 ν•„μš”ν•œ κ²½μš°λŠ” μ–Έμ œλ“ μ§€ μ‚¬μš©ν•  수 μžˆλ‹€.

 

πŸ“Œ μ›Ή μŠ€μ½”ν”„

  • μ›Ή ν™˜κ²½μ—μ„œλ§Œ λ™μž‘
  • ν”„λ‘œν† νƒ€μž…κ³Ό λ‹€λ₯΄κ²Œ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ’…λ£Œ μ‹œμ κΉŒμ§€ 관리함. λ”°λΌμ„œ μ’…λ£Œ λ©”μ„œλ“œ 호좜
  • request μŠ€μ½”ν”„ λΉˆμ€ HTTP μš”μ²­ λ‹Ή ν•˜λ‚˜μ”© μƒμ„±λ˜κ³ , μš”μ²­μ΄ λλ‚˜λŠ” μ‹œμ μ— μ†Œλ©Έλ¨
  • @Scope(value = "request")둜 μ§€μ •

 

πŸ“Œ ν”„λ‘μ‹œ 방식 μ‚¬μš©ν•˜κΈ°

  • @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” CGLIBλΌλŠ” λ°”μ΄νŠΈμ½”λ“œ μ‘°μž‘ν•˜λŠ” 라이브러리λ₯Ό μ‚¬μš©ν•΄ MyLoggerλ₯Ό 상속받은 κ°€μ§œ ν”„λ‘μ‹œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—λŠ” ν”„λ‘μ‹œ 객체가 λ“±λ‘λ˜κ³ , μš”μ²­(request)이 였면 κ·Έλ•Œ μ§„μ§œ λΉˆμ„ μš”μ²­ν•˜λŠ” μœ„μž„ 둜직이 λ“€μ–΄μžˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ logic() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” ν”„λ‘μ‹œ 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  ν”„λ‘μ‹œ κ°μ²΄λŠ” request μŠ€μ½”ν”„μ˜ μ§„μ§œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.  

 

βœ… νŠΉμ§•

  • 핡심 μ•„μ΄λ””μ–΄λŠ” μ§„μ§œ 객체 쑰회λ₯Ό κΌ­ ν•„μš”ν•œ μ‹œμ κΉŒμ§€ μ§€μ—°μ²˜λ¦¬ ν•  수 μžˆλ‹€λŠ” 것이닀.
  • 단지 μ• λ…Έν…Œμ΄μ…˜ μ„€μ • λ³€κ²½λ§ŒμœΌλ‘œ 원본 객체λ₯Ό ν”„λ‘μ‹œ 객체둜 λŒ€μ²΄ν•  수 μžˆλ‹€.
  • λ¬΄λΆ„λ³„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆμœΌλ‹ˆ κΌ­ ν•„μš”ν•œ κ³³μ—μ„œ μ΅œμ†Œν™”ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 


κ°•μ˜ 링크

 

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

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

www.inflearn.com

 

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Spring] MVC 1편 (1) - μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이해  (0) 2022.03.28
[Spring] 핡심 원리 κΈ°λ³Έ (8) - 빈 생λͺ…μ£ΌκΈ° 콜백  (0) 2022.03.14
[Spring] 핡심 원리 κΈ°λ³Έ (7) - 의쑴 관계 μžλ™ μ£Όμž…  (0) 2022.03.13
'Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Spring] MVC 1편 (2) - μ„œλΈ”λ¦Ώ
  • [Spring] MVC 1편 (1) - μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이해
  • [Spring] 핡심 원리 κΈ°λ³Έ (8) - 빈 생λͺ…μ£ΌκΈ° 콜백
  • [Spring] 핡심 원리 κΈ°λ³Έ (7) - 의쑴 관계 μžλ™ μ£Όμž…
Sue
Sue
개발 곡뢀 둜그
  • Sue
    Sue's devlog
    Sue
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 κΈ€

  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
Sue
[Spring] 핡심 원리 κΈ°λ³Έ (9) - 빈 μŠ€μ½”ν”„
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”