Skip to content

Instantly share code, notes, and snippets.

@ihoneymon
Last active October 1, 2023 12:32
Show Gist options
  • Save ihoneymon/594bf76682bc0e29e9f5 to your computer and use it in GitHub Desktop.
Save ihoneymon/594bf76682bc0e29e9f5 to your computer and use it in GitHub Desktop.

μ‰½κ²Œ μ΄ν•΄ν•˜λ©΄ 쒋을 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬


'μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬Spring Framework'.

μžλ°” μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œμ„ νŽΈν•˜κ²Œ ν•΄μ£ΌλŠ” μ˜€ν”ˆμ†ŒμŠ€ κ²½λŸ‰κΈ‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬

    μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” νŠΉμ • κ³„μΈ΅μ΄λ‚˜, 기술, 업무 뢄야에 κ΅­ν•œλ˜μ§€ μ•Šκ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „ μ˜μ—­μ„ ν¬κ΄„ν•˜λŠ” λ²”μš©μ μΈ ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§ν•œλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발의 μ „ 과정을 λΉ λ₯΄κ³  νŽΈλ¦¬ν•˜λ©° 효율적으둜 μ§„ν–‰ν•˜λŠ”λ° 일차적인 λͺ©ν‘œλ₯Ό λ‘λŠ” ν”„λ ˆμž„μ›Œν¬λ‹€.

  • κ²½λŸ‰κΈ‰

    λΆˆν•„μš”ν•˜κ²Œ 무겁지 μ•Šλ‹€.

  • μžλ°” μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œμ„ νŽΈν•˜κ²Œ

    μ—”ν„°ν”„λΌμ΄μ¦ˆ 개발의 근본적인 λ¬Έμ œμ μ— λ„μ „ν•΄μ„œ 해결책을 μ œμ‹œν•œλ‹€λŠ” 것이 κΈ°μ‘΄ 기술의 접근방법과 μŠ€ν”„λ§μ˜ μ ‘κ·Ό λ°©λ²•μ˜ 차이닀.

  • μ˜€ν”ˆμ†ŒμŠ€

    μŠ€ν”„λ§μ€ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈ('https://github.com/spring-projects/spring-framework') λ°©μ‹μœΌλ‘œ κ°œλ°œμ€‘μ΄λ‹€.


κ°„λ‹¨ν•˜λ‹€λ©΄ κ°„λ‹¨ν•˜μ§€λ§Œ λ³΅μž‘ν•˜λ‹€λ©΄ ν•œμ—†μ΄ λ³΅μž‘ν•œ 이 녀석을 μ–΄λ–»κ²Œ μ„€λͺ…ν•˜λŠ” 것이 쒋을지 고민이닀.


μ†Œκ°œ

ν”„λ ˆμž„μ›Œν¬λž€?

ν”„λ ˆμž„μ›Œν¬Framework

사전적 의미: a hypothetical description of a complex entity or process λ³΅μž‘ν•œ μ—”ν‹°ν‹° ν˜Ήμ€ ν”„λ‘œμ„ΈμŠ€

μš°λ¦¬κ°€ λ§ν•˜λŠ” 'ν”„λ ˆμž„μ›Œν¬β€™λŠ” μ—”ν„°ν”„λΌμ΄μ¦ˆ 개발의 λ³΅μž‘ν•¨μ„ ν•΄μ†Œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ§‘μ€‘ν•œλ‹€. κ°œλ°œμžμ—κ²Œ ν”„λ ˆμž„μ›Œν¬ λž€ λ§¨μ†μœΌλ‘œ κ°œλ°œν•˜μ§€ μ•Šμ„ 수 μžˆλ„λ‘ μ œκ³΅λ˜λŠ” 'κ·Έ 무엇’이 될 것이닀. λ‹€μˆ˜μ˜ κ°œλ°œμžκ°€ ν•¨κ»˜ κ°œλ°œν•˜λŠ” ν™˜κ²½μ΄ λ˜λ©΄μ„œ μ†Œν”„νŠΈμ›¨μ–΄λŠ” 점점 κ±°λŒ€ν•΄μ‘Œλ‹€. 이 κ±°λŒ€ν•΄μ§„ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ΅¬ν˜„ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방식은 '같은 κ΅μœ‘κ³Όμ •μ„ 거친' κ°œλ°œμžλ“€μ΄λΌκ³  해도 μ €λ§ˆλ‹€ ν’€μ–΄κ°€λŠ” 방식이 λ‹€λ₯Ό 수 μžˆλ‹€. 그런 λ‹€μ–‘ν•œ 방식 μ†μ—μ„œ μΌμ •ν•œ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλ„λ‘ μœ λ„ν•˜λŠ” 것이 ν”„λ ˆμž„μ›Œν¬κ°€ κ°€μ§€κ³  μžˆλŠ” '힘(ν˜Ήμ€ κ°•μ œλ ₯)'이라고 ν•  수 μžˆλ‹€.

ν”„λ ˆμž„μ›Œν¬λ₯Ό 기반으둜 ν•œ κ°œλ°œμ€ μΌμ •ν•œ κ°œλ°œν˜•μ‹μ„ λ„κ²Œ λœλ‹€.

이 ν˜•μ‹μ€ μ•„ν‚€ν…νŠΈarchitect에 μ˜ν•΄μ„œ ν˜Ήμ€ μ„ μž„ κ°œλ°œμžμ— μ˜ν•΄μ„œ 틀이 μž‘ν˜€μ‘Œμ„μˆ˜λ„ 있고 κ΄€λ‘€Convention적으둜 μ •μ˜λ˜μ—ˆμ„ μˆ˜λ„ μžˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λŠ” μΌκ΄€λœ κ°œλ°œμ„ μ§€μ›ν•˜κ³ , ν”„λ ˆμž„μ›Œν¬μ— μ •μ˜λœ 경계에 따라 섀정을 κ°•μ œν•˜κ³  μž¬μ‚¬μš©κ°€λŠ₯ν•˜κ³  ν™•μž₯κ°€λŠ₯ν•˜κ³  λ‹¨μˆœν•œ ν˜•νƒœλ₯Ό μœ μ§€ν•˜λ©΄μ„œ μœ μ§€κ΄€λ¦¬μ„±μ˜ 이읡을 얻을 수 μžˆλ‹€. λ¬Όλ‘ , κ·Έλž˜λ„ *볡작*ν•˜λ‹€.

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

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λŠ” 2003λ…„ λ‘œλ“œμ‘΄μŠ¨Road Johnson μ΄λΌλŠ” 유λͺ…ν•œ κ°œλ°œμžκ°€ 2003 년에 'Expert One-on-One J2EE Design and Developmentβ€™λΌλŠ” 책을 μΆœκ°„ν•˜λ©΄μ„œ μžλ°” μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œμ— κ΄€ν•œ μžμ‹ μ˜ ν’λΆ€ν•œ κ²½ν—˜μ„ λ°”νƒ•μœΌλ‘œ J2EE 섀계와 개발의 λͺ¨λ“  μ˜μ—­μ— λŒ€ν•œ κ°œλ°œμ „λž΅μ„ 닀룬 책이닀.

Note
항상 ν”„λ ˆμž„μ›Œν¬ 기반으둜 μ ‘κ·Όν•˜λΌ.

이 책에 ν¬ν•¨λœ 3만 라인 κ°€λŸ‰μ˜ μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ˜ˆμ œμ— ν¬ν•¨λœ ν”„λ ˆμž„μ›Œν¬κ°€ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ 기원이닀. 이 μ±…μ—μ„œ μ£Όμž₯ν•˜λŠ” μžλ°” μ—”ν„°ν”„λΌμ΄μ¦ˆ 개발의 이상적인 ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈμ„ μΆ”κ΅¬ν•˜λŠ”λ° ν•„μš”ν•œ 기반이 λΌμ£ΌλŠ” μ½”λ“œ, 즉 ν”„λ ˆμž„μ›Œν¬κ°€ μ§€κΈˆ μŠ€ν”„λ§μ˜ μ›μ‹œ 버전이라고 보면 λœλ‹€.

μŠ€ν”„λ§μ˜ 핡심이 POJO ν”„λ‘œκ·Έλž˜λ°μ΄λž€λŠ” 사싀은, μŠ€ν”„λ§μ˜ 핡심을 κ°€μž₯ 잘 λ‚˜νƒ€λ‚΄κ³  μ•Œλ €μ§„ μŠ€ν”„λ§ μ‚Όκ°ν˜•μ„ ν†΅ν•΄μ„œλ„ μ•Œ 수 μžˆλ‹€. 이 그림은 μŠ€ν”„λ§μ†ŒμŠ€μ˜ CTO인 μ•„λ“œλ¦¬μ•ˆ μ½œλ¦¬μ–΄κ°€ μŠ€ν”Όλ§μ˜ ν•΅μ‹¬κ°œλ…μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œ λ§Œλ“€μ—ˆλ‹€.

