Clean Architecture - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (2μ£Όμ°¨)

2024. 10. 6. 11:39·🏠 일상/πŸ““ 일상 일기

 

λ“€μ–΄κ°€λ©°

 

이번 2μ£Ό μ°¨ 항해도 λ¬΄μ‚¬νžˆ λ§ˆμ³€λ‹€. 이번 κ³Όμ œμ—μ„œλŠ” μ•„ν‚€ν…μ²˜ ꡬ쑰 섀계에 λŒ€ν•œ λ‚΄μš©μ„ μ€‘μ μ μœΌλ‘œ κ³΅λΆ€ν•˜μ˜€λ‹€.

κ·Έλ™μ•ˆ 주둜 3-tier μ•„ν‚€ν…μ²˜λ₯Ό 주둜 μ‚¬μš©ν•΄ μ™”μ—ˆλŠ”λ°, μ΄λ²ˆμ—λŠ”ν΄λ¦° μ•„ν‚€ν…μ²˜μ™€ λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜μ˜ νŠΉμ§•, μž₯단점 뢄석을 톡해 κ°μ²΄μ§€ν–₯적 관심사 뢄리에 λŒ€ν•΄ 깊이 κ³ λ―Όν•΄ λ³Ό 수 μžˆλŠ” μ‹œκ°„μ΄μ—ˆλ‹€.

 

 

 

 

 

클린 μ•„ν‚€ν…μ²˜ & λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜

 

클린 μ•„ν‚€ν…μ²˜

클린 μ•„ν‚€ν…μ²˜ [좜처] https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

 

클린 μ•„ν‚€ν…μ²˜λŠ” κ΄€μ‹¬μ‚¬μ˜ 뢄리λ₯Ό λͺ…ν™•νžˆ ν•˜κ³ , λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ™ΈλΆ€ μ˜μ‘΄μ„±μœΌλ‘œλΆ€ν„° μ™„μ „νžˆ λΆ„λ¦¬ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€. 이λ₯Ό 톡해 μ‹œμŠ€ν…œμ˜ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이고, μ™ΈλΆ€ 변화에 λŒ€ν•œ 영ν–₯을 μ΅œμ†Œν™”ν•œλ‹€. 

 

1. μ—”ν‹°ν‹° (Entities)
μ—”ν‹°ν‹°λŠ” μ‹œμŠ€ν…œμ˜ 전사적 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μΊ‘μŠν™”ν•œ 객체둜, μ™ΈλΆ€λ‘œλΆ€ν„°μ˜ 변화에 μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” κ°€μž₯ 핡심적인 도메인 λͺ¨λΈλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ μ–΄λ–€ μ˜μ‘΄μ„±μ—λ„ 영ν–₯을 λ°›μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

 

2. 유즈 μΌ€μ΄μŠ€ (Use Cases)
유즈 μΌ€μ΄μŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ κ΅¬ν˜„ν•œ λ ˆμ΄μ–΄λ‘œ, νŠΉμ • 도메인 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€. 유즈 μΌ€μ΄μŠ€λŠ” μ—”ν‹°ν‹°μ˜ 데이터 흐름을 μ‘°μ •ν•˜λ©°, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ™ΈλΆ€ μž…μΆœλ ₯μ΄λ‚˜ ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측과 λΆ„λ¦¬ν•œλ‹€.

 

3. μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° (Interface Adapters)
이 λ ˆμ΄μ–΄λŠ” 유즈 μΌ€μ΄μŠ€μ™€ μ™ΈλΆ€ μ‹œμŠ€ν…œ(λ°μ΄ν„°λ² μ΄μŠ€, UI, API λ“±) μ‚¬μ΄μ—μ„œ 데이터λ₯Ό λ³€ν™˜ν•˜λŠ” 역할을 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, DTO(Data Transfer Object)λ₯Ό μ‚¬μš©ν•΄ μ—”ν‹°ν‹°μ—μ„œ μ™ΈλΆ€λ‘œ 전달할 데이터 ꡬ쑰둜 λ³€ν™˜ν•˜κ±°λ‚˜, λ°˜λŒ€λ‘œ μ™ΈλΆ€ 데이터λ₯Ό μ—”ν‹°ν‹°λ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ λ‹΄λ‹Ήν•œλ‹€. 이둜 인해, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μ™ΈλΆ€μ˜ λ³€ν™”λ‘œλΆ€ν„° λ³΄ν˜Έλœλ‹€.

 

