Skip to content

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Latest commit

Β 

History

67 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Spring Core (핡심 기술)

객체 μ§€ν–₯ 섀계와 μŠ€ν”„λ§

μžλ°” μ§„μ˜μ˜ μΆ”μš΄ 겨울과 μŠ€ν”„λ§μ˜ 탄생

  • Java μ§„μ˜μ—μ„œ EJB(Enterprise Java Beans, = J2EE)λΌλŠ” ν‘œμ€€ 기술이 μžˆμ—ˆμŒ
  • μ—¬λŸ¬ κΈ°λŠ₯을 μ œκ³΅ν–ˆμ§€λ§Œ λΉ„μ‹Έκ³  μ–΄λ ΅κ³  λ³΅μž‘ν•˜κ³  λŠλ Έλ‹€ (ν•œλ§ˆλ””λ‘œ μ§€μ˜₯)
  • λ„ˆλ¬΄ EJB에 의쑴적이고 λ³΅μž‘ν•˜λ‹€λ³΄λ‹ˆ POJO(Plain Old Java Object)κ°€ λ‚˜μ˜€κΈ°λ„ ν•œλ‹€
  • κ³ ν†΅λ°›λ˜ μ„ λ°° κ°œλ°œμžλ“€μ΄ EJBλ₯Ό λΉ„νŒν•˜λ©° Spring, Hibernate 같은 것듀을 λ§Œλ“€μ–΄λƒ„

μŠ€ν”„λ§μ΄λž€?

  • ν•„μˆ˜
    • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬
    • μŠ€ν”„λ§ λΆ€νŠΈ
  • 선택
    • μŠ€ν”„λ§ 데이터
    • μŠ€ν”„λ§ μ„Έμ…˜
    • μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°
    • μŠ€ν”„λ§ Rest Docs
    • μŠ€ν”„λ§ 배치
    • μŠ€ν”„λ§ ν΄λΌμš°λ“œ...

β†’ 핡심은 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬κ³  이λ₯Ό μ‰½κ²Œ μ‚¬μš©ν• μˆ˜ 있게 ν•˜λŠ”κ²Œ μŠ€ν”„λ§ λΆ€νŠΈλ‹€

  • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬

    • 핡심 기술: μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ, AOP, 이벀트, 기타
    • μ›Ή 기술: μŠ€ν”„λ§ MVC, μŠ€ν”„λ§ WebFlux
    • 데이터 μ ‘κ·Ό 기술: νŠΈλžœμž­μ…˜, JDBC, ORM 지원, XML 지원
    • 기술 톡합: μΊμ‹œ, 이메일, 원격접근, μŠ€μΌ€μ€„λ§
    • ν…ŒμŠ€νŠΈ: μŠ€ν”„λ§ 기반 ν…ŒμŠ€νŠΈ 지원
    • μ–Έμ–΄: μ½”ν‹€λ¦°, 그루비
  • μŠ€ν”„λ§ λΆ€νŠΈ

    • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 지원, μ΅œκ·Όμ—λŠ” 기본으둜 μ‚¬μš©
    • λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ 생성
    • Tomcat 같은 μ›Ή μ„œλ²„λ₯Ό λ‚΄μž₯ν•΄μ„œ λ³„λ„μ˜ μ›Ή μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜μ§€ μ•Šμ•„λ„ 됨
    • μ†μ‰¬μš΄ λΉŒλ“œ ꡬ성을 μœ„ν•œ starter 쒅속성 제곡
    • μŠ€ν”„λ§κ³Ό 3rd parth(μ™ΈλΆ€) 라이브러리 μžλ™ ꡬ성 (μ™ΈλΆ€ 라이브러리 버전간 λ¬Έμ œκ°€ 없도둝됨)
    • λ©”νŠΈλ¦­, μƒνƒœν™•μΈ, μ™ΈλΆ€ ꡬ성 같은 ν”„λ‘œλ•μ…˜ μ€€λΉ„ κΈ°λŠ₯ 제곡
    • 관둀에 μ˜ν•œ κ°„κ²°ν•œ μ„€μ •
  • μŠ€ν”„λ§

    • μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ 기술
    • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬
    • μŠ€ν”„λ§ λΆ€νŠΈ, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 등을 λͺ¨λ‘ ν¬ν•¨ν•œ μŠ€ν”„λ§ μƒνƒœκ³„
  • μŠ€ν”„λ§μ˜ μ§„μ§œ 핡심

    • μŠ€ν”„λ§μ€ μžλ°” μ–Έμ–΄ 기반의 ν”„λ ˆμž„μ›Œν¬
    • μžλ°” μ–Έμ–΄μ˜ κ°€μž₯ 큰 νŠΉμ§• - 객체 μ§€ν–₯
    • μŠ€ν”„λ§μ€ 객체 μ§€ν–₯ μ–Έμ–΄κ°€ κ°€μ§„ κ°•λ ₯ν•œ νŠΉμ§•μ„ μ‚΄λ €λ‚΄λŠ” ν”„λ ˆμž„μ›Œν¬
    • μŠ€ν”„λ§μ€ 쒋은 객체 μ§€ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬

쒋은 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

  • 객체지ν–₯ νŠΉμ§•

    • 좔상화
    • μΊ‘μŠν™”
    • 상속
    • λ‹€ν˜•μ„± (μ—­ν• κ³Ό κ΅¬ν˜„)
  • κ°μ²΄λ“€μ˜ λͺ¨μž„, λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›μœΌλ©° ν˜‘λ ₯

  • μœ μ—°ν•˜κ³  변경에 용이

  • μžλ™μ°¨ 역할을 λ‹€λ₯Έ μžλ™μ°¨λ“€μ΄ λŒ€μ²΄

  • 둜미였, 쀄리엣 역할을 λ‹€λ₯Έ λ°°μš°λ“€μ΄ λŒ€μ²΄

  • μ—­ν• κ³Ό κ΅¬ν˜„μ„ 뢄리

    • μ—­ν• κ³Ό κ΅¬ν˜„μœΌλ‘œ κ΅¬λΆ„ν•˜λ©΄ λ‹¨μˆœν•΄μ§€κ³ , μœ μ—°ν•΄μ§€λ©° 변경도 νŽΈλ¦¬ν•΄μ§
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄λœλ‹€
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ λœλ‹€
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„λŒ€μƒμ„ 자체λ₯Ό 변경해도 영ν–₯ λ°›μ§€ μ•ŠλŠ”λ‹€
  • μžλ°” μ–Έμ–΄μ˜ λ‹€ν˜•μ„±μ„ ν™œμš©

    • μ—­ν•  = μΈν„°νŽ˜μ΄μŠ€
    • κ΅¬ν˜„ = μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀, κ΅¬ν˜„ 객체
    • 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리
    • 객체 μ„€κ³„μ‹œ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)λ₯Ό λ¨Όμ € λΆ€μ—¬ν•˜κ³  역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„κ°μ²΄ λ§Œλ“€κΈ°
  • 혼자 μžˆλŠ” κ°μ²΄λŠ” μ—†λ‹€

  • 수 λ§Žμ€ 객체 ν΄λΌμ΄μ–ΈνŠΈμ™€ 객체 μ„œλ²„λŠ” μ„œλ‘œ ν˜‘λ ₯ 관계λ₯Ό κ°€μ§„λ‹€

  • λ‹€ν˜•μ„±μ˜ 본질 (λ‹€ν˜•μ„±μ΄ κ°€μž₯ μ€‘μš”ν•˜λ‹€!)

    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€
    • λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ„ μ΄ν•΄ν•˜λ €λ©΄ ν˜‘λ ₯μ΄λΌλŠ” κ°μ²΄μ‚¬μ΄μ˜ κ΄€κ³„μ—μ„œ μ‹œμž‘ν•΄μ•Όν•¨
    • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ„œλ²„ κ΅¬ν˜„ κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€
  • usb a, usb c, λ³€ν™˜ 젠더λ₯Ό λΉ„μœ ν•΄μ„œ 객체지ν–₯ μ„€λͺ…

  • μŠ€ν”„λ§μ€ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄μ„œ μ΄μš©ν•  수 있게 도와쀀닀

  • μŠ€ν”„λ§μ—μ„œ μ΄μ•ΌκΈ°ν•˜λŠ” μ œμ–΄μ˜ μ—­μ „(IoC), μ˜μ‘΄κ΄€κ³„ μ£Όμž…(DI)은 λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄μ„œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€

  • μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λ©΄ 마치 레고 λΈ”λŸ­ μ‘°λ¦½ν•˜λ“―μ΄! 곡연 λ¬΄λŒ€μ˜ 배우λ₯Ό μ„ νƒν•˜λ“―μ΄! κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€


쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙 (SOLID)

λ‹€ν˜•μ„±κ³Ό SOLIDκ°€ μ€‘μš”ν•¨

  • SRP 단일 μ±…μž„ 원칙

    • ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€
    • ν•˜λ‚˜μ˜ μ±…μž„μ΄λΌλŠ” 것은 λͺ¨ν˜Έ (ν΄μˆ˜λ„, μž‘μ„μˆ˜λ„ λ¬Έλ§₯κ³Ό 상황에 따라 닀름)
    • μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„λ•Œ νŒŒκΈ‰νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έκ²ƒ
      • UI λ³€κ²½, 객체의 생성과 μ‚¬μš©μ„ 뢄리
  • OCP 개방-폐쇄 원칙 (κ°€μž₯ μ€‘μš”)

    • μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€ (κΈ°μ‘΄ μ½”λ“œλŠ” κ·ΈλŒ€λ‘œ μƒˆ κΈ°λŠ₯만 μΆ”κ°€)
    • λ‹€ν˜•μ„±μ„ ν™œμš©
    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒˆ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ μƒˆ κΈ°λŠ₯을 κ΅¬ν˜„ (μ—­ν• κ³Ό κ΅¬ν˜„μ˜ 뢄리)
    • 문제점
      • MemberRepository m = new MemoryMemberRepository();
      • MemberRepository m = new JdbcMemberRepository();
      • κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό 함
      • λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP 원칙을 지킬 수 μ—†μŒ
      • 객체λ₯Ό μƒμ„±ν•˜κ³  연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”
  • LSP λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 법칙

    • ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€
    • λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€λŠ” 것, λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 원칙, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λŠ” λ―Ώκ³  μ‚¬μš©ν•˜λ €λ©΄ 이 원칙이 ν•„μš”
    • λ‹¨μˆœνžˆ μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λŠ” 것을 λ„˜μ–΄μ„œλŠ” 이야기
    • 예) μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯, λ’€λ‘œ κ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSP μœ„λ°˜, λŠλ¦¬λ”λΌλ„ μ•žμœΌλ‘œ 가야함
  • ISP μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

    • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€
    • μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ β†’ μš΄μ „ μΈν„°νŽ˜μ΄μŠ€, μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리
    • μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ β†’ μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈ, 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리
    • λΆ„λ¦¬ν•˜λ©΄ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 μ£Όμ§€ μ•ŠμŒ
    • μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…ν™•ν•΄μ§€κ³ , λŒ€μ²΄ κ°€λŠ₯성이 λ†’μ•„μ§„λ‹€
  • DIP μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 (λ‘λ²ˆμ§Έλ‘œ μ€‘μš”!)

    • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€ ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€ (μ˜μ‘΄μ„± μ£Όμž…)
    • μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 뜻
    • 역할에 μ˜μ‘΄ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€λŠ” 것과 κ°™λ‹€ (κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜λ©΄ 변경이 맀우 μ–΄λ €μ›Œμ§)

β†’ 객체지ν–₯의 핡심은 λ‹€ν˜•μ„±μ΄μ§€λ§Œ λ‹€ν˜•μ„±λ§Œ κ°€μ§€κ³ λŠ” SOLID (OCP, DIP)λ₯Ό λ§Œμ‘±ν•  수 μ—†λ‹€