Spring POJO
Figure 1. Spring POJO

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ POJOλ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ™€, POJOκ°€ μ–΄λ–»κ²Œ 관계λ₯Ό λ§Ίκ³  λ™μž‘ν•˜λŠ”μ§€λ₯Ό μ •μ˜ν•΄λ†“μ€ μ„€κ³„μ •λ³΄λ‘œ κ΅¬λΆ„λœλ‹€. DI(Dependency Injection)의 κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” μœ μ—°ν•˜κ²Œ ν™•μž₯κ°€λŠ₯ν•œ 였브젝트λ₯Ό λ§Œλ“€μ–΄λ‘κ³  κ·Έ κ΄€κ³„λŠ” μ™ΈλΆ€μ—μ„œ λ™μ μœΌλ‘œ μ„€μ •ν•΄μ€€λ‹€λŠ” 것이닀. 이런 DI의 κ°œλ…μ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 μ μš©ν•˜λŠ” 것이 μŠ€ν”„λ§μ˜ ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈμ΄λ‹€. μŠ€ν”„λ§μ˜ μ£Όμš”κΈ°μˆ μΈ IoC/DI, AOP와 PSA(Portable Service Abstraction)λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ POJO둜 κ°œλ°œν•  수 있게 ν•΄μ£ΌλŠ” κ°€λŠ₯기술enabling technology이라고 λΆˆλ¦°λ‹€.

  • POJO의 쑰건

    1. νŠΉμ •κ·œμ•½μ— μ’…μ†λ˜μ§€ μ•ŠλŠ”λ‹€.

      POJOλŠ” μžλ°” 언어와 κΌ­ ν•„μš”ν•œ API μ™Έμ—λŠ” μ’…μ†λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. EJB와 같이 νŠΉμ • κ·œμ•½μ„ 따라 λΉ„μ¦ˆλ‹ˆμŠ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” κ²½μš°λŠ” POJOκ°€ μ•„λ‹ˆλ‹€. νŠΉμ • 클래슀λ₯Ό μƒμ†ν•΄μ„œ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” κ·œμ•½μ΄ μžˆλŠ” κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‹€.

    2. νŠΉμ • ν™˜κ²½μ— μ’…μ†λ˜μ§€ μ•ŠλŠ”λ‹€.

      νŠΉμ • ν™˜κ²½μ— μ’…μ†μ μ΄μ–΄μ•Όλ§Œ λ™μž‘ν•˜λŠ” μ˜€λΈŒμ νŠΈλ„ POJO라고 ν•  수 μ—†λ‹€. POJOλŠ” ν™˜κ²½μ— 독립적이어야 ν•œλ‹€.

  • POJO의 μž₯점

    1. νŠΉμ •κΈ°μˆ κ³Ό ν™˜κ²½μ— μ’…μ†λ˜μ§€ μ•Šμ€ μ˜€λΈŒμ νŠΈλŠ” 그만큼 κΉ”λ”ν•œ μ½”λ“œκ°€ 될 수 μžˆλ‹€.

    2. POJO둜 개발된 μ½”λ“œλŠ” μžλ™ν™”λœ ν…ŒμŠ€νŠΈμ— 맀우 μœ λ¦¬ν•˜λ‹€.

    3. 객체지ν–₯적인 섀계λ₯Ό 자유둭게 μ μš©ν•  수 μžˆλ‹€.

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

μ œμ–΄μ—­μ „(IoC)/μ˜μ‘΄κ΄€κ³„μ£Όμž…(DI)

  • DI ν™œμš©λ°©λ²•

    1. 핡심기λŠ₯의 λ³€κ²½

      DI의 κ°€μž₯ λŒ€ν‘œμ μΈ μ μš©λ°©λ²•μ€ 의쑴 λŒ€μƒμ˜ κ΅¬ν˜„μ„ λ°”κΎΈλŠ” 것이닀. λ””μžμΈ νŒ¨ν„΄μ˜ μ „λž΅ νŒ¨ν„΄μ΄ λŒ€ν‘œμ μΈ μ˜ˆλ‹€. A β†’ B κ΅¬μ‘°μ—μ„œ A의 κΈ°λŠ₯ 일뢀λ₯Ό Bμ—κ²Œ μœ„μž„ν•œλ‹€κ³  ν–ˆμ„ λ•Œ B의 κ΅¬ν˜„ 방식을 ν•„μš”μ— 따라 B1, B2, B3둜 λ³€κ²½ν•˜λŠ” 것이닀.

    2. 핡심기λŠ₯의 동적인 λ³€κ²½

      의쑴 였브젝트의 핡심기λŠ₯ 자체λ₯Ό λ°”κΎΈλŠ” 것이닀. ν•˜μ§€λ§Œ 일반적인 DIλ₯Ό μ΄μš©ν•œ λ³€κ²½λ°©λ²•κ³ΌλŠ” 달리, λ™μ μœΌλ‘œ 맀번 λ‹€λ₯΄κ²Œ λ³€κ²½ν•  수 μžˆλ‹€. DI도 κΈ°λ³Έμ μœΌλ‘œλŠ” λŸ°νƒ€μž„μ‹œμ— λ™μ μœΌλ‘œ 의쑴 였브젝트λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” 것이긴 ν•˜μ§€λ§Œ, 일단 DI되고 λ‚˜λ©΄ κ·Έ ν›„λ‘œλŠ” λ°–Nγ…£μ§€ μ•ŠλŠ”λ‹€. 즉, 동적인 λ°©μ‹μœΌλ‘œ μ—°κ²°λ˜μ§€λ§Œ ν•œλ²ˆ DI되면 λ°”λ€Œμ§€ μ•ŠλŠ” 정적인 관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” 것이닀.

    3. λΆ€κ°€κΈ°λŠ₯의 μΆ”κ°€

      핡심기λŠ₯은 κ·ΈλŒ€λ‘œ λ‘” μ±„λ‘œ λΆ€κ°€κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 것이닀. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ„ 생각해보면 λœλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό 두고 μ‚¬μš©ν•˜κ²Œ ν•˜κ³ , μ‹€μ œ μ‚¬μš©ν•  μ˜€λΈŒμ νŠΈλŠ” μ™ΈλΆ€μ—μ„œ μ£Όμž…ν•˜λŠ” DIλ₯Ό μ μš©ν•΄λ‘λ©΄ λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ„ μ‰½κ²Œ μ μš©ν•  수 μžˆλ‹€.

    4. μΈν„°νŽ˜μ΄μŠ€μ˜ λ³€κ²½

      ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ μ‹€μ œ 였브젝트 사이에 μΈν„°νŽ˜μ΄μŠ€κ°€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ„ DIκ°€ μœ μš©ν•˜λ‹€.

    5. ν”„λ‘μ‹œ

      ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ μ „ν˜•μ μΈ μ‘μš© 방법도 μžˆλ‹€. ν•„μš”ν•œ μ‹œμ μ—μ„œ μ‹€μ œ μ‚¬μš©ν•  였브젝트λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  λ¦¬μ†Œλ₯΄λ₯Ό μ€€λΉ„ν•˜κ²Œ ν•΄μ£ΌλŠ” μ§€μ—°λœ λ‘œλ”©lazy loading을 μ μš©ν•˜λ €λ©΄ ν”„λ‘μ‹œκ°€ ν•„μš”ν•˜λ‹€.

    6. ν…œν”Œλ¦Ώκ³Ό 콜백

      ν…œν”Œλ¦Ώ/콜백 νŒ¨ν„΄μ€ DI의 νŠΉλ³„ν•œ μ μš©λ°©λ²•μ΄λ‹€. 반볡적으둜 λ“±μž₯ν•˜μ§€λ§Œ 항상 고정적인 μž‘μ—… 흐름과 κ·Έ μ‚¬μ΄μ—μ„œ 자주 λ°”λ€ŒλŠ” 뢀뢄을 λΆ„λ¦¬ν•΄μ„œ ν…œν”Œλ¦Ώκ³Ό 콜백으둜 λ§Œλ“€κ³  이λ₯Ό DI 원리λ₯Ό μ΄μš©ν•΄μ„œ 자주 λ°”λ€ŒλŠ” 뢀뢄을 λΆ„λ¦¬ν•΄μ„œ ν…œν”Œλ¦Ώκ³Ό 콜백으둜 λ§Œλ“€κ³  이λ₯Ό DI 원리λ₯Ό μ‘μš©ν•΄ μ μš©ν•˜λ©΄μ„œ μ§€μ €λΆ„ν•˜κ²Œ 맀번 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

    7. 싱글톀과 였브젝트 μŠ€μ½”ν”„

      λ―Έκ°€ ν•„μš”ν•œ μ€‘μš”ν•œ 이유 쀑 ν•œ κ°€μ§€λŠ” 01 ν•  였브젝트의 생λͺ…μ£ΌκΈ°λ₯Ό μ œμ–΄ν•  수 μžˆλ‹€λŠ” 것이닀 0 1 λ₯Ό ν”„λ ˆμž„μ›Œν¬λ‘œ μ΄μš©ν•œλ‹€λŠ” 건 01 λŒ€μƒ 였브젝트λ₯Ό μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•œλ‹€λŠ” μ˜λ―Έλ‹€. 였브젝트의 생성뢀터 관계섀정. 이용, μ†Œλ©Έ 에 이 λ₯΄κΈ°κΉŒμ§€ 의 λͺ¨λ“  과정을 DI μ»¨ν…Œμ΄λ„ˆκ°€ μ£Όκ΄€νžˆ-κΈ° λ•Œλ¬Έμ— κ·Έ 였브젝 트의 μŠ€μ½”ν”„λ₯Ό 자유둭게 μ œμ–΄ν•  수 μžˆλ‹€.

    8. ν…ŒμŠ€νŠΈ

      κ·Έλž˜μ„œ 의쑴 였브젝트λ₯Ό λŒ€μ„ ν•΄μ„œ 슀럽 λ˜λŠ” λͺ© 였브젝트 같은 ν…ŒμŠ€νŠΈ λŒ€μ—­μ„ ν™œμš©ν•΄μ•Ό ν•œλ‹€. μ΄λ•Œλ„ DIλŠ” μ€‘μš”ν•œ 역할을 ν•œλ‹€. λ―Έ λ₯Ό μœ„ν•΄ λ§Œλ“  μˆ˜μ •μž λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œ μ•ˆμ—μ„œ μˆ˜λ™μœΌλ‘œ λͺ© 였브젝트λ₯Ό μ£Όμž…ν•  수 μžˆλ‹€. λ˜λŠ” ν…ŒμŠ€νŠΈμš©μœΌλ‘œ 섀정을 λ³„λ„λ‘œ λ§Œλ“œλŠ” 방법도 μžˆλ‹€ DI μ—†μ΄λŠ” 이런 ν…Œ 슀트 기법을 μ μš©ν•˜κΈ°λž€ λΆˆκ°€λŠ₯ν•˜λ‹€. 갈수둝 ν…ŒμŠ€νŠΈμ˜ μ€‘μš”μ„±μ΄ 컀져가고 μžˆμœΌλ‹ˆ DI 의 ν™œμš© λ°©λ²•μ—μ„œ ν…ŒμŠ€νŠΈ κ°€μ°¨μ§€ν•˜λŠ” 비쀑도 컀질 것이닀.

μ• μŠ€νŒ©νŠΈ μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(AOP, Aspect-Oriented Programming)