4. ν”„λ ˆμž„μ›Œν¬ & λ“œλΌμ΄λ²„ (Frameworks & Drivers)
이 λ ˆμ΄μ–΄λŠ” μ™ΈλΆ€ μ‹œμŠ€ν…œ(μ›Ή ν”„λ ˆμž„μ›Œν¬, λ°μ΄ν„°λ² μ΄μŠ€, λ©”μ‹œμ§• μ‹œμŠ€ν…œ λ“±)κ³Ό μƒν˜Έμž‘μš©ν•˜λŠ” μ½”λ“œκ°€ μœ„μΉ˜ν•œλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν”Œλž«νΌ, 라이브러리, μ™ΈλΆ€ API에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ 이 λ ˆμ΄μ–΄μ™€ λΆ„λ¦¬λ˜μ–΄ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 있게 ν•œλ‹€.

 

 

 

λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜

 

λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜ [좜처] https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html

 

λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜λŠ” μ‹œμŠ€ν…œμ„ κ³„μΈ΅λ³„λ‘œ λΆ„λ¦¬ν•˜μ—¬ 각 계측이 μžμ‹ μ˜ μ—­ν• μ—λ§Œ 집쀑할 수 μžˆλ„λ‘ μ„€κ³„ν•œλ‹€. 일반적으둜 ν”„λ ˆμ  ν…Œμ΄μ…˜, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, 데이터 μ ‘κ·Ό κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λ˜λ©°, 각 계측은 μƒμœ„ κ³„μΈ΅μ—μ„œ ν•˜μœ„ κ³„μΈ΅μœΌλ‘œ μ˜μ‘΄μ„±μ΄ 흐λ₯Έλ‹€.

 

 

 

 

λͺ©ν‘œ

이번 과제의 μ£Όμ œλŠ” μˆ˜κ°• μ‹ μ²­ API μž‘μ„±μ΄μ—ˆλ‹€. κΈ°μˆ μ μœΌλ‘œλŠ” λ™μ‹œμ„± μ²˜λ¦¬μ™€ μ•„ν‚€ν…μ²˜ 섀계λ₯Ό κ³ λ €ν•˜μ—¬ κ°œλ°œν•˜λŠ” 것이 ν•΅μ‹¬μ΄μ—ˆλ‹€. 특히, λ‹€μ€‘ μ„œλ²„ ν™˜κ²½μ—μ„œ λ™μž‘μ„ κ³ λ €ν•΄μ•Ό ν–ˆκΈ° λ•Œλ¬Έμ—, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 레벨의 락 λŒ€μ‹  DB λ ˆλ²¨μ—μ„œμ˜ 락을 μ„€μ •ν•˜λŠ” 것이 ν•„μš”ν–ˆλ‹€. λ˜ν•œ, μ•„ν‚€ν…μ²˜λŠ” ν΄λ¦° μ•„ν‚€ν…μ²˜μ™€ λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜μ˜ 쀑간 지점인 ν΄λ¦° λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜λ₯Ό 기반으둜 μ„€κ³„ν–ˆλ‹€.

 

 

 

 

 

μƒˆλ‘œ μ•Œκ²Œ 된 것

1. Repository μΈν„°νŽ˜μ΄μŠ€μ˜ μ˜μ‘΄μ„± 뢄리

μ§€κΈˆκΉŒμ§€λŠ” Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό 항상 μ™ΈλΆ€ μ˜μ‘΄μ„±μ— λ‘μ—ˆκΈ° λ•Œλ¬Έμ—, μ™ΈλΆ€ λ³€ν™”κ°€ 생기면 λ„메인 κ³„측에도 영ν–₯을 λ―Έμ³€λ‹€. ν•˜μ§€λ§Œ, 도메인이 ν•„μš”λ‘œ ν•˜λŠ” λ©”μ„œλ“œλ§Œ λ„메인 κ³„μΈ΅μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ •μ˜ν•˜κ³ , Infrastructure κ³„μΈ΅μ—μ„œ 이에 λŒ€ν•œ κ΅¬ν˜„μ²΄λ₯Ό λ§Œλ“¦μœΌλ‘œμ¨ 도메인이 μ™ΈλΆ€ 변화에 영ν–₯을 λ°›μ§€ μ•Šλ„λ‘ 섀계할 수 μžˆμ—ˆλ‹€.

 

2. Application 계측

이번 κ³Όμ œμ—μ„œ Controller와 Service κ°„에 Application 계측을 μƒˆλ‘­κ²Œ μΆ”κ°€ν–ˆλ‹€. 이 계측에 Facade νŒ¨ν„΄μ„ μ μš©ν•˜μ—¬ μ—¬λŸ¬ μ„œλΉ„μŠ€ λ‘œμ§μ„ λ‹¨μˆœν™”λœ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ œκ³΅ν•˜κ³ , λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•  수 있게 ν–ˆλ‹€.

 

3. 낙관적 락 & 비관적 락

낙관적 락 (Optimistic Lock)

- 낙관적 락은 기본적으둜 데이터에 락을 κ±Έμ§€ μ•Šκ³ , νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή 데이터λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ„ 것이라고 κ°€μ •ν•œλ‹€.

- version을 μ΄μš©ν•˜μ—¬ 읽을 λ•Œμ™€ μ“Έ λ•Œμ˜ 정합성을 ν™•μΈν•˜κ³  λ§žλ‹€λ©΄ μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•œλ‹€.

- λ§Œμ•½ version이 λ§žμ§€ μ•Šλ‹€λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ—¬ νŠΈλžœμž­μ…˜μ΄ μ‹€νŒ¨ν•˜κ²Œ λœλ‹€.

 

비관적 락 (Pessimistic Lock)

- 비관적 락은 데이터에 λŒ€ν•œ 접근이 μ΄λ£¨μ–΄μ§ˆ λ•Œ 항상 락을 κ±Έκ³ , λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή 데이터λ₯Ό μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 λ§‰λŠ”λ‹€.

- λ‹€λ₯Έ μ‚¬μš©μžλŠ” λ¨Όμ € μ ‘κ·Όν•œ μ‚¬μš©μžκ°€ λ³€κ²½ 사항을 μ»€λ°‹ν•˜κ³  λ ˆμ½”λ“œ μž κΈˆμ„ ν•΄μ œν•  λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•œλ‹€.

 

 

이번 κ³Όμ œμ—μ„œλŠ” 비관적 락을 μ„ νƒν–ˆλ‹€. μ΄μœ λŠ” 낙관적 락이 μ„ μ°©μˆœμ— λŒ€ν•œ 보μž₯을 μ œκ³΅ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 낙관적 락은 λ ˆμ½”λ“œ 락을 κ±Έμ§€ μ•ŠμŒμœΌλ‘œμ¨ μ˜€λ²„ν—€λ“œλ₯Ό 쀄일 수 μžˆλŠ” μž₯점이 μžˆμœΌλ‚˜, μ—…λ°μ΄νŠΈ μ‹œ 버전이 λ§žμ§€ μ•ŠμœΌλ©΄ νŠΈλžœμž­μ…˜μ΄ μ‹€νŒ¨ν•˜κ³  λ‹€μ‹œ μ‹œλ„ν•΄μ•Ό ν•˜λ©°, 이둜 인해 순차적인 보μž₯이 μ–΄λ €μ›Œμ§„λ‹€. 반면, 비관적 락은 λŒ€κΈ°μ—΄μ—μ„œ 순차 보μž₯을 μ œκ³΅ν•˜λ―€λ‘œ, μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— μš”μ²­ν•  κ²½μš°μ—λ„ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 μžˆλ‹€.

 

 

 

 

 

μ•žμœΌλ‘œ κ°œμ„ ν•΄μ•Ό ν•  것

1. μ½”ν‹€λ¦° μŠ€ν”„λ§μ—μ„œ JPA 엔티티에 λŒ€ν•œ μ •μ˜

JPA μ—”ν‹°ν‹°λ₯Ό μ •μ˜ν•  λ•Œ μ½”ν‹€λ¦°μ—μ„œλŠ” var와 val을 μ‚¬μš©ν•˜μ—¬ ν•„λ“œλ₯Ό μ„ μ–Έν•˜κ²Œ λœλ‹€. ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ μ€‘μš”ν•œ 섀계 고민이 ν•„μš”ν•˜λ‹€.

var둜 ν•„λ“œλ₯Ό μ •μ˜ν•  경우 ν•„λ“œ 값이 λ³€κ²½ κ°€λŠ₯ν•΄μ Έ, λ¬΄λΆ„λ³„ν•œ 변경을 ν—ˆμš©ν•  수 μžˆλ‹€. μ΄λŠ” 특히 λ„메인 λͺ¨λΈμ—μ„œλŠ” 치λͺ…적일 수 μžˆλŠ”λ°, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μƒμ—μ„œ 객체의 λΆˆλ³€μ„±μ΄ μ€‘μš”ν•œ 경우 예기치 λͺ»ν•œ 였λ₯˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.
반면, val둜 μ •μ˜ν•  경우 ν•„λ“œκ°€ λΆˆλ³€μ΄ λ˜μ–΄ 객체의 μƒνƒœ 변경을 λ°©μ§€ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ JPAμ—μ„œλŠ” μ—”ν‹°ν‹°λ₯Ό μ˜μ†ν™”ν•  λ•Œ ν•„λ“œ 값을 λ³€κ²½ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆλŠ”λ°, μ΄λ•ŒλŠ” λ¬Έμ œκ°€ 될 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μ—…λ°μ΄νŠΈ μ‹œ λΆˆλ³€ ν•„λ“œλ₯Ό λ³€κ²½ν•˜μ§€ λͺ»ν•΄ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€μ˜ 동기화가 μ–΄λ €μ›Œμ§„λ‹€.

Javaμ—μ„œλŠ” 보톡 private ν•„λ“œμ™€ getter, setter λ©”μ„œλ“œλ‘œ ν•„λ“œλ₯Ό λ³΄ν˜Έν•˜κ³ , 접근을 μ œν•œν•˜λŠ” 방식이 μΌλ°˜μ μ΄μ—ˆλ‹€. ν•˜μ§€λ§Œ μ½”ν‹€λ¦°μ—μ„œλŠ” getter와 setterλ₯Ό μžλ™μœΌλ‘œ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ—, 이λ₯Ό λŒ€μ‹ ν•΄ val둜 λΆˆλ³€μ„±μ„ ν™•λ³΄ν•˜κ±°λ‚˜, ν•„μš”ν•œ κ²½μš°μ—λ§Œ varλ₯Ό μ‚¬μš©ν•΄ νŠΉμ • μƒν™©μ—μ„œλ§Œ 값을 λ³€κ²½ν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

이런 섀계 κ΄€μ μ—μ„œ JPA μ—”ν‹°ν‹°λŠ” λ³€κ²½ κ°€λŠ₯ν•œ ν•„λ“œμ™€ λΆˆλ³€ ν•„λ“œλ₯Ό λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬ν•˜κ³ , λ„메인 둜직의 μ•ˆμ •μ„±μ„ κ³ λ €ν•΄ 섀계해야 ν•œλ‹€. λΆˆν•„μš”ν•œ 변경을 λ°©μ§€ν•˜λ €λ©΄, μ€‘μš”ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λ‹΄κΈ΄ ν•„λ“œλŠ” 가급적 val둜 μ„ μ–Έν•˜κ³ , ν•„μš”ν•œ κ²½μš°μ—λ§Œ var둜 λ³€κ²½ κ°€λŠ₯성을 μ—΄μ–΄λ‘λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.

 

 

 

 

 

마치며

이번 2μ£Ό μ°¨ κ³Όμ œμ—μ„œλ„ 1μ£Ό μ°¨ λ•Œμ™€ 같이 정말 λ§Žμ€ 뢀뢄을 κ³ λ―Όν•΄ 보고, λœ―μ–΄κ³ μ³λ³΄κ³  그랬던 것 κ°™λ‹€. κ·Έ κ³Όμ •μ—μ„œ λͺ°λžλ˜ 것을 κΉ¨λ‹«κ³ , κ°‡ν˜€ μžˆμ—ˆλ˜ 생각을 μ’€ 더 깨울 수 μžˆλŠ” μ‹œκ°„μ΄ λ˜μ—ˆλ‹€.

이제 3μ£Ό μ°¨λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ 주제둜 λ§ˆμ§€λ§‰ 10μ£Ό μ°¨κΉŒμ§€ λ””λ²¨λ‘­ν•˜λŠ” 과제둜 μ•Œκ³  μžˆλ‹€. 이번 1,2μ£ΌλŠ” 이 과제λ₯Ό μœ„ν•œ μ€€λΉ„ κ³Όμ •μ΄μ—ˆλ‹€ μƒκ°ν•˜κ³  남은 κ³Όμ œλ„ μ—΄μ‹¬νžˆ μ§„ν–‰ν•  μ˜ˆμ •μ΄λ‹€.

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'🏠 일상 > πŸ““ 일상 일기' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν•­ν•΄ ν”ŒλŸ¬μŠ€ μ΅œμ’… 회고 (+주차별 ν•™μŠ΅λ‚΄μš© 정리)  (1) 2024.12.15
Chapter 2λ₯Ό λŒμ•„λ³΄λ©° - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (5μ£Όμ°¨)  (2) 2024.10.25
μš”κ΅¬μ‚¬ν•­ 뢄석(μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨, ERD, API 섀계) - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (3μ£Όμ°¨)  (3) 2024.10.15
TDD, λ™μ‹œμ„± 처리 - ν•­ν•΄Β ν”ŒλŸ¬μŠ€ 회고 (1μ£Όμ°¨)  (3) 2024.09.29
ν•­ν•΄ ν”ŒλŸ¬μŠ€ λ°±μ—”λ“œ 6κΈ° - 회고 (0μ£Όμ°¨)  (3) 2024.09.22
'🏠 일상/πŸ““ 일상 일기' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • Chapter 2λ₯Ό λŒμ•„λ³΄λ©° - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (5μ£Όμ°¨)
  • μš”κ΅¬μ‚¬ν•­ 뢄석(μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨, ERD, API 섀계) - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (3μ£Όμ°¨)
  • TDD, λ™μ‹œμ„± 처리 - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (1μ£Όμ°¨)
  • ν•­ν•΄ ν”ŒλŸ¬μŠ€ λ°±μ—”λ“œ 6κΈ° - 회고 (0μ£Όμ°¨)
EastShine_
EastShine_
더 λ‚˜μ€ κ°œλ°œμžκ°€ 되기 μœ„ν•œ λ‚˜μ˜ 기둝 πŸ“
  • EastShine_
    개발.LOG πŸ’»
    EastShine_
  • 전체
    였늘
    μ–΄μ œ
  • 06-25 21:56
    • λΆ„λ₯˜ 전체보기 (27)
      • πŸ’» 개발 (21)
        • πŸ–₯️ 운영체제 (3)
        • 🌏 λ„€νŠΈμ›Œν¬ (0)
        • πŸ’Ύ Database (3)
        • πŸŽ› Java (0)
        • πŸ–² Javascript (0)
        • πŸ€ Spring (5)
        • 🎸 ETC (4)
        • πŸ“ˆ μ•Œκ³ λ¦¬μ¦˜ (3)
        • πŸ“– TIL (Today I Learned) (3)
      • 🏠 일상 (6)
        • πŸ““ 일상 일기 (6)
  • 인기 κΈ€

  • νƒœκ·Έ

    λŒ€κΈ°μ—΄
    spring
    e-book pdf μΆ”μΆœ
    6κΈ°
    transactionaleventlistener
    비관적락
    μ½”λ”©ν…ŒμŠ€νŠΈ
    e-book pdf λ³€ν™˜
    μ½˜μ„œνŠΈμ˜ˆμ•½μ„œλΉ„μŠ€
    Whisper API
    Python
    μ•Œκ³ λ¦¬μ¦˜
    λ°±μ—”λ“œ
    νŠΈλžœμž­μ…˜ 뢄리
    λ™μ‹œμ„±μ²˜λ¦¬
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    ν•­ν•΄ν”ŒλŸ¬μŠ€
    회고
    낙관적락
    redis
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.1
EastShine_
Clean Architecture - ν•­ν•΄ ν”ŒλŸ¬μŠ€ 회고 (2μ£Όμ°¨)
μƒλ‹¨μœΌλ‘œ

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