객체지ν–₯ 섀계와 μŠ€ν”„λ§

  • μŠ€ν”„λ§μ€ λ‹€μŒ 기술둜 λ‹€ν˜•μ„± + OCP, DIP λ₯Ό κ°€λŠ₯ν•˜κ²Œ 지원
    • DI(Dependency Injection): μ˜μ‘΄κ΄€κ³„, μ˜μ‘΄μ„± μ£Όμž…
    • DI μ»¨ν…Œμ΄λ„ˆ 제곡
  • ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ λ³€κ²½ 없이 κΈ°λŠ₯ ν™•μž₯
  • μ‰½κ²Œ λΆ€ν’ˆμ„ κ΅μ²΄ν•˜λ“―μ΄ 개발
  • λͺ¨λ“  섀계에 μ—­ν• κ³Ό κ΅¬ν˜„μ„ 뢄리 (μ΄μƒμ μœΌλ‘œλŠ”)

β†’ OCP, DIPλ₯Ό μ§€ν‚€κΈ° μœ„ν•΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹€ λ³΄λ‹ˆ 핡심 λ‘œμ§μ„ μ œμ™Έν•œ μ½”λ“œκ°€ λ„ˆλ¬΄ λ§Žμ•„μ‘Œκ³  κ·Έλž˜μ„œ μŠ€ν”„λ§μ΄ λ§Œλ“€μ–΄ μ‘Œλ‹€


λ‹€ν˜•μ„±λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό μ€€μˆ˜ν•  수 μ—†λ‹€!

λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ κ΅¬ν˜„κ³Ό 역할을 λΆ„λ¦¬ν•˜λ”λΌλ„ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€

  • μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν–ˆλŠ”κ°€? (O)
  • λ‹€ν˜•μ„±λ„ ν™œμš©ν•˜κ³  μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ 객체λ₯Ό λΆ„λ¦¬ν–ˆλŠ”κ°€? (O)
  • OCP, DIP λ₯Ό μ€€μˆ˜ν–ˆλŠ”κ°€? (X)
    • λ‹€ν˜•μ„±(μΈν„°νŽ˜μ΄μŠ€)을 ν™œμš©ν•˜λ”λΌλ„ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—μ„œ 좔상 μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ 클래슀 λͺ¨λ‘ μ˜μ‘΄ν•˜κ³  μˆ˜μ •μ΄ λ°œμƒν•˜κ²Œ λœλ‹€ (DIP μœ„λ°°)
    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” μƒˆλ‘œμš΄ ν™•μž₯이 λ°œμƒν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—λ„ μˆ˜μ •μ΄ μΌμ–΄λ‚˜μ•Ό ν•œλ‹€ (OCP μœ„λ°°)

해결방법

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ 좔상 μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ μ˜μ‘΄ν•˜λ„λ‘ μˆ˜μ •ν•œλ‹€ (κ΅¬ν˜„ ν΄λž˜μŠ€κ°€ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμƒμ— 없도둝 λ§Œλ“ λ‹€)
  2. [관심사λ₯Ό 뢄리] ν΄λΌμ΄μ–ΈνŠΈμ— κ΅¬ν˜„ 객체λ₯Ό λŒ€μ‹  μƒμ„±ν•˜κ³  μ£Όμž…ν•˜λŠ” μ—­ν• μ˜ 객체λ₯Ό λ§Œλ“ λ‹€ (그것이 λ°”λ‘œ Spring!!) -> 마치 μ—°κ·Ήμ˜ 배우λ₯Ό μΊμŠ€νŒ…ν•˜κ³  λ°°μΉ˜ν•˜λŠ” λˆ„κ΅°κ°€κ°€ ν•„μš”ν•˜λ‹€! (μ΄μ „μ—λŠ” λ°°μš°κ°€ μΊμŠ€νŒ…λ„ν•˜λŠ” 즉, ν΄λΌμ΄μ–ΈνŠΈμ˜ μ—­ν• κ³Ό μ±…μž„μ΄ λ„ˆλ¬΄ λ§Žμ•˜λ˜κ²ƒ!)
  3. 2λ²ˆμ—μ„œ λ§Œλ“  생성,관리,μ£Όμž… 역할을 ν•˜λŠ” 객체가 μƒμ„±μžλ₯Ό 톡해 κ΅¬ν˜„μ²΄λ₯Ό μ£Όμž…ν•΄μ€€λ‹€ (μ˜μ‘΄κ΄€κ³„μ— λŒ€ν•œ 고민은 μ™ΈλΆ€μ—κ²Œ λ§‘κΈ°κ³  μ‹€ν–‰μ—λ§Œ 집쀑!) -> μ˜μ‘΄κ΄€κ³„λ₯Ό μ™ΈλΆ€μ—μ„œ μ£Όμž…ν•΄μ£ΌλŠ” 상황! (μ˜μ‘΄κ΄€κ³„ μ£Όμž… = μ˜μ‘΄μ„± μ£Όμž… = Dependency Injection)

IoC, DI 그리고 μ»¨ν…Œμ΄λ„ˆ

μ œμ–΄μ˜ μ—­μ „ IoC (Inversion of Control)

  • κΈ°μ‘΄ ν”„λ‘œκ·Έλž¨μ€ κ΅¬ν˜„ 객체가 슀슀둜 ν”„λ‘œκ·Έλž¨ 흐름을 μ œμ–΄ν–ˆλ‹€
  • AppConfig κ°€ λ“±μž₯ν•˜λ©΄μ„œ κ΅¬ν˜„ κ°μ²΄λŠ” μžμ‹ μ˜ λ‘œμ§μ„ μ‹€ν–‰ν•˜λŠ” μ—­ν• λ§Œ λ‹΄λ‹Ήν•œλ‹€
  • ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ μ œμ–΄ 흐름에 λŒ€ν•œ κΆŒν•œμ€ λͺ¨λ‘ AppConfig κ°€ κ°€μ§€κ³  μžˆλ‹€ (ν”„λ‘œκ·Έλž¨ 흐름을 μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것이 IoC)