κΈ°λŠ₯을 핡심 λΉ„μ§€λ‹ˆμŠ€ 둜직과 곡톡 λͺ¨λ“ˆλ‘œ κ΅¬λΆ„ν•˜κ³ , 핡심 λ‘œμ§μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  사이사이에 곡톡 λͺ¨λ“ˆμ„ 효과적으둜 잘 λΌμ›Œλ„£λ„λ‘ ν•˜λŠ” 개발 방법이닀.

λ³΄μ•ˆ 인증, λ‘œκΉ… 같은 μš”μ†Œλ“±)을 λ§Œλ“  후에 μ½”λ“œ λ°–μ—μ„œ 이 λͺ¨λ“ˆμ„ λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ— μ‚½μž…ν•˜λŠ” 것이 λ°”λ‘œ AOP 적인 개발이 μ½”λ“œ λ°–μ—μ„œ μ„€μ •λœλ‹€λŠ” 것이 핡심이닀.

AOPκ°€ μ‚¬μš©λ˜λŠ” 경우
  • 1) κ°„λ‹¨ν•œ λ©”μ†Œλ“œ μ„±λŠ₯ 검사

    개발 도쀑 특히 DB에 λ‹€λŸ‰μ˜ 데이터λ₯Ό λ„£κ³  λΉΌλŠ” λ“±μ˜ 배치 μž‘μ—…μ— λŒ€ν•˜μ—¬ μ‹œκ°„μ„ 츑정해보고 쿼리λ₯Ό κ°œμ„ ν•˜λŠ” μž‘μ—…μ€ 맀우 μ˜λ―Έκ°€ μžˆλ‹€. 이 경우 맀번 ν•΄λ‹Ή λ©”μ†Œλ“œ 처음과 끝에 System.currentTimeMills();λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” StopWatchμ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ°λŠ” 맀우 λ²ˆκ±°λ‘­λ‹€. 이런 경우 ν•΄λ‹Ή μž‘μ—…μ„ ν•˜λŠ” μ½”λ“œλ₯Ό λ°–μ—μ„œ μ„€μ •ν•˜κ³  ν•΄λ‹Ή 뢀뢄을 μ‚¬μš©ν•˜λŠ” 편이 νŽΈλ¦¬ν•˜λ‹€.

  • 2) νŠΈλžœμž­μ…˜ 처리

    νŠΈλžœμž­μ…˜μ˜ 경우 λΉ„μ§€λ‹ˆμŠ€ 둜직의 전후에 μ„€μ •λœλ‹€. ν•˜μ§€λ§Œ 맀번 μ‚¬μš©ν•˜λŠ” νŠΈλžœμž­μ…˜ (try~catchλΆ€λΆ„)의 μ½”λ“œλŠ” 번거둭고, μ†ŒμŠ€λ₯Ό λ”μš± λ³΅μž‘ν•˜κ²Œ 보여쀀닀.

  • 3) μ˜ˆμ™Έ λ°˜ν™˜

    μŠ€ν”„λ§μ—λŠ” DataAccessExceptionμ΄λΌλŠ” 맀우 잘 μ •μ˜λ˜μ–΄ μžˆλŠ” μ˜ˆμ™Έ 계측 ꡬ쑰가 μžˆλ‹€. μ˜ˆμ „ ν•˜μ΄λ²„λ„€μ΄νŠΈ μ˜ˆμ™Έλ“€μ€ λͺ‡ 개 μ—†μ—ˆκ³  κ·Έλ‚˜λ§ˆλ„ Uncatched Exception이 μ•„λ‹ˆμ˜€λ‹€. μ΄λ ‡κ²Œ ꡬ쑰가 λ³„λ‘œ μ•ˆ 쒋은 μ˜ˆμ™Έλ“€μ΄ λ°œμƒν–ˆμ„ λ•Œ, κ·Έκ±Έ μž‘μ•„μ„œ 잘 μ •μ˜λ˜μ–΄ μžˆλŠ” μ˜ˆμ™Έ 계측 ꡬ쑰둜 λ³€ν™˜ν•΄μ„œ λ‹€μ‹œ λ˜μ§€λŠ” μ• μŠ€νŒ©νŠΈλŠ” 제 3의 ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•  λ•Œ, 본인의 ν”„λ ˆμž„μ›Œν¬λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ³„λ„μ˜ μ˜ˆμ™Έ 계측 ꡬ쑰둜 λ³€ν™˜ν•˜κ³  싢을 λ•Œ μœ μš©ν•˜λ‹€.

  • 4) μ•„ν‚€ν…μ²˜ 검증

    • ν•˜μ΄λ²„λ„€ν‹°μŠ€μ™€ JDBCλ₯Ό 같이 μ‚¬μš©ν•  경우, DB 동기화 문제 ν•΄κ²°

    • λ©€ν‹°μ“°λ ˆλ“œ Safety κ΄€λ ¨ν•˜μ—¬ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” 경우, λ©”μ†Œλ“œλ“€μ— μΌκ΄„μ μœΌλ‘œ 락을 μ„€μ •ν•˜λŠ” μ• μŠ€νŒ©νŠΈ

    • λ°λ“œλ½ λ“±μœΌλ‘œ μΈν•œ PessimisticLockingFailureExceptionλ“±μ˜ μ˜ˆμ™Έλ₯Ό λ§Œλ‚¬μ„ λ•Œ μž¬μ‹œλ„ν•˜λŠ” μ• μŠ€νŒ©νŠΈ

    • λ‘œκΉ…, 인증, κΆŒν•œ λ“±

AOP의 κ΅¬μ„±μš”μ†Œ
  • 쑰인포인트(joinPoint) - νš‘λ‹¨ 관심 λͺ¨λ“ˆμ˜ κΈ°λŠ₯이 μ‚½μž…λ˜μ–΄ λ™μž‘ν•  수 μžˆλŠ” μ‹€ν–‰ κ°€λŠ₯ν•œ νŠΉμ •μœ„μΉ˜

    ex) λ©”μ˜λ“œκ°€ ν˜ΈμΆœλ˜λŠ” λΆ€λΆ„ λ˜λŠ” λ¦¬ν„΄λ˜λŠ” μ‹œμ , ν•„λ“œλ₯Ό μ•‘μ„ΈμŠ€ν•˜λŠ” λΆ€λΆ„, μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§€λŠ” 지점, μ˜ˆμ™Έκ°€ λ˜μ Έμ§€λŠ” μ‹œμ , μ˜ˆμ™Έ ν•Έλ“€λŸ¬κ°€ λ™μž‘ν•˜λŠ” μœ„μΉ˜, ν΄λž˜μŠ€κ°€ μ΄ˆκΈ°ν™”λ˜λŠ” κ³³ 등이 λŒ€ν‘œμ μΈ μ‘°μΈν¬μΈνŠΈκ°€ 될 수 μžˆλ‹€. 각각의 μ‘°μΈν¬μΈνŠΈλ“€μ€ κ·Έ μ•ˆμ— νš‘λ‹¨ κ΄€μ‹¬μ˜ κΈ°λŠ₯이 AOP에 μ˜ν•΄ μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ–΄μ Έμ„œ λ™μž‘ν•  수 μžˆλŠ” 후보지가 λ˜λŠ” 것이닀.

  • 포인트컷(pointCut) - μ–΄λ–€ 클래슀의 μ–΄λŠ 쑰인포인트λ₯Ό μ‚¬μš©ν•  것인지λ₯Ό κ²°μ •ν•˜λŠ” 선택 κΈ°λŠ₯

    AOPκ°€ 항상 λͺ¨λ“  λͺ¨λ“ˆμ˜ λͺ¨λ“  쑰인포인트λ₯Ό μ‚¬μš©ν•  것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν•„μš”μ— 따라 μ‚¬μš©ν•΄μ•Ό ν•  λͺ¨λ“ˆμ˜ νŠΉμ • 쑰인포인트λ₯Ό μ§€μ •ν•  ν•„μš”κ°€ μžˆλ‹€. μΌμ’…μ˜ 쑰인포인트 μ„ μ • λ£°κ³Ό 같은 κ°œλ…μ΄λ‹€. AOPμ—μ„œλŠ” ν¬μΈνŠΈμ»·μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ μ ‘κ·Ό 방법을 μ œκ³΅ν•œλ‹€. AspectJμ—μ„œλŠ” μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ΄μš©ν•œ λ©”μ˜λ“œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•œλ‹€.

  • μ–΄λ“œλ°”μ΄μŠ€(advise) λ˜λŠ” 인터셉터(intercepter)

    • μ–΄λ“œλ°”μ΄μŠ€ - 각 μ‘°μΈν¬μΈνŠΈμ— μ‚½μž…λ˜μ–΄μ Έ λ™μž‘ν•  수 μžˆλŠ” μ½”λ“œ

      주둜 λ©”μ†Œλ“œ λ‹¨μœ„λ‘œ κ΅¬μ„±λœ μ–΄λ“œλ°”μ΄μŠ€λŠ” ν¬μΈνŠΈμ»·μ— μ˜ν•΄ κ²°μ •λœ λͺ¨λ“ˆμ˜ μ‘°μΈν¬μΈνŠΈμ—μ„œ ν˜ΈμΆœλ˜μ–΄ μ‚¬μš©λœλ‹€. 일반적으둜 독립적인 클래슀 λ“±μœΌλ‘œ κ΅¬ν˜„λœ νš‘λ‹¨ 관심 λͺ¨λ“ˆμ„ 쑰인포인트의 정보λ₯Ό μ°Έμ‘°ν•΄μ„œ μ΄μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘μ„±λœλ‹€.

    • 인터셉터 - 인터셉터 체인 λ°©μ‹μ˜ AOP νˆ΄μ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ‘œ 주둜 ν•œ 개의 invoke λ©”μ†Œλ“œλ₯Ό κ°€μ§€λŠ” μ–΄λ“œλ°”μ΄μŠ€

    • μ–΄λ“œλ°”μ΄μŠ€(advise)의 μ’…λ₯˜

      • Before advice : λ©”μ„œλ“œ 에 μ μš©λ˜λŠ”

      • After returning advice : λ©”μ„œλ“œκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λœ 후에 μ‹€ν–‰ (μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 상황은 정상적인 μƒν™©μ—μ„œ μ œμ™Έ)

      • After throwing advice : μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ λ•Œ μ μš©λ˜λŠ” Adviceλ₯Ό μ •μ˜ (catch와 λΉ„μŠ·)

      • Around advice : λ©”μ„œλ“œ 호좜 이전, 이후, μ˜ˆμ™Έ λ°œμƒ λ“± μ—μ„œ 적용 κ°€λŠ₯ν•œ Adviceλ₯Ό μ •μ˜

  • μœ„λΉ™(weaving) λ˜λŠ” ν¬λ‘œμŠ€μ»·νŒ…(crossCutting)

    μœ„λΉ™ - ν¬μΈνŠΈμ»·μ— μ˜ν•΄μ„œ κ²°μ •λœ μ‘°μΈν¬μΈνŠΈμ— μ§€μ •λœ μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ‚½μž…ν•˜λŠ” κ³Όμ • (λ‹€λ₯Έ 말둜 ν¬λ‘œμŠ€μ»·νŒ… μœ„λΉ™μ€ AOPκ°€ 기쑴의 핡심 관심 λͺ¨λ“ˆμ˜ μ½”λ“œμ— μ „ν˜€ 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ©΄μ„œ ν•„μš”ν•œ νš‘λ‹¨ 관심 κΈ°λŠ₯을 μΆ”κ°€ν•  수 있게 ν•΄μ£ΌλŠ” 핡심적인 μ²˜λ¦¬κ³Όμ •μ΄λ‹€. μœ„λΉ™μ„ μ²˜λ¦¬ν•˜λŠ” 방법은 ν›„μ²˜λ¦¬κΈ°λ₯Ό ν†΅ν•œ μ½”λ“œμƒμ„± κΈ°μˆ μ„ ν†΅ν•œ 방법뢀터 νŠΉλ³„ν•œ 컴파일러 μ‚¬μš©ν•˜λŠ” 것, 이미 μƒμ„±λœ 클래슀의 정적인 λ°”μ΄νŠΈμ½”λ“œμ˜ λ³€ν™˜ λ˜λŠ” μ‹€ν–‰ 쀑 ν΄λž˜μŠ€λ‘œλ”λ₯Ό ν†΅ν•œ μ‹€μ‹œκ°„ λ°”μ΄νŠΈμ½”λ“œ λ³€ν™˜ 그리고 닀이내믹 ν”„λ‘μ‹œλ₯Ό ν†΅ν•œ λ°©λ²•κΉŒμ§€ 맀우 λ‹€μ–‘ν•˜λ‹€.

  • μΈνŠΈλ‘œλ•μ…˜(Introduction) λ˜λŠ” μΈν„°νƒ€μž… μ„ μ–Έ

    μΈνŠΈλ‘œλ•μ…˜ - 정적인 λ°©μ‹μ˜ AOP 기술 동적인 AOP 방식을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μ‘°μΈν¬μΈνŠΈμ— μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ μš©ν•΄μ„œ 핡심관심 μ½”λ“œμ˜ λ™μž‘ 방식을 λ³€κ²½ν•  수 μžˆλ‹€. μΈνŠΈλ‘œλ•μ…˜μ€ 이에 λ°˜ν•΄μ„œ 기쑴의 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— ν•„μš”ν•œ λ©”μ†Œλ“œλ‚˜ ν•„λ“œλ₯Ό μΆ”κ°€ν•΄μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” 방법 OOPμ—μ„œ λ§ν•˜λŠ” 였브젝트의 μƒμ†μ΄λ‚˜ ν™•μž₯κ³ΌλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ–΄λ“œλ°”μ΄μŠ€ λ˜λŠ” μ• μŠ€νŒ©νŠΈλ₯Ό μ΄μš©ν•΄μ„œ κΈ°μ‘΄ ν΄λž˜μŠ€μ— μ—†λŠ” μΈν„°νŽ˜μ΄μŠ€ 등을 λ‹€μ΄λ‚΄λ―Ήν•˜κ²Œ κ΅¬ν˜„ν•΄ 쀄 수 μžˆλ‹€.

  • μ• μŠ€νŒ©νŠΈ(aspect) λ˜λŠ” μ–΄λ“œλ°”μ΄μ € μ—μŠ€νŒ©νŠΈ - 포인트컷(μ–΄λ””μ—μ„œ) + μ–΄λ“œλ°”μ΄μŠ€(무엇을 ν•  것인지) + (ν•„μš”μ— 따라 μΈνŠΈλ‘œλ•μ…˜λ„ 포함) AspectJ와 같은 μžλ°” μ–Έμ–΄λ₯Ό ν™•μž₯ν•œ AOPμ—μ„œλŠ” 마치 μžλ°”μ˜ 클래슀처럼 μ• μŠ€νŒ©νŠΈλ₯Ό μ½”λ“œλ‘œ μž‘μ„±ν•  수 μžˆλ‹€. AOP 툴의 μ’…λ₯˜μ— λ”°λΌμ„œ μ–΄λ“œλ°”μ΄μŠ€μ™€ ν¬μΈνŠΈμ»·μ„ 각각 일반 μžλ°” 클래슀둜 μž‘μ„±ν•˜κ³  이λ₯Ό κ²°ν•©ν•œ μ–΄λ“œλ°”μ΄μ € 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 방법도 μžˆλ‹€.

  • AOP μ μš©κΈ°λ²•

    1. μŠ€ν”„λ§κ³Ό 같이 닀이내밍 ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

    2. μžλ°” μ–Έμ–΄μ˜ ν•œκ³„λ₯Ό λ„˜μ–΄μ„œλŠ” μ–Έμ–΄μ˜ ν™•μž₯을 μ΄μš©ν•˜λŠ” 방법

  • AOP μ μš©λ‹¨κ³„

    • 1단계: 미리 μ€€λΉ„λœ AOP 이용

    • 2단계: μ „λ‹΄νŒ€μ„ ν†΅ν•œ AOP 적용

    • 3단계: AOP의 자유둜운 이용

PSA(Portable Service Abstraction)

ν™˜κ²½κ³Ό μ„ΈλΆ€ 기술의 변화에 관계없이 μΌκ΄„λœ λ°©μ‹μœΌλ‘œ κΈ°μˆ μ— μ ‘κ·Όν•  수 있게 ν•΄μ€€λ‹€. POJO둜 개발된 μ½”λ“œλŠ” νŠΉμ • ν™˜κ²½μ΄λ‚˜ κ΅¬ν˜„ 방식에 쒅속적이지 μ•Šμ•„μ•Ό ν•œλ‹€. νŠΉμ • ν™˜κ²½κ³Ό κΈ°μˆ μ— 쒅속적이지 μ•Šλ‹€λŠ” 게 νŠΉμ • κΈ°μˆ μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” λœ»μ€ μ•„λ‹ˆλ‹€. λ‹€λ§Œ POJO μ½”λ“œκ°€ 그런 κΈ°μˆ μ— 직접 λ…ΈμΆœλ˜μ–΄ λ§Œλ“€μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€λŠ” 말이닀. 이λ₯Ό μœ„ν•΄ μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” λŒ€ν‘œμ μΈ 기술이 λ°”λ‘œ 일관성 μžˆλŠ” μ„œλΉ„μŠ€ 좔상화 κΈ°μˆ μ΄λ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ μ‚΄νŽ΄λ³΄κΈ°

spring overview
Figure 2. Overview of Spring Framework

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬('Overview modules')λŠ” μœ„μ™€ 같은 ν˜•νƒœλ‘œ 점점 μ„ΈλΆ„ν™”λ˜κ³  λͺ¨λ“ˆν™”λ˜κ³  μžˆλ‹€. 그만큼 μ‚΄νŽ΄λ΄μ•Όν•  것도 많고 μ΅ν˜€μ•Όν•  κ°œλ…λ„ λ§Žλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬κ°€ μ΅μˆ™ν•΄μ§€κ²Œ 되면 μŠ€ν”„λ§ 기반으둜 ν•˜μ—¬ μ œκ³΅λ˜λŠ” λ‹€μ–‘ν•œ λͺ¨λ“ˆλ“€μ„ μΆ”κ°€ν•˜κ³  λͺ¨λ“ˆμ˜ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” 것이 μ΅μˆ™ν•΄μ§€κ²Œ λœλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©μ΄ μ΅μˆ™ν•΄μ§€λ©΄ ν•„μš”ν•œ λͺ¨λ“ˆμ„ μΆ”κ°€ν•˜κ³  κ·Έ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” 것이 μ‰¬μ›Œμ§„λ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 기반의 κ°œλ°œκ²½ν—˜μ„ λ‹€λ₯Έ λͺ¨λ“ˆμ—λ„ λ°˜μ˜ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ 이건.. 아직 λ¨Ό 이야기.

μŠ€ν”„λ§ λͺ¨λ“ˆ μ†Œκ°œ

Core Container

'Core container'λŠ” spring-core, spring-beans, spring-context, spring-context-support, 그리고 spring-expression(Spring Expression Language) λͺ¨λ“ˆλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • spring-core, spring-beans λͺ¨λ“ˆμ€ 'ν”„λ ˆμž„μ›Œν¬μ˜ 기초적인 λΆ€λΆ„λ“€'(μ œμ–΄μ—­μ „κ³Ό μ˜μ‘΄μ„± μ£Όμž… κΈ°λŠ₯) 을 μ œκ³΅ν•œλ‹€. `BeanFactory`λŠ” νŒ©ν† λ¦¬ νŒ¨ν„΄μ˜ μˆ˜μ€€ 높은 κ΅¬ν˜„μ²΄λ‹€. ν”„λ‘œκ·Έλž˜λ°μ μΈ μš”κ΅¬μ— 따라 싱글톀을 μ œκ±°ν•˜κ³  μ‹€μ§ˆμ μΈ ν”„λ‘œκ·Έλž¨ λ‘œμ§μ— 따라 μ„€μ •κ³Ό μ˜μ‘΄μ„± μ •μ˜λ₯Ό 뢄리할 수 μžˆλ‹€(λ­”μ†Œλ¦¬μ§€?!).

  • 'Context' (spring-context) λŠ” 'Core and Beans'μ˜ν•΄ μ œκ³΅λ˜λŠ” 기초λ₯Ό μ‘°μ§ν•œλ‹€. JNDI λ ˆμ§€μŠ€νŠΈλ¦¬μ™€ μœ μ‚¬ν•œ ν˜•νƒœμ˜ ν”„λ ˆμž„μ›Œν¬ ν˜•μ‹μœΌλ‘œ 객체에 μ ‘κ·Όν•œλ‹€. μ»¨ν…μŠ€νŠΈ λͺ¨λ“ˆμ€ 빈Beans λͺ¨λ“ˆλ‘œ λΆ€ν„° κΈ°λŠ₯을 μœ μ „λ°›κ³  κ΅­μ œν™” 지원을 μΆ”κ°€ν•˜κ³ , 이벀트 처리, μžμ› 적재, 그리고 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ μ»¨ν…μŠ€νŠΈ 등을 μƒμ„±ν•œλ‹€. μ»¨ν…μŠ€νŠΈ λͺ¨λ“ˆμ€ EJB, JMX, 그리고 기본적인 μ›κ²©μ²˜λ¦¬μ™€ κ΄€λ ¨λœ Java EE κΈ°λŠ₯을 μ§€μ›ν•œλ‹€. ApplicatoinContext μΈν„°νŽ˜μ΄μŠ€λŠ” μ»¨ν…μŠ€νŠΈ λͺ¨λ“ˆμ—μ„œ μ€‘μš”ν•œ 지점이닀. `spring-context-support`λŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ˜ 곡톡 μ„œλ“œνŒŒν‹° λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ— κ΄€ν•œ 톡합을 μ§€μ›ν•œλ‹€(μΊμ‹œ, 메일링, μŠ€μΌ€μ€„λ§, ν…œν”Œλ¦Ώ μ—”μ§„).

  • spring-expression λͺ¨λ“ˆμ€ μ‹€ν–‰μ‹œ 쿼리 및 객체 κ·Έλž˜ν”„ μœ μ§€μ— ν•„μš”ν•œ 'ν‘œν˜„μ‹ μ–Έμ–΄'λ₯Ό μ œκ³΅ν•œλ‹€.JSP 2.1 μŠ€νŽ™μ—μ„œ μ •μ˜λœ 곡톡 ν‘œν˜„μ‹ μ–Έμ–΄λ₯Ό ν™•μž₯ν–ˆλ‹€.

AOP and Instrumentation

spring-aop λͺ¨λ“ˆμ€ 'AOP' 관점지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ΅¬ν˜„μ„ μ œκ³΅ν•œλ‹€. λ©”μ„œλ“œ 인터셉터 그리고 포인트컷 μ½”λ“œμ™€ κ΅¬ν˜„λœ κΈ°λŠ₯을 κΉ”λ”νžˆ λΆ„λ¦¬ν•œλ‹€.

  • spring-aspect λͺ¨λ“ˆμ€ AspectJ 톡합기λŠ₯을 μ œκ³΅ν•œλ‹€.

  • spring-instrument λͺ¨λ“ˆμ€ 클래슀 κ³„μΈ‘μ œμ–΄ 지원와 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ— ν¬ν•¨λœ ν΄λž˜μŠ€λ‘œλ” κ΅¬ν˜„μ²΄ 지원을 μ œκ³΅ν•œλ‹€. spring-instrument-tomcat λͺ¨λ“ˆμ€ 톰캣을 μœ„ν•œ μŠ€ν”„λ§μ˜ κ³„μΈ‘μ œμ–΄ μ—μ΄μ „νŠΈλ₯Ό ν¬ν•¨ν•œλ‹€.

Messaging

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 4에 ν¬ν•¨λœ spring-messaging`λͺ¨λ“ˆμ€ μŠ€ν”„λ§ 톡합Spring Integration의 `Message, MessageChannel, `MessageHandler`λ‘œλΆ€ν„° 좔상화λ₯Ό μ œκ³΅ν•˜κ³ , λ©”μ‹œκΈ° 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ좕할 수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€. μŠ€ν”„λ§ MVC μ• λ…Έν…Œμ΄μ…˜μ„ κΈ°λ°˜ν•œ ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈκ³Ό μœ μ‚¬ν•œ ν˜•νƒœλ‘œ λ©”μ‹œμ§€λ₯Ό λ©”μ„œλ“œμ— λ§€ν•‘ν•  수 μžˆλŠ” μ• λ…Έν…Œμ΄μ…˜μ„ ν¬ν•¨ν•˜κ³  μžˆλ‹€.

Data Access/Integration

Data Access/Integration 계측은 JDBC, ORM, OXM, JMS 그리고 Transaction λͺ¨λ“ˆλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • spring-jdbc λͺ¨λ“ˆμ€ 'JDBC'-μ§€λ£¨ν•œ JDBC μ½”λ”©κ³Ό λ°μ΄ν„°λ² μ΄μŠ€λ²€λ”μ—μ„œ μ •μ˜λœ μ—λŸ¬μ½”λ“œ μ²˜λ¦¬μ™€ κ΄€λ ¨λœ 쀄일 수 μžˆλŠ” 좔상화 계측을 μ œκ³΅ν•œλ‹€.

  • spring-tx λͺ¨λ“ˆμ€ νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  POJOλ₯Ό μœ„ν•œ 'ν”„λ‘œκ·Έλž¨μ μ΄κ³  선언적인 νŠΈλžœμž­μ…˜'을 κ΄€λ¦¬ν•œλ‹€.

  • spring-orm λͺ¨λ“ˆμ€ 'JPA', 'JDO'그리고 'Hibernate'λ₯Ό ν¬ν•¨ν•œ μΈκΈ°μžˆλŠ” '객체-관계 λ§€ν•‘'λ₯Ό μœ„ν•œ 톡합계측을 μ œκ³΅ν•œλ‹€.

  • spring-oxm λͺ¨λ“ˆμ€ JAXB, Castor, XMLBeans, JiBX 그리고 XStream κ³Ό 같은 'Object/XML mapping'을 μ§€μ›ν•˜λŠ” 좔상계측을 μ œκ³΅ν•œλ‹€.

  • spring-jms λͺ¨λ“ˆ('Java Messaging Service')은 λ©”μ‹œμ§•μ˜ 생산과 μ†ŒλΉ„ κΈ°λŠ₯을 ν¬ν•¨ν•œλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 4.1λΆ€ν„°λŠ” `spring-messaging`에 ν†΅ν•©λ˜μ—ˆλ‹€.

Web

μ›Ή 계측은 spring-web, spring-webmvc, spring-websocket 그리고 spring-webmvc-portlet λͺ¨λ“ˆλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • spring-web λͺ¨λ“ˆμ€ λ©€ν‹°νŒŒν‹° 파일 μ—…λ‘œλ“œ κΈ°λŠ₯κ³Ό μ„œλΈ”λ¦Ώ λ¦¬μŠ€λ„ˆλ₯Ό μ‚¬μš©ν•œ IoC μ»¨ν…Œμ΄λ„ˆμ˜ μ΄ˆκΈ°ν™”μ™€ μ›Ήμ§€ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈ λ“± μ›Ήμ§€ν–₯ 톡합 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. HTTP client와 μ›Ήκ³Ό κ΄€λ ¨λœ μŠ€ν”„λ§μ˜ 원격지원 κΈ°λŠ₯을 ν¬ν•¨ν•˜κ³  μžˆλ‹€.

  • spring-webmvc λͺ¨λ“ˆμ€ (Web-Servlet λͺ¨λ“ˆμ΄λΌκ³  μ•Œλ €μ§)은 μŠ€ν”„λ§μ˜ λͺ¨λΈ-λ·°-컨트둀러('MVC')와 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ REST Web μ„œλΉ„μŠ€ κ΅¬ν˜„μ²΄λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€. μŠ€ν”„λ§μ˜ MVC ν”„λ ˆμž„μ›Œν¬λŠ” 도메인λͺ¨λΈκ³Ό μ›Ή 폼의 κΉ”λ”ν•œ 뢄리λ₯Ό μ œκ³΅ν•˜κ³  μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ λ‹€λ₯Έ κΈ°λŠ₯듀을 λͺ¨λ‘ ν†΅ν•©ν•œλ‹€.

  • spring-webmvc-portlet λͺ¨λ“ˆμ€ spring-webmvc λͺ¨λ“ˆμ˜ κΈ°λŠ₯λ“€μ˜ λ³΅μ œμ™€ 포틀릿 ν™˜κ²½μ— μ‚¬μš©ν•˜λŠ” MVC κ΅¬ν˜„μ²΄λ₯Ό μ œκ³΅ν•œλ‹€.

Test

spring-test λͺ¨λ“ˆμ€ μŠ€ν”„λ§ μ»΄ν¬λ„ŒνŠΈμ˜ jUnit ν˜Ήμ€ TestNG와 κ΄€λ ¨λœ μœ λ‹› ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ§€μ›ν•œλ‹€. μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ˜ μ μž¬μ™€ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•œ 캐싱 처리λ₯Ό μ œκ³΅ν•˜κ³ , μ½”λ“œμ— κ΄€ν•œ 독립적인 λͺ©κ°μ²΄λ₯Ό μ œκ³΅ν•œλ‹€.

μŠ€ν”„λ§ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€

overview full
Figure 3. Typical full-fledged Spring web application

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯듀을 λͺ¨λ‘ μ μš©ν•œ μ „ν˜•μ μΈ μŠ€ν”„λ§ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ‹€μŒκ³Ό 같은 κΈ°λŠ₯('Usage Scenarios')듀을 μ œκ³΅λ°›μ„ 수 있게 λœλ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ λͺ¨λ“ˆμ€ org.springframework 라고 ν•˜λŠ” κ·Έλ£ΉID(GroupID)와 `spring`으둜 μ‹œμž‘ν•˜λŠ” ArtifactIDλ₯Ό 기반으둜 κ΅¬μ„±λœλ‹€. 'http://maven.apache.org/메이븐]'κ³Ό 'κ·Έλ ˆλ“€'κ³Ό 같은 λΉŒλ“œνˆ΄μ„ κΈ°λ°˜μœΌλ‘œν•œ μ˜μ‘΄μ„± 관리λ₯Ό μ²˜λ¦¬ν•˜λŠ”λ° μš©μ΄ν•˜λ„λ‘ ν•˜κ³  μžˆλ‹€.


μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ΅ν˜€μ•Ό ν•˜λŠ” 이유?

많이 μ‚¬μš©λ˜λ‹ˆκΉŒ

μ™œ μš°λ¦¬λŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ•Œκ³  μ‚¬μš©ν•΄μ•Όν• κΉŒμš”?

  • ν˜„μž¬ 널리 μ‚¬μš©λ˜κ³  μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λ‹€.

    μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λŠ” κ΅­λ‚΄ μžλ°”κ³„μ—΄ ν”„λ‘œμ νŠΈμ—μ„œ κ°€μž₯ 널리 μ‚¬μš©λ˜κ³  μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬ λ‹€('μ „μžμ •λΆ€ν”„λ ˆμž„μ›Œν¬' 포함). κ³Όν•˜λ‹€ 싢을 만큼 μ‚¬μš©λ˜κ³  μžˆλŠ” μŠ€ν”„λ§ μ΄μ „μ—λŠ” μŠ€νŠΈλŸΏμΈ κ°€ μžˆμ—ˆκ³  κ·Έ μ΄μ „μ—λŠ” EJBκ°€ μžˆμ—ˆμ„ 것이닀(μ•„λ§ˆλ„?). 그리고 μ‚Όμ„±SDS의 'μ• λ‹ˆν”„λ ˆμž„anyframe'이 μžˆμ—ˆκ³  LG CNS의 '데브온DevOn'이 μžˆμ—ˆλ‹€. κ·Έ 이외에도 μ…€μˆ˜μ—†μ„λ§ŒνΌ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό κΉ¨μž‘κ±°λ €μ„œ 내놓은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬κ°€ μžˆμ—ˆλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬κ°€ μ˜€ν”ˆμ†ŒμŠ€ μ˜€κΈ°μ— μ†ŒμŠ€κ°€ κ³΅κ°œλ˜μ–΄ 있고 μ˜€ν”ˆμ†ŒμŠ€λ₯Ό 기반으둜 ν•˜μ—¬ μžκΈ°λ“€λ§Œμ˜ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ 쑰금만 μˆ˜μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μžμ‚¬μ˜ ν”„λ ˆμž„μ›Œν¬λΌκ³  이야기 ν•˜λ©° λ§ˆμΌ€νŒ…ν•˜λ˜ λ•Œλ„ μžˆμ—ˆλ‹€. μŠ€νŠΈλŸΏμΈ μ™€ 슀트럿츠2κ°€ 많이 μ‚¬μš©λ˜λ˜ κ΅­λ‚΄ μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œν™˜κ²½μ— μŠ€ν”„λ§μ΄ λΉ λ₯΄κ²Œ ν™•μ‚°λ˜μ–΄ κ°”λ‹€.

  • κ΅­λ‚΄μ˜ λ§Žμ€ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©μ€‘μ΄λ‹€.

    κ΅­λ‚΄ 곡곡기관μͺ½μ—μ„œλŠ” μ „μžμ •λΆ€ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©μ„ ꢌμž₯(or κ°•μ œ?)ν•˜κ³  있고, κ΅­λ‚΄μ™Έ κΈˆμœ΅κΈ°κ΄€λ“€μ€ μ•„μ§κΉŒμ§€λŠ” μžλ°”λ₯Ό 기반으둜 ν•œ μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œν™˜κ²½μ„ μ„ ν˜Έν•˜κ³  μžˆλ‹€. κ·Έ κΈ°λ°˜μ—λŠ” λŒ€ν˜• SIκΈ°μ—…μ΄μ—ˆλ˜ μ‚Όμ„±SDS, LG CNS, SK C&C λ“±μ˜ 영ν–₯이 μžˆλ‹€. 그듀은 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό 기반으둜 ν•œ μžμ‚¬μ˜ κ°œλ°œν”„λ ˆμž„μ›Œν¬λ₯Ό 기반으둜 κ°œλ°œν”„λ‘œμ„ΈμŠ€λ₯Ό κ°œλ°œν•˜κ³  ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μΆ•ν•˜λŠ” κ°€μ΄λ“œλ₯Ό μ μš©ν•΄μ™”λ‹€.

  • μžλ°”κΈ°λ°˜μ—μ„œλŠ” μ΄λ§Œν•œ 녀석이 또 μžˆμ„κΉŒ?

    κ΅­λ‚΄μ—μ„œ 'μžλ°”' κ°œλ°œν™˜κ²½μ„ κ΅¬μΆ•ν•œ 곳이면 'μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬β€™κ°€ μ‚¬μš©λ  κ°€λŠ₯성이 90%λŠ” λ„˜λŠ”λ‹€. 였래된 μ‹œμŠ€ν…œμ—μ„œλŠ” νŒŒμŠ€μΉΌμ΄λ‚˜ EJBκ°€ 있긴 ν•˜κ² μ§€λ§Œ μ°¨μ„ΈλŒ€ 사업을 ν†΅ν•΄μ„œ μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬ 기반으둜 λ³€κ²½ν•΄λ‚˜κ°€κ³  μžˆλŠ” 상황이닀. 아직은 'μžλ°”-μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬-λΉ„μ¦ˆλ‹ˆμŠ€λ‘œμ§ 개발' 쑰합을 κΉ¨λœ¨λ¦΄λ§Œν•œ 상황은 λ²Œμ–΄μ§€μ§€ μ•Šκ³  μžˆλ‹€. ν–₯ν›„ 10년간은 일자리 걱정도 λ”±νžˆ ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€κ³  ν• κΉŒ?

μ™œ 많이 μ“°μΌκΉŒ?

μŠ€ν”„λ§μ΄ 널리 μ“°μ΄κ²Œ 된 이유λ₯Ό κΌ½μ•„λ³΄μžλ©΄,

  • 1.0이 λ‚˜μ˜¨ 이래둜 μ§€μ†μ μœΌλ‘œ μ„±λŠ₯이 ν–₯μƒλ˜κ³  ν•„μš”ν•œ κΈ°λŠ₯듀이 λ°˜μ˜λ˜μ–΄ μ—…κ·Έλ ˆμ΄λ“œκ°€ 되고 μžˆλ‹€.

  • 기본적인 μ›ΉκΈ°λŠ₯κ΅¬ν˜„μ„ λΉ„λ‘―ν•΄μ„œ λ©”μ‹œμ§•, 톡합 λ“±μ˜ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

  • 배우기 μ‰¬μš΄ μžλ°”λ₯Ό 기반으둜 ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ 인λ ₯을 μˆ˜κΈ‰ν•˜κΈ°μ— 무리가 μ—†λ‹€.

    • μžλ°”λŠ” λ‹€λ₯Έ 언어에 λΉ„ν•΄μ„œ 배우고 μ‚¬μš©ν•˜λŠ”λ° 뢀담이 적은 μ–Έμ–΄λ‹€. λ¬Όλ‘  객체지ν–₯을 μ΄ν•΄ν•˜κ³ , λ„λ©”μΈμ˜ κ°œλ…μ„ μ΄ν•΄ν•˜λŠ”λ°λŠ” λ§Žμ€ μ‹œκ°„μ΄ ν•„μš”ν•˜μ§€λ§Œ μ–΄λŠμ •λ„ μ„€κ³„λ˜μ–΄ μžˆλŠ” μƒν™©μ—μ„œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ”λ° 큰 λ¬Έμ œκ°€ λ˜μ§€λŠ” μ•ŠλŠ”λ‹€.

  • ν”„λ ˆμž„μ›Œν¬μ—μ„œ ꢌμž₯(μ œν•œ)ν•˜λŠ” μ²˜λ¦¬λ°©μ‹μ— μ˜ν•΄μ„œ λ§Žμ€ κ°œλ°œμžκ°€ ν˜‘μ—…ν•˜λ©° κ°œλ°œν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜λŠ”λ° 무리가 μ—†λ‹€.

  • μ˜€ν”ˆμ†ŒμŠ€μ΄κ³ 

    • κΉƒν—™μ—μ„œ λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλ₯Ό 열어보며 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ³  결함이 μžˆλŠ” 경우 이슈둜 λ“±λ‘ν•˜κ³  μˆ˜μ •μ„ μš”μ²­ν•  수 μžˆλ‹€.

  • λ¬΄λ£Œλ‹€(μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ μš©ν•˜λ©΄μ„œ μ»¨μ„€νŒ…μ„ λ°›κ³  λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ 지원받을 수 μžˆκΈ°λŠ” ν•˜μ§€λ§Œ λŒ€μ²΄μ μœΌλ‘œ μžκ°€ν•΄κ²°μ„ ν•œλ‹€)

κ΅­λ‚΄μ—μ„œλŠ” 'μ „μžμ •λΆ€ν”„λ ˆμž„μ›Œν¬β€™μ˜ 영ν–₯이 크닀고 λ³Ό 수 μžˆλ‹€. λŒ€ν˜•SIμ—μ„œ μ»¨μ†Œμ‹œμ—„μ„ 이뀄 곡곡기관에 μ μš©λ˜λŠ” 'κ°œλ°œν”„λ ˆμž„μ›Œν¬β€™λ₯Ό λ§Œλ“€μ–΄ λΉ„μš©μ„ μ€„μ΄κ² λ‹€λŠ” λͺ©ν‘œλ₯Ό κ°€μ§€κ³  μ§„ν–‰ν•˜κ³  μžˆλŠ” ν”„λ‘œμ νŠΈλ‘œμ„œ μžλ°”λ₯Ό 기반으둜 ν•΄μ„œ '이클립슀-μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬-각쒅 μ»΄ν¬λ„ŒνŠΈβ€™λ₯Ό μ‘°ν•©ν•œ κ°œλ°œν™˜κ²½μ„ μ œκ³΅ν•˜κ³  ν•„μš”μ— λ”°λΌμ„œλŠ” 무료둜 μ»¨μ„€νŒ…κ³Ό μ΄μŠˆμ²˜λ¦¬κΉŒμ§€ 지원해주고 있기 λ•Œλ¬Έμ— 곡곡기관 SI ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” λ§Žμ€ κΈ°μ—…μ—μ„œ μ±„μš©ν•˜κ³  μžˆλ‹€.

이건 ν™˜κ²½μ μΈ 영ν–₯이고,

μžλ°”λ₯Ό 기반으둜 ν•œ ν”„λ ˆμž„μ›Œν¬ μ€‘μ—μ„œ μŠ€ν”„λ§λ§ŒνΌ 잘 μ„€κ³„λ˜κ³  ν™•μž₯κ°€λŠ₯ν•œ ν”„λ ˆμž„μ›Œν¬κ°€ μ—†λ‹€.


μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 κΈ°λ³Έ 흐름

μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬λ₯Ό μ²˜μŒλΆ€ν„° νŒŒμ•…ν•˜κ³  μ‚¬μš©ν•˜λŠ” 일은 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€. μ–΄λ–€ μ‹μœΌλ‘œ 개발이 μ§„ν–‰λ˜λŠ”μ§€λ₯Ό λŒ€λž΅μ μœΌλ‘œ μ‚΄νŽ΄λ³΄λ©΄ 쒋을 λ“― ν•©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈκ°€ μ§„ν–‰λ λ•Œ 기본적인 골격은 'μ•„ν‚€ν…νŠΈArchitect’에 μ˜ν•΄μ„œ μž‘ν˜€μ§„λ‹€κ³  보면 λ©λ‹ˆλ‹€. μ•„ν‚€ν…νŠΈλŠ” 'κ°œλ°œμžβ€™μ˜ μ΅œμ’… ν…Œν¬νŠΈλ¦¬β€¦β€‹λΌκ³  ν•  수 μžˆλ‹€. μ•„ν‚€ν…νŠΈμ— λŒ€ν•΄ κΆκΈˆν•˜λ‹€λ©΄,

μ•„ν‚€ν…νŠΈ 이야기: 'http://www.yes24.com/24/goods/2506239?scode=032&OzSrank=6'

λ₯Ό μ½μ–΄λ³΄μ„Έμš”.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 흐름

  1. μ‹€λ¬΄μžμ™€ κΈ°νšμžμ— μ˜ν•œ 전체적인 μ„œλΉ„μŠ€μ˜ 기획-뢄석

  2. μ•„ν‚€ν…νŠΈ- μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κΈ°λŠ₯섀계

    1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 적용될 ν”„λ ˆμž„μ›Œν¬ 및 κ΄€λ ¨ μ„€μ • κ²€ν† 

    2. μ†”λ£¨μ…˜ λ„μž…μ‹œ 이와 κ΄€λ ¨λœ κΈ°λŠ₯뢄석 및 ν˜‘μ˜

    3. κ°œλ°œν™˜κ²½ ꡬ좕

      1. VCS(Version Control System) μ„€μΉ˜ 및 버전관리 μ „λž΅μˆ˜λ¦½

      2. CI ꡬ좕(Jenkins κ°€ 많이 이뀄짐)

  3. μŠ€ν”„λ§ ν”„λ‘œμ νŠΈ λΉŒλ“œ

    1. '메이븐Maven'μ΄λ‚˜ 'κ·Έλ ˆλ“€Gradle' λΉŒλ“œνˆ΄μ„ μ΄μš©ν•œ μ˜μ‘΄μ„± μ„€μ • 및 λΉŒλ“œν†΅ν•© 처리

  4. web.xml μ„€μ •

    1. servlet 3.0+ 이상을 μ μš©ν•˜λŠ” κ²½μš°μ—λŠ” ServletInitializerλ₯Ό ν†΅ν•΄μ„œ web.xml μ„€μ • λŒ€μ²΄κ°€λŠ₯

  5. μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈApplicationContext μ„€μ •

    1. application-context.xml(DAO, μ„œλΉ„μŠ€ μ˜μ—­)

      1. datasource μ„€μ •

      2. AOP μ„€μ •

    2. web-application-context.xml(μ›Ή μ˜μ—­)

    3. security-context.xml(μ›Ήμ ‘κ·Ό 인증 μ„€μ •)

      1. URLκ³Ό μ‚¬μš©μž κΆŒν•œμ„ κΈ°μ€€μœΌλ‘œ μ ‘κ·Όμ œμ–΄

  6. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈ 정상섀정 ν…ŒμŠ€νŠΈ

  7. MyBatis λ₯Ό μ‚¬μš©ν•˜λŠλƒ, ν•˜μ΄λ²„λ„€μ΄νŠΈλ“±μ˜ ORM 을 μ‚¬μš©ν•˜λŠλƒμ— 따라 DB μ‚¬μš©λ°©μ‹ 달라짐

    1. MyBatis 인 κ²½μš°μ—λŠ” Database 에 μŠ€ν‚€λ§ˆμ™€ ν…Œμ΄λΈ”λ“€μ΄ μƒμ„±λ˜μ–΄ μžˆμ–΄μ•Ό 함

      1. Mapper 클래슀 및 SQL 을 μ„€μ •ν•΄μ€˜μ•Ό 함

      2. iBatis 말고 MyBatis μ‚¬μš©μ„ ꢌμž₯: iBatisλŠ” κ°œλ°œμ§€μ›μ΄ λλ‚œμ§€ κ½€ λ˜μ—ˆμŒ

      3. MyBatis와 κ΄€λ ¨λœ 뢀뢄은 'MyBatis'λ₯Ό μ°Έκ³ 

    2. ORM인 κ²½μš°μ—λŠ” κ°œλ°œλ‹¨κ³„μ—μ„œ ddl-auto 의 섀정을 ν†΅ν•΄μ„œ ν…Œμ΄λΈ” 및 컬럼의 μžλ™μƒμ„±μ²˜λ¦¬κ°€ κ°€λŠ₯

      1. Spring Data JPAλ₯Ό μ‚¬μš©ν•  경우 기본적인 CRUD 처리λ₯Ό JPARepositoryλ₯Ό ν†΅ν•΄μ„œ μ²˜λ¦¬κ°€ κ°€λŠ₯함

      2. 이와 κ΄€λ ¨λœ μžμ„Έν•œ λ‚΄μš©μ€ 'μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ°' 을 μ‚΄νŽ΄λ³΄κΈ°

  8. 이후 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŒ¨ν‚€μ§€λ₯Ό κ΅¬μ„±ν•˜κ³  κΈ°λŠ₯λ³„λ‘œ 계측을 λ‚˜λˆ  개발

    μ•„ν‚€ν…νŠΈλ‚˜ ν”„λ‘œμ νŠΈ 리더에 μ˜ν•΄μ„œ μ •λ¦¬λ˜κ³  κ°œλ°œλœλ‹€.

  9. κ³„μΈ΅ν˜• νŒ¨ν‚€μ§€ ꡬ성(domain, repository, service, web μ˜μ—­ ꡬ뢄)

    io.honeymon.spring
      configuration
        - WebConfiguration.java
      domain
        - Member.java
        - Project.java
      repository
        - MemberRepository.java
        - ProjectRepository.java
      service
        - MemberService.java
        - DefaultMemberService.java
        - ProjectService.java
        - DefaultMProjectService.java
      web
        - MemberController.java
        - ProjectController.java
      common
        - FileUtils.java
        - DateUtils.java
  10. κΈ°λŠ₯별 νŒ¨ν‚€μ§€ ꡬ성(member, project λ“± κΈ°λŠ₯λ³„λ‘œ ꡬ뢄짓고 κ΄€λ ¨ 클래슀λ₯Ό λͺ¨μ•„λ‘ )

    io.honeymon.spring
      configuration
        - WebConfiguration.java
      member
        - Member.java
        - MemberRepository.java
        - MemberService.java
        - DefaultMemberService.java
        - MemberController.java
      project
        - Project.java
        - ProjectRepository.java
        - ProjectService.java
        - DefaultProjectService.java
        - ProjectController.java

    와 같은 κΈ°λŠ₯별 νŒ¨ν‚€μ§€λ‘œ λ‚˜λˆ  κ°œλ°œν•˜λŠ” 방식도 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ…ΈμΏΌμΈ νŒ€μ—μ„œλ„ κ³„μΈ΅ν˜• νŒ¨ν‚€μ§€ κ΅¬μ„±μ—μ„œ κΈ°λŠ₯ν˜• νŒ¨ν‚€μ§€ κ΅¬μ„±μœΌλ‘œ λ³€ν™˜ν–ˆμŒ.


μœ„μ™€ 같은 ν˜•νƒœλ‘œ κ°œλ°œμ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

  • 이노쿼츠 ν˜„μž¬ 상황

    1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— μžˆμ–΄μ„œ MyBatis λ³΄λ‹€λŠ” JPA μ‚¬μš©μ„ μ„ ν˜Έν•¨. MyBatis λŠ” 4λ…„μ „ μ΄ν›„λ‘œ μ‚¬μš©ν•΄λ³Έ κ²½ν—˜μ—†μŒ

    2. ORM을 기반으둜 κ°œλ°œν•˜λ©΄ μ—”ν‹°ν‹° 객체λ₯Ό 기반으둜 ν•΄μ„œ DBμ™€μ˜ λ§€ν•‘μ²˜λ¦¬λ„ 쉽고 κΈ°λŠ₯κ΅¬ν˜„λ„ 쉬움.

Note
μŠ€ν”„λ§λΆ€νŠΈλ₯Ό 기반으둜 κ°œλ°œν•˜κ²Œ 될 경우, μŠ€ν”„λ§κ³Ό κ΄€λ ¨λœ μ„€μ •μ˜ 뢀담감이 쀄고 κ°œλ°œμ— ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ `Starter-POM`s λ₯Ό ν†΅ν•΄μ„œ μ‰½κ²Œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ— λŒ€ν•œ 이해가 μ–΄λŠμ •λ„ μžˆλŠ” κ°œλ°œμžμ—κ²ŒλŠ” μŠ€ν”„λ§λΆ€νŠΈ μ‚¬μš©μ„ κΆŒν•¨

ν™”λ©΄κ°œλ°œ

  1. 기본섀정이 μ™„λ£Œλœ ν›„μ—λŠ” κ°œλ°œν•˜λŠ” 화면에 따라 κΈ°λŠ₯ κ΅¬ν˜„ μ‹œμž‘

  2. JSP νŽ˜μ΄μ§€ λ“±μ˜ ν…œν”Œλ¦Ώ 파일 μž‘μ„±

  3. Controller ModelAndView 에 ν…œν”Œλ¦Ώ νŽ˜μ΄μ§€ 등둝

    1. ajax λ₯Ό ν™œμš©ν•  경우 ν™”λ©΄μ²˜λ¦¬λ₯Ό λ‹΄λ‹Ήν•  μ»¨νŠΈλ‘€λŸ¬μ™€ 데이터λ₯Ό JSON으둜 μ²˜λ¦¬ν•΄μ€„ 컨트둀러λ₯Ό λΆ„λ¦¬ν•˜λ©΄ μ’‹μŒ

    2. Spring 4.0 이후 @RestController μ• λ…Έν…Œμ΄μ…˜μ΄ μƒκ²¨μ„œ μš”μ²­ν•œ μ»¨ν…νŠΈνƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•΄μ£ΌλŠ” 컨트둀러λ₯Ό λ§Œλ“€ 수 있음

  4. 화면에 ν•„μš”ν•œ 데이터λ₯Ό 담을 데이터듀을 ModelAndView ν˜Ήμ€ ν…œν”Œλ¦Ώμ—”μ§„μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” Model에 λ‹΄μ•„μ£Όλ©΄ `ViewResolver`에 μ˜ν•΄μ„œ 처리됨

  5. 화면에 ν•„μš”ν•œ 데이터에 λ”°λΌμ„œ `Controller`μ—μ„œ `Model`에 λ‹΄μ•„μ£ΌλŠ” 데이터가 달라지고 μ΄λŠ” `Service`의 κ΅¬ν˜„μ΄ ν•„μš”ν•΄μ§

    1. 화면데이터에 따라 데이터, μ„œλΉ„μŠ€ κ°€ 달라짐


μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 뢄석

고전적인 XML 섀정을 기반으둜 ν•œ 경우

  1. web.xml μ°Ύμ•„μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν•„ν„° 섀정듀을 확인

  2. application-context.xml ν˜Ήμ€ *-context.xml 파일 뢄석

    1. application-context.xml: νŒŒμΌμ€ 보톡 `src/main/resource/META-INF`에 μœ„μΉ˜

    2. web-application-context.xml: νŒŒμΌμ€ 보톡 WEB-INF 에 μœ„μΉ˜

    3. ν”„λ‘œμ νŠΈλ₯Ό μ„€μ •ν•œ μ‚¬λžŒμ— 따라 파일λͺ…μ΄λ‚˜ μœ„μΉ˜λŠ” λ‹€λ₯Ό 수 μžˆμœΌλ―€λ‘œ 파일찾기λ₯Ό ν†΅ν•΄μ„œ 찾아보기 λ°”λžŒ

  3. DB μ„€μ • 확인

  4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ¨ν‚€μ§€ ꡬ성 확인

  5. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬λ™ν•˜λ©΄μ„œ μ°νžˆλŠ” 둜그λ₯Ό ν†΅ν•΄μ„œ λ™μž‘μˆœμ„œ 확인

  6. κ΄€λ ¨ν•œ μ„€μ • 확인

JavaConfig 인 경우

  1. @Configuration μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œ 클래슀 탐색

    1. @Configuration μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œ ν΄λž˜μŠ€λŠλŠ” 보톡 ν•˜λ‚˜μ˜ νŒ¨ν‚€μ§€ μ•„λž˜μ— μ§‘μ€‘λœλ‹€.

  2. λ‚˜λ¨Έμ§€ ν•­λͺ©λ“€μ€ 고전적인 XML 섀정을 기반으둜 ν•œ 경우 와 동일

STSλ₯Ό μ΄μš©ν•œ 경우

Note
STS: Spring Tool Suite 'http://spring.io/tools/sts'
  1. spring explorer view λ₯Ό ν™œμš©ν•΄μ„œ 각 μ„€μ •λΉˆμ„ 확인 κ°€λŠ₯함

  2. 'Spring tools - Live Bean graph’λ₯Ό ν†΅ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ„ μ–Έλœ λΉˆλ“€μ˜ 연결을 확인할 수 μžˆλ‹€.


μŠ€ν”„λ§ ν”„λ‘œμ νŠΈ μ‹œμž‘ν•˜κΈ°

μžλ°” μ—”ν„°ν”„λΌμ΄μ¦ˆ ν”Œλž«νΌκ³Ό μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜

ν΄λΌμ΄μ–ΈνŠΈμ™€ λ°±μ—”λ“œ μ‹œμŠ€ν…œ

μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μžμ‹ μ΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ λΌμ„œ 또 λ‹€λ₯Έ μ—”ν„°ν”„λΌμ΄μ¦ˆ μ‹œμŠ€ν…œμ— μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•  수 μžˆλ‹€. λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œ 같은 μ—”ν„°ν”„λΌμ΄μ¦ˆ 정보 μ‹œμŠ€ν…œμ΄λΌκ³  λΆˆλ¦¬λŠ” λ°±μ—”λ“œ μ‹œμŠ€ν…œμ˜ κΈ°λŠ₯을 μ΄μš©ν•˜κΈ°λ„ ν•œλ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„

μŠ€ν”„λ§μœΌλ‘œ λ§Œλ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μžλ°” μ„œλ²„ν™˜κ²½μ— λ°°ν¬ν•˜λ €λ©΄ JavaEE μ„œλ²„κ°€ ν•„μš”ν•˜λ‹€.

  • κ²½λŸ‰κΈ‰ WAS/μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ

    μŠ€ν”„λ§μ€ 기본적으둜 ν†°μΊ£tomcatμ΄λ‚˜ μ œν‹°Jetty와 같은 κ°€λ²Όμš΄ μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλ§Œ μžˆμ–΄λ„ μΆ©λΆ„ν•˜λ‹€. κ·Έ μ΄μ™Έμ˜ ν•„μš”ν•œ κΈ°λŠ₯듀은 λͺ¨λ“ˆκ³Ό λΌμ΄λΈŒλŸ¬λ¦¬λ“±μ„ ν†΅ν•΄μ„œ μ§€μ›ν•˜λŠ₯ν•˜λ‹€.

  • WAS

    μƒμš© λ˜λŠ” μ˜€ν”ˆμ†ŒμŠ€ WASλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°λ„ 있음. 제우슀, μ›ΉμŠ€ν”„μ–΄ 등등등…​

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ°°ν¬λ‹¨μœ„

  • λ…λ¦½ν˜• λͺ¨λ“ˆ

    μŠ€ν”„λ§μ€ 보톡 war둜 νŒ¨ν‚€μ§•λœ 독립 μ›Ή λͺ¨λ“ˆλ‘œ λ°°ν¬λœλ‹€. ν†°μΊ£ 같은 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ“΄λ‹€λ©΄ 독립 μ›Ή λͺ¨λ“ˆμ΄ μœ μΌν•œ 방법이닀.

  • μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜

    ν™•μž₯μžκ°€ `ear`인 μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ νŒ¨ν‚€μ§•ν•΄μ„œ 배포할 μˆ˜λ„ μžˆλ‹€.

…​ γ… γ……-) λ‚˜λ„ μ–΄λ ΅λ‹€.

μŠ€ν”„λ§μ„ μ œλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” 건 생각보닀 쉽지 μ•Šλ‹€. 이런 μ‹μœΌλ‘œ λ§Œλ“€λ©΄ λœλ‹€λŠ” ν‘œμ€€ μƒ˜ν”Œμ΄ μžˆλŠ” 것도 μ•„λ‹ˆλ‹€. μŠ€ν”„λ§μ˜ 개발 ν‘œμ€€ λ”°μœ„κ°€ μ‘΄μž¬ν•˜μ§€λ„ μ•Šμ§€λ§Œ, μŠ€ν”„λ§ 적용 베슀트 ν”„λ ‰ν‹°μŠ€λ₯Ό λͺ¨μ•„μ„œ κ·ΈλŒ€λ‘œ λ”°λ₯Έλ‹€κ³  해도 μŠ€ν”„λ§μ„ 잘 μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  ν™•μ‹ ν•  μˆ˜λŠ” μ—†λ‹€.

ν”„λ ˆμž„μ›Œν¬ 기반 개발

μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•˜λŠ”λ° 'ν”„λ ˆμž„μ›Œν¬β€™λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ”, ν”„λ ˆμž„μ›Œν¬κ°€ μ œκ³΅ν•˜λŠ” 편의기λŠ₯을 ν™œμš©ν•˜κ³  μ—¬λŸ¬ κ°œλ°œμžκ°€ ν•¨κ»˜ κ°œλ°œν•  λ•Œ ν”„λ ˆμž„μ›Œν¬μ˜ 'μ œμ•½β€™μ— 따라 μΌμ •ν•œ ν˜•νƒœμ˜ 코딩을 ν•˜λ„λ‘ ν•˜λŠ” νš¨κ³Όκ°€ μžˆλ‹€.

  • @Repository, @Service, @Component, `@Controller`와 같이 계측적인 ꡬ뢄을 지을 수 μžˆλŠ” μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©

  • @Transactional, @Cacheable, @CacheEvict λ“±μ˜ AOP 적인 선언을 ν†΅ν•΄μ„œ ν”„λ‘œκ·Έλž˜λ° κ°€λŠ₯

μ£Όμ˜ν•  점

μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬λŠ” 쒋은 ν”„λ ˆμž„μ›Œν¬μž„μ—λŠ” λΆ„λͺ…ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ§€λ‚˜μΉ˜κ²Œ ν”„λ ˆμž„μ›Œν¬μ— 치우친 κ°œλ°œμ„ ν•˜λŠ” 것은 ν”Όν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•œλ‹€. κ°œλ°œμžκ°€ ν•΄κ²°ν•΄μ•Όν•˜λŠ” λ¬Έμ œλŠ” λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ λ„μΆœλ  수 있고 κ·Έ 문제λ₯Ό ν‘ΈλŠ” 방법도 μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€. μ–΄λ–€ ν‹€('ν”„λ ˆμž„μ›Œν¬')에 κ°–ν˜€μ„œλŠ” κ·Έ 문제λ₯Ό ν’€ 수 없을 κ²½μš°λ“€μ΄ λ°œμƒν•œλ‹€.

κ°œλ°œμžλŠ” μ—°λ§ˆλ₯Ό ν†΅ν•΄μ„œ λ‹€μ–‘ν•œ κΈ°μˆ μ„ 읡히고 문제λ₯Ό ν’€ 수 μžˆλ„λ‘ μ€€λΉ„ν•˜λŠ” 것이 μ’‹λ‹€.

μ°Έκ³ 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment