μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[JPA] μŠ€ν”„λ§ λΆ€νŠΈ 핡심 μ½˜μ…‰νŠΈκ°€ 뭘까?

미둜910 2024. 9. 26. 16:31
πŸ’‘
1. μ œμ–΄μ˜ μ—­μ „(IoC)κ³Ό μ˜μ‘΄μ„± μ£Όμž…(DI)
2. 빈(Bean)κ³Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ
3. 관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(AOP)
4. 이식 κ°€λŠ₯ν•œ μ„œλΉ„μŠ€ 좔상화(PSA)

 

μ „ 기반 지식

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

  • 일반적인 μ •μ˜: μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λŠ” μžλ°” ν”Œλž«νΌμ„ μœ„ν•œ κ°•λ ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 원칙에 κΈ°λ°˜ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ, 주둜 μ—”ν„°ν”„λΌμ΄μ¦ˆκΈ‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ좕할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ„€μ • 방식: μŠ€ν”„λ§μ€ 초기 섀정이 λ³΅μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. XML μ„€μ • νŒŒμΌμ΄λ‚˜ μžλ°” 기반의 μ„€μ • 클래슀λ₯Ό 톡해 λ‹€μ–‘ν•œ κΈ°λŠ₯을 직접 ꡬ성해야 ν•©λ‹ˆλ‹€.
  • κΈ°λŠ₯: μŠ€ν”„λ§μ€ μ˜μ‘΄μ„± μ£Όμž…(DI), AOP(관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°), νŠΈλžœμž­μ…˜ 관리, 데이터 μ•‘μ„ΈμŠ€, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발, λ³΄μ•ˆ λ“± κ΄‘λ²”μœ„ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 λͺ¨λ“  κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μƒλ‹Ήν•œ μ–‘μ˜ μ„€μ • μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

2. μŠ€ν”„λ§ λΆ€νŠΈ(Spring Boot)

  • 일반적인 μ •μ˜: μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ μ„œλΈŒ ν”„λ‘œμ νŠΈλ‘œ, μŠ€ν”„λ§ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 더 쉽고 λΉ λ₯΄κ²Œ κ°œλ°œν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. 특히 λ³΅μž‘ν•œ 섀정을 μžλ™ν™”ν•˜κ³ , 기본적인 κΈ°λŠ₯을 μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ 도ꡬ와 섀정을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ„€μ • 방식: μŠ€ν”„λ§ λΆ€νŠΈλŠ” "Convention over Configuration(관둀에 λ”°λ₯Έ μ„€μ •)" 철학을 λ”°λ¦…λ‹ˆλ‹€. 즉, κ°œλ°œμžκ°€ κΈ°λ³Έ 섀정을 크게 μˆ˜μ •ν•  ν•„μš” 없이, μžλ™ μ„€μ • κΈ°λŠ₯을 톡해 λ§Žμ€ 뢀뢄이 μžλ™μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 초기 섀정이 간단해지고, 생산성이 크게 ν–₯μƒλ©λ‹ˆλ‹€.
  • κΈ°λŠ₯: μŠ€ν”„λ§ λΆ€νŠΈλŠ” λ‚΄μž₯ μ›Ή μ„œλ²„(예: Tomcat, Jetty)λ₯Ό μ œκ³΅ν•˜μ—¬ λ³„λ„μ˜ μ›Ή μ„œλ²„ μ„€μ • 없이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ‹€μ–‘ν•œ μŠ€νƒ€ν„° μ˜μ‘΄μ„±(Starter Dependency)을 톡해 ν•„μš”ν•œ κΈ°λŠ₯을 μ‰½κ²Œ μΆ”κ°€ν•  수 있으며, κ°„λ‹¨ν•œ λͺ…λ Ήμ–΄λ‘œ ν”„λ‘œμ νŠΈλ₯Ό λΉ λ₯΄κ²Œ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
πŸ’‘μ°Έκ³ 
μŠ€ν”„λ§ λΆ€νŠΈμ™€ μŠ€ν”„λ§μ΄ λ‹€λ₯Έ 도ꡬ라고 생각할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§μ— μ†ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.
즉, μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ μΌλΆ€λ‘œ, μŠ€ν”„λ§μ˜ κΈ°λ³Έ κΈ°λŠ₯을 ν™œμš©ν•˜λ©΄μ„œ 개발자의 νŽΈμ˜μ„±μ„ κ·ΉλŒ€ν™”ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

 

μŠ€ν”„λ§ λΆ€νŠΈμ˜ 핡심 κ°œλ…


μŠ€ν”„λ§ λΆ€νŠΈ 핡심 μ½˜μ…‰νŠΈ μ΄ν•΄ν•˜κΈ°

 

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

μ œμ–΄μ˜ μ—­μ „(Inversion Of Control): 일반적으둜 ν”„λ‘œκ·Έλž¨μ˜ 흐름(μ œμ–΄)은 κ°œλ°œμžκ°€ κ²°μ •ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μŠ€ν”„λ§μ—μ„œλŠ” μ œμ–΄μ˜ 역전이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 즉, 객체의 생성 및 라이프사이클 관리가 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ— μ˜ν•΄ μžλ™μœΌλ‘œ μ œμ–΄λ©λ‹ˆλ‹€. μ‰½κ²Œ 말해, ν”„λ‘œκ·Έλž¨μ˜ 흐름을 μŠ€ν”„λ§μ΄ κ΄€λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection): μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•Œ, 클래슀 κ°„μ˜ 의쑴 관계가 λ°œμƒν•©λ‹ˆλ‹€. 이 μ˜μ‘΄μ„±μ„ μ½”λ“œμ—μ„œ 직접 κ΄€λ¦¬ν•˜λŠ” λŒ€μ‹ , μŠ€ν”„λ§μ΄ ν•„μš”ν•œ μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, UserService ν΄λž˜μŠ€κ°€ UserRepositoryλ₯Ό ν•„μš”λ‘œ ν•  λ•Œ, κ°œλ°œμžλŠ” 이λ₯Ό 직접 μƒμ„±ν•˜λŠ” λŒ€μ‹ , μŠ€ν”„λ§μ΄ 이 두 객체λ₯Ό μ—°κ²°(μ£Όμž…)ν•΄μ€λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ½”λ“œκ°€ 더 μœ μ—°ν•˜κ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

2. 빈(Bean)κ³Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ: μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ€‘μ‹¬μž…λ‹ˆλ‹€. 이 μ»¨ν…Œμ΄λ„ˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”λ‘œ ν•˜λŠ” λΉˆμ„ μƒμ„±ν•˜κ³ , 이 λΉˆλ“€ κ°„μ˜ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λ©°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 싀행될 λ•Œ λΉˆμ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ κ΄€λ¦¬ν•©λ‹ˆλ‹€. 즉, 빈이 μƒμ„±λ˜κ³  μ†Œλ©Έλ˜κΈ°κΉŒμ§€μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό 이 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ 관리 ν•©λ‹ˆλ‹€. @Autowrired 같은 μ• λ„ˆν…Œλ‹ˆμ…˜μ„ μ‚¬μš©ν•΄ λΉˆμ„ μ£Όμž…λ°›μ„ 수 있게 DI도 지원 ν•©λ‹ˆλ‹€.

 

빈(Bean): μŠ€ν”„λ§μ—μ„œ λΉˆμ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•˜λŠ” 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μŠ€ν”„λ§μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 싀행될 λ•Œ ν•„μš”ν•œ 객체(빈)λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€. XML 파일 μ„€μ •, μ• λ„ˆν…Œμ΄μ…˜ μΆ”κ°€ λ“±μ˜ 방법등을 제곡 ν•©λ‹ˆλ‹€.

 

3. 관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(AOP)

관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Aspect Oriented Programming): AOPλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 κΈ°λŠ₯에 영ν–₯을 주지 μ•ŠμœΌλ©΄μ„œ, 뢀가적인 κΈ°λŠ₯(예: λ‘œκΉ…, νŠΈλžœμž­μ…˜ 관리)을 μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λͺ¨λ“  λ©”μ†Œλ“œ 호좜 전에 둜그λ₯Ό 남기고 μ‹Άλ‹€λ©΄, λͺ¨λ“  λ©”μ†Œλ“œλ§ˆλ‹€ μ½”λ“œλ₯Ό μΆ”κ°€ν•  ν•„μš” 없이, AOPλ₯Ό μ‚¬μš©ν•΄ μ΄λŸ¬ν•œ κΈ°λŠ₯을 μ‰½κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ˜ˆμ‹œ: 은행 μ‹œμŠ€ν…œμ—μ„œ 둜그 κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€. λͺ¨λ“  μ„œλΉ„μŠ€ λ©”μ†Œλ“œλ§ˆλ‹€ 둜그λ₯Ό λ‚¨κΈ°λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” λŒ€μ‹ , AOPλ₯Ό 톡해 "λͺ¨λ“  μ„œλΉ„μŠ€ λ©”μ†Œλ“œ 호좜 μ‹œ 둜그λ₯Ό λ‚¨κΈ°μž"λŠ” κ·œμΉ™μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ½”λ“œμ˜ 쀑볡을 ν”Όν•˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μœ μ§€λ³΄μˆ˜κ°€ 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

이식 κ°€λŠ₯ν•œ 좔상화 - PSA(Portable Service Abstraction) :

PSAλŠ” μŠ€ν”„λ§μ—μ„œ λ‹€μ–‘ν•œ 기술 μŠ€νƒμ— λŒ€ν•œ 좔상화λ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨, νŠΉμ • κΈ°μˆ μ— μ’…μ†λ˜μ§€ μ•Šκ³  이식성이 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ λ•λŠ” κ°œλ…μ„ μ˜λ―Έν•©λ‹ˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€, λ©”μ‹œμ§• μ‹œμŠ€ν…œ, νŠΈλžœμž­μ…˜ 관리 λ“±μ˜ μ„œλΉ„μŠ€λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€ κ΄€λ ¨ μ½”λ“œκ°€ νŠΉμ • DBMS(MySQL, Oracle λ“±)에 μ’…μ†λ˜μ§€ μ•Šλ„λ‘, μŠ€ν”„λ§μ€ 좔상화 계측을 톡해 λ‹€μ–‘ν•œ DBMSμ—μ„œ λ™μΌν•œ μ½”λ“œκ°€ μž‘λ™ν•˜λ„λ‘ 도와주며 λ˜ν•œ WAS 도 PAS μ˜ˆμ‹œμ€‘μ— ν•˜λ‚˜λΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. WAS λ₯Ό 톰캣이 μ•„λ‹Œ μ–Έλ”ν† μš°, 넀티와 같은 λ‹€λ₯Έκ³³μ—μ„œ 싀행해도 κΈ°μ‘΄ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κ°œλ… μž…λ‹ˆλ‹€.

 

정리 : μŠ€ν”„λ§ λΆ€νŠΈ 핡심 μ½˜μ…‰νŠΈ


문제1)

μŠ€ν”„λ§κ³Ό λΉ„κ΅ν•œ μŠ€ν”„λ§ λΆ€νŠΈμ˜ μ£Όμš” νŠΉμ§• 쀑 μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 것을 κ³ λ₯΄μ„Έμš”.

  1. μŠ€ν”„λ§ λΆ€νŠΈλŠ” 섀정을 μ΅œμ†Œν™”ν•˜κ³  μžλ™μœΌλ‘œ 섀정을 μ œκ³΅ν•˜μ—¬ λΉ λ₯΄κ²Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆλ„λ‘ λ•λŠ”λ‹€.
  2. μŠ€ν”„λ§ λΆ€νŠΈλŠ” λ‚΄μž₯ μ›Ή μ„œλ²„λ₯Ό μ œκ³΅ν•˜μ—¬ λ³„λ„μ˜ μ›Ή μ„œλ²„ μ„€μ • 없이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆλ‹€.
  3. μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§μ˜ κΈ°λŠ₯을 기반으둜 ν•˜μ§€λ§Œ, μŠ€ν”„λ§κ³ΌλŠ” λ³„λ„μ˜ 독립적인 ν”„λ ˆμž„μ›Œν¬λ‘œ λ™μž‘ν•œλ‹€.
  4. μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€νƒ€ν„° μ˜μ‘΄μ„±(Starter Dependency)을 μ œκ³΅ν•˜μ—¬ ν•„μš”ν•œ κΈ°λŠ₯을 μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆλ‹€.

문제2)

μŠ€ν”„λ§ λΆ€νŠΈμ˜ κΈ°λ³Έ λ‚΄μž₯ WASλ₯Ό κ³ λ₯΄μ„Έμš” μ •λ‹΅

  1. Tomcat
  2. Jetty
  3. Undertow
  4. Netty

문제3)

λ‹€λ₯Έ 객체λ₯Ό 직접 μƒμ„±ν•˜κ±°λ‚˜ μ œμ–΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 객체λ₯Ό 가져와 μ‚¬μš©ν•˜λŠ” κ°œλ…μ„ 뭐라고 ν•˜λ‚˜μš”?

문제4)

μŠ€ν”„λ§μ—μ„œ IoCλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 방법 쀑에 μ™ΈλΆ€μ—μ„œ 객체λ₯Ό μ£Όμž…λ°›μ•„ μ‚¬μš©ν•˜λŠ” κ°œλ…μ„ 뭐라고 ν•˜λ‚˜μš”?

문제5)

λ‹€μŒ μ–΄λ…Έν…Œμ΄μ…˜ 쀑, 빈으둜 λ“±λ‘λ˜μ§€ μ•ŠλŠ” 것은?

  1. @Component
  2. @Controller
  3. @Service
  4. @Repository
  5. @Value

 

λ‹΅: 1-3 ,2-1, 3- μ œμ–΄μ˜ μ—­μ „(IoC), 4- μ˜μ‘΄μ„± μ£Όμž…(DI), 5-5