ν”„λ ˆμž„μ›Œν¬ vs 라이브러리

  • Junit κ³Ό 같이 λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ œμ–΄ν•˜κ³  λŒ€μ‹  μ‹€ν–‰ν•˜λ©΄ ν”„λ ˆμž„ μ›Œν¬
  • λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ 직접 μ œμ–΄μ˜ 흐름을 λ‹΄λ‹Ήν•œλ‹€λ©΄ 그것은 라이브러리

μ˜μ‘΄κ΄€κ³„ μ£Όμž… DI (Dependency Injection)

  • μ˜μ‘΄κ΄€κ³„λŠ” 정적인 클래슀 μ˜μ‘΄κ΄€κ³„μ™€ μ‹€ν–‰ μ‹œμ μ— κ²°μ •λ˜λŠ” 동적인 객체(μΈμŠ€ν„΄μŠ€) μ˜μ‘΄κ΄€κ³„λ‘œ λΆ„λ¦¬ν•΄μ„œ 생각해야 ν•œλ‹€
  • 정적인 클래슀 μ˜μ‘΄κ΄€κ³„λ‘œλŠ” μ‹€μ œ μ‹€ν–‰μ—μ„œ 어떀것이 μ£Όμž…λ μ§€ μ•Œ 수 μ—†λ‹€
  • μ‹€ν–‰ μ‹œμ (λŸ°νƒ€μž„)에 μ™ΈλΆ€μ—μ„œ μ‹€μ œ κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μ‹€μ œ μ˜μ‘΄κ΄€κ³„κ°€ μ—°κ²°λ˜λŠ” 것을 μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄λΌκ³  ν•œλ‹€
  • μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ 변경없이 ν΄λΌμ΄μ–ΈνŠΈκ°€ ν˜ΈμΆœν•˜λŠ” λŒ€μƒμ˜ νƒ€μž… μΈμŠ€ν„΄μŠ€λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€
  • μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ 정적인 클래슀 μ˜μ‘΄κ΄€κ³„λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  동적인 객체 μΈμŠ€ν„΄μŠ€ μ˜μ‘΄κ΄€κ³„λ₯Ό μ‰½κ²Œ λ³€κ²½ν•  수 μžˆλ‹€

IoC μ»¨ν…Œμ΄λ„ˆ, DI μ»¨ν…Œμ΄λ„ˆ

  • AppConfig 처럼 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λ©΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ—°κ²°ν•˜λŠ” 것을 IoC μ»¨ν…Œμ΄λ„ˆ ν˜Ήμ€ DI μ»¨ν…Œμ΄λ„ˆλΌκ³  ν•œλ‹€
  • μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ— μ΄ˆμ μ„ 두어 DI μ»¨ν…Œμ΄λ„ˆλΌκ³  주둜 λΆ€λ₯Έλ‹€ (= Assembler, Object Factory)
  • AppConfig = DI μ»¨ν…Œμ΄λ„ˆ = ApplicationContext

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ 생성과정

  1. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 (λΉˆμ΄λ¦„ - 빈객체 ν˜•νƒœμ˜ μ €μž₯μ†Œ)
  2. μŠ€ν”„λ§ 빈 등둝 (μ–΄λ…Έν…Œμ΄μ…˜ 기반)
  • 빈 이름은 λ‹€λ₯΄κ²Œ λΆ€μ—¬λ˜μ–΄μ•Ό 함
  1. μŠ€ν”„λ§ 빈 μ˜μ‘΄κ΄€κ³„ μ„€μ • - μ€€λΉ„
  2. μŠ€ν”„λ§ 빈 μ˜μ‘΄κ΄€κ³„ μ„€μ • - μ™„λ£Œ
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” μ„€μ • 정보λ₯Ό μ°Έκ³ ν•΄μ„œ 의쑴 관계λ₯Ό μ£Όμž… (μŠ€ν”„λ§μ€ λΉˆμ„ μƒμ„±ν•˜κ³  μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…ν•˜λŠ” 단계가 λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€)
  • λ‹¨μˆœνžˆ μžλ°”μ½”λ“œλ₯Ό ν˜ΈμΆœν•˜λŠ”κ²ƒ κ°™μ§€λ§Œ 차이가 μžˆλ‹€ (싱글톀 μ»¨ν…Œμ΄λ„ˆ)

μŠ€ν”„λ§ 빈 쑰회

  • 빈 μ‘°νšŒμ‹œ λ™μΌν•œ νƒ€μž…μ΄ λ‘˜μ΄μƒμΈ 경우 NoUniqueBeanDefinitionException μ˜ˆμ™Έκ°€ λ°œμƒλœλ‹€
  • λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ μ‘°νšŒν•˜λ©΄ μžμ‹ νƒ€μž…λ„ ν•¨κ»˜ μ‘°νšŒλœλ‹€
  • Object νƒ€μž…μœΌλ‘œ μ‘°νšŒν•˜λ©΄ λͺ¨λ“  μŠ€ν”„λ§ λΉˆμ„ μ‘°νšŒν•œλ‹€

BeanFactory 와 ApplicationContext

<<Interface>>BeanFactory <- <<Interface>>ApplicationContext <- AnnotationConfigApplicationContext
BeanFactory
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ΅œμƒμœ„ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€
  • μŠ€ν”„λ§ λΉˆμ„ κ΄€λ¦¬ν•˜κ³  μ‘°νšŒν•˜λŠ” 역할을 λ‹΄λ‹Ήν•œλ‹€
  • getBean() 제곡
ApplicationContext
  • BeanFactory κΈ°λŠ₯을 λͺ¨λ‘ μƒμ†λ°›μ•„μ„œ 제곡
  • λΉˆμ„ κ΄€λ¦¬ν•˜κ³  κ²€μƒ‰ν•˜λŠ” κΈ°λŠ₯을 BeanFactoryκ°€ μ œκ³΅ν•΄μ£ΌλŠ”λ° λ‘˜μ˜ μ°¨μ΄λŠ”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—λŠ” 빈 관리 쑰회 λΏλ§Œμ•„λ‹ˆλΌ μˆ˜λ§Žμ€ λΆ€κ°€κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€
    • λ©”μ‹œμ§€ μ†ŒμŠ€λ₯Ό ν™œμš©ν•œ κ΅­μ œν™” κΈ°λŠ₯ (ν•œκ΅­ -> ν•œκ΅­μ–΄, 일본 -> 일본어)
    • ν™˜κ²½λ³€μˆ˜ (둜컬, 개발, 운영 κ΅¬λΆ„ν•΄μ„œ 처리)
    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이벀트 (이벀트 λ°œν–‰ ꡬ독 λͺ¨λΈμ„ νŽΈλ¦¬ν•˜κ²Œ 지원)
    • νŽΈλ¦¬ν•œ λ¦¬μ†ŒμŠ€ 쑰회 (파일, 클래슀패슀, μ™ΈλΆ€ λ“±μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό νŽΈλ¦¬ν•˜κ²Œ 쑰회)

μ •λ¦¬ν•˜λ©΄

  • ApplicationContext λŠ” BeanFactory 의 κΈ°λŠ₯을 μƒμ†λ°›λŠ”λ‹€
  • ApplicationContext λŠ” 빈 관리기λŠ₯ + νŽΈλ¦¬ν•œ λΆ€κ°€κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€
  • BeanFactory λ₯Ό 직접 μ‚¬μš©ν•  일은 거의 μ—†λ‹€ (λŒ€λΆ€λΆ„ λΆ€κ°€κΈ°λŠ₯이 ν¬ν•¨λœ ApplicationContext μ‚¬μš©)
  • BeanFactory, ApplicationContext λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλΌκ³  ν•œλ‹€

μŠ€ν”„λ§ 빈 μ„€μ • 메타 정보 (BeanDefinition)

  • μŠ€ν”„λ§μ€ λ‹€μ–‘ν•œ μ„€μ • ν˜•μ‹μ„ μ§€μ›ν•˜λŠ”λ° BeanDefinition 의 좔상화λ₯Ό 톡해 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€
  • μ—­ν• κ³Ό κ΅¬ν˜„μ„ κ°œλ…μ μœΌλ‘œ λ‚˜λˆˆκ²ƒ!
    • μžλ°”μ½”λ“œ, XML을 μ½μ–΄μ„œ BeanDefinition을 λ§Œλ“€λ©΄λœλ‹€
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” μžλ°”μ½”λ“œμΈμ§€ XML인지 λͺ°λΌλ„ λœλ‹€ (였직 BeanDefinition만 μ•Œλ©΄ λœλ‹€)
  • BeanDefinition 을 빈 μ„€μ • 메타정보라고 ν•œλ‹€
    • @Bean, <bean> λ‹Ή 각각 ν•˜λ‚˜μ”© 메타정보가 μƒμ„±λœλ‹€
  • μŠ€ν”„λ§μ»¨ν…Œμ΄λ„ˆλŠ” 이 메타정보(BeanDefinition)λ₯Ό 기반으둜 μŠ€ν”„λ§ λΉˆμ„ μƒμ„±ν•œλ‹€

싱글톀 μ»¨ν…Œμ΄λ„ˆ

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 싱글톀

  • μŠ€ν”„λ§μ€ κΈ°μ—…μš© 온라인 μ„œλΉ„μŠ€ κΈ°μˆ μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ νƒ„μƒν–ˆλ‹€
  • λŒ€λΆ€λΆ„μ˜ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‹€ (웹이 μ•„λ‹Œκ²ƒλ„ κ°€λŠ₯)
  • 웹은 보톡 μ—¬λŸ¬ 고객이 λ™μ‹œμ— μš”μ²­μ„ ν•œλ‹€
  • μŠ€ν”„λ§μ΄ μ—†λ‹€λ©΄ 맀번 객체가 μƒμ„±λ˜κ³  μ†Œλ©Έλ˜λ©° λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ 심해진닀 -> 싱글톀
    • 싱글톀을 κ΅¬ν˜„ν•˜λŠ” 방법은 맀우 λ‹€μ–‘ν•˜λ‹€ (곡톡적인 것은 private μƒμ„±μž)
    • 싱글톀 νŒ¨ν„΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬μ²΄ν΄λž˜μŠ€μ— μ˜μ‘΄ν•΄ DIPλ₯Ό μœ„λ°˜ν•œλ‹€
    • λ‚΄λΆ€ 속성을 λ³€κ²½ν•˜κ±°λ‚˜ μ΄ˆκΈ°ν™”ν•˜κΈ° μ–΄λ ΅λ‹€
    • private μƒμ„±μžλ‘œ μžμ‹ 클래슀λ₯Ό λ§Œλ“€κΈ° μ–΄λ ΅λ‹€
    • μœ μ—°μ„±μ΄ λ–¨μ–΄μ Έ μ•ˆν‹°νŒ¨ν„΄μœΌλ‘œ λΆˆλ¦¬κΈ°λ„ ν•œλ‹€

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

  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 싱글톀 νŒ¨ν„΄μ˜ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜λ©° 객체λ₯Ό μ‹±κΈ€ν†€μœΌλ‘œ κ΄€λ¦¬ν•œλ‹€ (λͺ¨λ“  μŠ€ν”„λ§ λΉˆμ€ 싱글톀)
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 싱글톀 μ»¨ν…Œμ΄λ„ˆ 역할을 ν•œλ‹€ (싱글톀 λ ˆμ§€μŠ€νŠΈλ¦¬)
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ‘œ 인해 싱글톀 νŒ¨ν„΄μ„ μœ„ν•œ μ§€μ €λΆ„ν•œ μ½”λ“œκ°€ μ—†λ‹€
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ‘œ 인해 DIP, OCP, ν…ŒμŠ€νŠΈ, private μƒμ„±μžλ‘œ λΆ€ν„° 자유둭게 싱글톀을 μ‚¬μš©ν•  수 μžˆλ‹€

싱글톀 λ°©μ‹μ˜ 주의점

  • 객체 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•΄μ„œ κ³΅μœ ν•˜λŠ” 싱글톀 방식은 μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•˜λ‚˜μ˜ 같은 객체 μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 싱글톀 κ°μ²΄λŠ” μƒνƒœλ₯Ό μœ μ§€ν•˜κ²Œ μ„€κ³„ν•˜λ©΄ μ•ˆλœλ‹€
  • λ¬΄μƒνƒœλ‘œ μ„€κ³„ν•΄μ•Όν•œλ‹€ (λΆˆλ³€κ°μ²΄!)
    • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈμ— 의쑴적인 ν•„λ“œκ°€ μ—†μ–΄μ•Όν•œλ‹€
    • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈ 값을 λ³€κ²½ν•  수 μžˆλŠ” ν•„λ“œκ°€ 있으면 μ•ˆλœλ‹€
    • 가급적 읽기만 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€
    • ν•„λ“œ λŒ€μ‹  μžλ°”μ—μ„œ κ³΅μœ λ˜μ§€ μ•ŠλŠ” μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„°, ThreadLocal 등을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€
  • μŠ€ν”„λ§ 빈의 ν•„λ“œμ— 곡유 값을 μ„€μ •ν•˜λ©΄ 정말 큰 μž₯μ• κ°€ λ°œμƒν•  수 μžˆλ‹€!

@Configuration

AppConfig <- AppConfig@CGLIB
  • @Configuration이 뢙은 클래슀λ₯Ό ApplicationContext μ—μ„œ κΊΌλ‚΄μ„œ 좜λ ₯ν•˜λ©΄ 클래슀 λͺ…에 CGLIBκ°€ λΆ™λŠ”λ‹€
  • μž„μ˜μ˜ λ‹€λ₯Έ 클래슀(AppConfig@CGLIB)κ°€ 싱글톀이 λ˜λ„λ‘ 보μž₯ν•΄μ€€λ‹€ (μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘λ˜μ–΄ 있으면 κ°€μ Έμ˜€κ³  μ—†μœΌλ©΄ μƒμ„±ν•˜λ„λ‘)
  • @Configuration이 μ—†λ‹€λ©΄ @Bean을 뢙여도 싱글톀이 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€
  • @Configuration이 μ—†λ‹€λ©΄ @Bean이 λΆ™μ–΄μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 객체가 μƒμ„±λœλ‹€

μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”

  • @Bean 은 λ©”μ„œλ“œ λ ˆλ²¨μ—μ„œ 직접 μ„ μ–Έν•˜κ³  @ComponentλŠ” 클래슀 λ ˆλ²¨μ—μ„œ μ„ μ–Έν•œλ‹€ (@ComponentλŠ” μŠ€ν”„λ§μ΄ μŠ€μΊ”ν•˜μ—¬ 등둝함)
  • 빈 등둝을 λͺ…μ‹œμ μœΌλ‘œ ν•˜κΈ°μ—λŠ” 관리할 것이 λ„ˆλ¬΄ λ§Žμ€λ° @ComponentScanκ³Ό @AutoWiredλ₯Ό 톡해 λΉˆμ„ λ“±λ‘ν•˜κ³  μ£Όμž…ν•œλ‹€
  • @SpringBootApplication에 @ComponentScanκ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€ (기본적으둜 ν˜„μž¬ μœ„μΉ˜μ—μ„œ ν•˜μœ„ νŒ¨ν‚€μ§€λ₯Ό λͺ¨λ‘ μŠ€μΊ”ν•¨)
  • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ€ λ‹€μŒμ΄ μΆ”κ°€λ‘œ λŒ€μƒμ— ν¬ν•¨λœλ‹€
    • @Component
    • @Controller
    • @Service
    • @Repository
    • @Configuration
  • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” μ‹œ 같은 μ»΄ν¬λ„ŒνŠΈ 이름이 있으면 좩돌이 λ°œμƒν•œλ‹€
  • 기쑴에 μžλ™λ“±λ‘κ³Ό μˆ˜λ™λ“±λ‘ 빈의 이름이 μ€‘λ³΅λ˜λŠ” 경우 μˆ˜λ™λ“±λ‘μ΄ μ˜€λ²„λΌμ΄λ”©ν•΄λ²„λ ΈλŠ”λ°, 졜근 μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œλŠ” 이 κ²½μš°μ—λ„ 였λ₯˜κ°€ λ°œμƒν•˜λ„λ‘ 기본이 λ˜μ—ˆλ‹€

μ˜μ‘΄κ΄€κ³„ μ£Όμž…

μ˜μ‘΄κ΄€κ³„ μ£Όμž… 방법

μŠ€ν”„λ§μ€ μ»¨ν…Œμ΄λ„ˆλŠ” 2κ°€μ§€ 라이프 사이클을 가짐

  1. λͺ¨λ“  μŠ€ν”„λ§ 빈 등둝
  2. μ˜μ‘΄κ΄€κ³„ μ£Όμž…
μƒμ„±μž μ£Όμž… (μΆ”μ²œ!)
@AutoWired
public OrderServiceImpl(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
}
  • μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…λ°›μŒ
  • μƒμ„±μž ν˜ΈμΆœμ‹œμ μ— λ”± 1번만 ν˜ΈμΆœλ˜λŠ” 것이 보μž₯
  • λΆˆλ³€, ν•„μˆ˜ μ˜μ‘΄κ΄€κ³„μ— μ‚¬μš© (μ„Έν„°κ°€ 없어야함)
  • μƒμ„±μžκ°€ 1개만 있으면 @AutoWiredλ₯Ό μƒλž΅ν•΄λ„ μžλ™μœΌλ‘œ μ˜μ‘΄κ΄€κ³„κ°€ μ£Όμž…λ¨
  • μƒμ„±μžμ£Όμž…μ€ λΉˆμ„ λ“±λ‘ν•˜λ©΄μ„œ μžλ™μœΌλ‘œ μ£Όμž…λœλ‹€
μˆ˜μ •μž μ£Όμž…
@AutoWired
public void setMemberRepository(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
}
  • μˆ˜μ •μž μ£Όμž…μ€ 객체 생성 이후에 μ£Όμž…λœλ‹€ (μƒμ„±μž μ£Όμž…μ€ μƒμ„±λ˜λ©΄μ„œ μ£Όμž…λ¨)
ν•„λ“œ μ£Όμž…
@AutoWired
private MemberRepository membmerRepository;
  • ν•„λ“œμ— λ°”λ‘œ μ£Όμž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ νŽΈν•΄λ³΄μ΄μ§€λ§Œ μ™ΈλΆ€μ—μ„œ 변경이 λΆˆκ°€λŠ₯ν•΄μ„œ μ•ˆν‹°νŒ¨ν„΄μœΌλ‘œ λΆ„λ₯˜λœλ‹€
  • DI ν”„λ ˆμž„μ›Œν¬κ°€ μ—†μœΌλ©΄ 아무것도 ν• μˆ˜ μ—†λ‹€ (μ‚¬μš©ν•˜μ§€ 말것! μ‚¬μš©ν•œλ‹€λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œμ •λ„μ—μ„œ!)

쑰회 빈이 2개 이상인 경우

  • @AutoWired ν•„λ“œλͺ… λ§€μΉ­ (ν•„λ“œλͺ…이 μΌμΉ˜ν•˜λ©΄ κ·Έ 빈으둜 μ£Όμž…)
  • @Qualifier μ‚¬μš© (빈 이름 λ§€μΉ­)
    • @Qualifier끼리 μ°Ύμ„λ•Œ μ‚¬μš©ν•˜λŠ”κ²ƒμ„ μΆ”μ²œ
    • μ°ΎλŠ” μ΄λ¦„μ˜ @Qualifierκ°€ μ—†μœΌλ©΄ @AutoWired 처럼 λΉˆμ΄λ¦„μœΌλ‘œ μ°Ύκ³  κ·Έλž˜λ„ μ—†μœΌλ©΄ μ˜ˆμ™Έλ°œμƒν•œλ‹€
  • @Primary (μš°μ„ μˆœμœ„μΈ ν΄λž˜μŠ€μ— 뢙인닀. νŽΈν•˜κΈ΄ ν•˜μ§€λ§Œ ν•œκ³„μ μ΄ 있음)

-> 메인 연결에 @Primaryλ₯Ό μ‚¬μš©ν•˜κ³  μ˜ˆμ™Έμ μΈ 경우 @Qualifierλ₯Ό μ‚¬μš©ν•œλ‹€ (@Qualifierλ₯Ό λͺ…μ‹œν•΄μ„œ μ‚¬μš©ν•˜λ©΄ μš°μ„ μˆœμœ„κ°€ 더 λ†’λ‹€)

κ²°λ‘ : μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•΄λΌ!

  • λΆˆλ³€ - λŒ€λΆ€λΆ„μ˜ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ‹œμ κΉŒμ§€ λΆˆλ³€μ΄μ–΄μ•Όν•œλ‹€ (λΆˆλ³€μ΄λ €λ©΄ μˆ˜μ •μžκ°€ 없어야함)
  • λˆ„λ½ - 객체λ₯Ό μƒμ„±ν• λ•Œ μ˜μ‘΄κ΄€κ³„κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— λˆ„λ½ν•  μœ„ν—˜μ΄ 쀄어든닀
  • final ν‚€μ›Œλ“œ κ°€λŠ₯ - λˆ„λ½ μœ„ν—˜μ΄ 쀄고, λΆˆλ³€μ„ λ§Œλ“€ 수 μžˆλ‹€ (컴파일 였λ₯˜λŠ” μ„Έμƒμ—μ„œ κ°€μž₯ λΉ λ₯΄κ³  쒋은 였λ₯˜!)
  • μžλ™ 빈 등둝을 μ‚¬μš©ν•΄λ„ OCP, DIPλ₯Ό 지킬 수 μžˆλ‹€ (λŒ€λΆ€λΆ„ μžλ™ 빈 등둝 μ‚¬μš©)
  • μˆ˜λ™ 빈 등둝은 기술 지원 빈 μ •λ„μ—μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€ (μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— κ΄‘λ²”μœ„ν•˜κ²Œ 영ν–₯을 λ―ΈμΉ˜λŠ” 기술 지원 객체)
    • μ—…λ¬΄λ‘œμ§ 빈 : 웹을 μ§€μ›ν•˜λŠ” 컨트둀러, 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μžˆλŠ” μ„œλΉ„μŠ€, 데이터 κ³„μΈ΅μ˜ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” 리포지토리등
    • 기술 지원 빈 : 기술적인 λ¬Έμ œλ‚˜ 곡톡 관심사(AOP)λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ‚¬μš© (λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°, 곡톡 둜그처리 λ“±)

빈 생λͺ…μ£ΌκΈ° 콜백 μ‹œμž‘

μŠ€ν”„λ§λΉˆμ€ 크게 객체 생성 -> μ˜μ‘΄κ΄€κ³„ μ£Όμž… 순으둜 라이프사이클을 κ°€μ§„λ‹€. (μŠ€ν”„λ§μ€ λ‹€μ–‘ν•œ 생λͺ…μ£ΌκΈ° μ½œλ°±μ„ μ§€μ›ν•œλ‹€)

  • μŠ€ν”„λ§ 빈의 이벀트 라이프사이클 (싱글톀)

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 -> μŠ€ν”„λ§ 빈 생성 -> μ˜μ‘΄κ΄€κ³„ μ£Όμž… -> μ΄ˆκΈ°ν™” 콜백 (빈이 μƒμ„±λ˜κ³ , 빈의 μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλœ ν›„ 호좜) -> μ‚¬μš© -> μ†Œλ©Έμ „ 콜백 (빈이 μ†Œλ©Έλ˜κΈ° 직전에 호좜) -> μŠ€ν”„λ§ μ’…λ£Œ

객체의 μƒμ„±κ³Όμ΄ˆκΈ°ν™”λ₯Ό λΆ„λ¦¬ν•˜μž. μƒμ„±μžλŠ” ν•„μˆ˜ 정보(νŒŒλΌλ―Έν„°)λ₯Ό λ°›κ³  λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ±…μž„μ„ κ°€μ§„λ‹€. 반면 μ΄ˆκΈ°ν™”λŠ” μƒμ„±λœ 값듀을 ν™œμš©ν•΄μ„œ μ™ΈλΆ€ 컀λ„₯μ…˜μ„ μ—°κ²°ν•˜λŠ” λ“± 무거운 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€. μƒμ„±μž μ•ˆμ—μ„œ 무거운 μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•¨κ»˜ ν•˜λŠ”κ²ƒ 보닀 객체λ₯Ό μƒμ„±ν•˜λŠ” λΆ€λΆ„κ³Ό μ΄ˆκΈ°ν™” ν•˜λŠ” 뢀뢄을 λͺ…ν™•ν•˜κ²Œ λ‚˜λˆ„λŠ” 것이 μœ μ§€λ³΄μˆ˜ κ΄€μ μ—μ„œ μ’‹λ‹€. (μ΄ˆκΈ°ν™” μž‘μ—…μ΄ λ‚΄λΆ€ κ°’λ“€λ§Œ μ•½κ°„ λ³€κ²½ν•˜λŠ” μ •λ„λŠ” μƒμ„±μžμ—μ„œ μ²˜λ¦¬ν•˜λŠ”κ²Œ λ‚˜μ„ 수 μžˆλ‹€)

μŠ€ν”„λ§μ€ 크게 3κ°€μ§€ λ°©λ²•μœΌλ‘œ 빈 생λͺ…μ£ΌκΈ° μ½œλ°±μ„ 지원
  • μΈν„°νŽ˜μ΄μŠ€ (InitializingBean, DisposableBean) - 거의 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
    • μŠ€ν”„λ§ μ „ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•΄μ•Όν•¨
    • μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ„œλ“œμ˜ 이름 λ³€κ²½ λΆˆκ°€
    • κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ— 적용 λΆˆκ°€
  • μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ, μ’…λ£Œ λ©”μ„œλ“œ μ§€μ •
    • λ©”μ„œλ“œ 이름을 자유둭게 λ³€κ²½ κ°€λŠ₯
    • μŠ€ν”„λ§ 빈이 μŠ€ν”„λ§ μ½”λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠμŒ
    • μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ μ΄ˆκΈ°ν™” μ’…λ£Œ λ©”μ„œλ“œ μ μš©κ°€λŠ₯
    • μ’…λ£Œ λ©”μ„œλ“œλ₯Ό μΆ”λ‘ ν•΄μ„œ ν˜ΈμΆœν•΄μ€€λ‹€ (close, shutdown μ΄λ¦„μ˜ λ©”μ„œλ“œ, μ•ˆμ“΄λ‹€λ©΄ destoryMethod="")
  • @PostConstruct, @PreDestroy 지원 (이 방법 μΆ”μ²œ!)
    • κ°€μž₯ ꢌμž₯λ˜λŠ” 방법
    • μœ μΌν•œ 단점은 μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” 적용 λΆˆκ°€ (μƒμœ„ μ΄ˆκΈ°ν™”, μ’…λ£Œ λ©”μ„œλ“œ μ§€μ •ν•˜λŠ” 방법 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€)

빈 μŠ€μ½”ν”„

  • μŠ€ν”„λ§μ€ 기본적으둜 μ‹±κΈ€ν†€μœΌλ‘œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ λ•Œ κΉŒμ§€ μœ μ§€λœλ‹€
  • ν”„λ‘œν† νƒ€μž…: μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… 빈의 생성과 μ˜μ‘΄κ΄€κ³„ μ£Όμž…κΉŒμ§€λ§Œ κ΄€μ—¬ν•˜κ³  λ”λŠ” κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ”λ‹€
  • μ›Ή κ΄€λ ¨ μŠ€μ½”ν”„
    • request: μ›Ή μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆλ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„
    • session: μ›Ή μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„
    • application: μ›Ήμ˜ μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈμ™€ 같은 λ²”μœ„λ‘œ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ(싱글톀)μ—μ„œ ν”„λ‘œν† νƒ€μž… 빈 μ‚¬μš©ν•˜λ©΄ μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λ˜λŠ” 것은 μ•„λ‹ˆλ‹€ (λ™μΌν•œ ν”„λ‘œν† νƒ€μž… 빈이 λ°˜λ³΅ν•΄μ„œ 호좜됨)
  • ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” 맀번 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•¨μΌ κ²ƒμž„ (μ‹€λ¬΄μ—μ„œ ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” 거의 μ—†λ‹€)
  • μ›ΉμŠ€μ½”ν”„
    • request μŠ€μ½”ν”„: μš”μ²­μ‹œ λ§ˆλ‹€ μƒμ„±λ˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λ©΄μ„œ destory λœλ‹€ (μš”μ²­μ΄ μ˜€λŠ”λ•Œμ— μ£Όμž…λ˜λ„λ‘ μ§€μ—°μ‹œμΌœμ•Όν•œλ‹€ - ObjectProvider μ‚¬μš©)
    • @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) μ΄λ ‡κ²Œ ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•΄λ„ κ°€λŠ₯ν•˜λ‹€ (λ¬΄λΆ„λ³„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ ΅λ‹€. κΌ­ ν•„μš”ν•œ κ³³μ—λ§Œ!)

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages