πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦ Project/πŸ“Ί KIOSEK

λ‹¨μœ„ ν…ŒμŠ€νŠΈ, 톡합 ν…ŒμŠ€νŠΈμ— λŒ€ν•œ λ°©ν–₯ 작기

DevPoong 2023. 5. 16. 19:26

1. ν…ŒμŠ€νŠΈμ— λŒ€ν•΄μ„œ κ³΅λΆ€ν•˜κ²Œ 된 계기

κΈ°μ‘΄μ—λŠ” ν…ŒμŠ€νŠΈλ₯Ό API κ΅¬ν˜„ μ™„λ£Œ ν›„ Postman으둜 ꡬ동 확인 μœ„μ£Όλ‘œ ν•˜μ˜€λ‹€.
ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방법도 λͺ°λžκ³  μ€‘μš”μ„±λ„ 크게 λͺ°λžμ—ˆλ‹€.

 

ν•˜μ§€λ§Œ μ΄λ²ˆμ—λŠ” μ‹€μ œ μ„œλΉ„μŠ€ ν•΄μ•Όν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄κ³  μ„œλΉ„μŠ€ν›„μ—λ„ 계속 μˆ˜μ •μ‚¬ν•­μ΄ λ°œμƒν•  것이기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•΄λ†“μ§€ μ•ŠλŠ”λ‹€λ©΄ 정말 νž˜λ“€μ–΄μ§ˆ 것 κ°™λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

 

ν•˜μ§€λ§Œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μ–΄λ–»κ²Œ ν•˜λŠ” 것인지? λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈμ˜ 차이가 무엇인지? μ „ν˜€ λͺ°λžλ‹€.
λ”°λΌμ„œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ λΌλŠ” 책을 읽고 μ˜ˆμ‹œ 상황을 정리해보며 생각을 정리해봀닀.


2. λ‹¨μœ„ ν…ŒμŠ€νŠΈλž€?

μ •μ˜
λͺ¨λ“ˆμ΄λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 내뢀에 μžˆλŠ” μž‘μ€ μ½”λ“œ 쑰각이 μ˜ˆμƒκ³Ό λ˜‘κ°™μ΄ λ™μž‘ν•˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” 반볡적인 ν–‰μœ„

속성

- ν”„λ‘œκ·Έλž¨μ˜ μž‘μ€ μ½”λ“œ 쑰각 λ‹¨μœ„λ₯Ό 검증
- λΉ λ₯΄κ³  μ‹ μ†ν•˜κ²Œ μˆ˜ν–‰
- 격리된 λ°©μ‹μœΌλ‘œ 처리

μ‚¬μš©ν•  수 μžˆλŠ” 도ꡬ

Junit5, Mockito( BDDMockito !! )

μ•„μ§κΉŒμ§€λŠ” λ‹¨μœ„ν…ŒμŠ€νŠΈκ°€ 뭔지 이해가 잘 μ•ˆκ°„λ‹€.
μ–΄λ–»κ²Œ μž‘μ€ μ½”λ“œ 쑰각으둜 λ‚˜λˆ„μ–΄μ•Ό ν•˜κ³  κ²©λ¦¬μ‹œμΌœμ•Ό ν•˜λŠ” 것인지..


3. λ‹¨μœ„ ν…ŒμŠ€νŠΈμ— λŒ€ν•œ 해석 차이

μ—­μ‹œλ‚˜ μ •μ˜λ§Œ 보면 ν•΄μ„μ˜ 차이가 생길 수 밖에 μ—†λ‹€.
λ‹¨μœ„ ν…ŒμŠ€νŠΈμ— λŒ€ν•œ ν•΄μ„μ˜ 차이λ₯Ό 두고 λŸ°λ˜νŒŒμ™€ κ³ μ „νŒŒκ°€ λ‚˜λ‰˜κ²Œ λœλ‹€.

✏️ λŸ°λ˜νŒŒμ™€ κ³ μ „νŒŒ - "μž‘μ€μ½”λ“œμ‘°κ°"의 κΈ°μ€€ 차이

λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν”„λ‘œκ·Έλž¨μ˜ μž‘μ€ μ½”λ“œ 쑰각 λ‹¨μœ„λ‘œ κ²€μ¦ν•˜λŠ” 것이라고 ν–ˆλ‹€. 이에 λŒ€ν•œ 의견이 λ‚˜λ‰œλ‹€.

λŸ°λ˜νŒŒλŠ” μž‘μ€ μ½”λ“œμ‘°κ°μ„ ν…ŒμŠ€νŠΈ λŒ€μƒ 단일 클래슀 λ˜λŠ” ν•΄λ‹Ή 클래슀 λ‚΄μ˜ λ©”μ„œλ“œ 둜 λ³Έλ‹€.
ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλΌλŠ” λ‹¨μœ„μ— μ§‘μ€‘ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

κ³ μ „νŒŒλŠ” μž‘은 μ½”λ“œ 쑰각을 ν…ŒμŠ€νŠΈ λŒ€μƒμ˜ 곡유 μ˜μ‘΄μ„±μ„ 가지지 μ•Šμ€ ν˜‘λ ₯자λ₯Ό ν¬ν•¨ν•œ μ—¬λŸ¬ 클래슀 둜 λ³Έλ‹€.
λ™μž‘ λ‹¨μœ„μ— μ§‘μ€‘ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

곡유 μ˜μ‘΄μ„±μ€ DBλ‚˜ File Systemκ³Ό 같이 ν…ŒμŠ€νŠΈκ°„μ— 영ν–₯을 λ―ΈμΉ  수 μžˆλŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν•˜λŠ” μ˜μ‘΄μ„±μ„ μ˜λ―Έν•œλ‹€.

μ—¬κΈ°κΉŒμ§€λ§Œ 보더라도 λŸ°λ˜νŒŒκ°€ 더 꼼꼼히 ν…ŒμŠ€νŠΈν•˜λŠ”κ²ƒ 처럼 λ³΄μ΄μ§€λ§Œ λ„ˆλ¬΄ λ”±λ”±ν•œ λ°©μ‹μ΄λ‹€λŠ”κ²ƒμ„ μ•Œ 수 μžˆλ‹€.

 

✏️ λŸ°λ˜νŒŒμ™€ κ³ μ „νŒŒ  μš”μ•½

1. 런던파
- ν…ŒμŠ€νŠΈ λŒ€μƒ 클래슀λ₯Ό ν˜‘λ ₯μžλ‘œλΆ€ν„° 격리
- λΆˆλ³€ μ˜μ‘΄μ„± μ™Έμ˜ λͺ¨λ“  μ˜μ‘΄μ„±μ„ λŒ€μ—­μœΌλ‘œ λŒ€μ²΄

2. κ³ μ „νŒŒ
- 각각의 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œλ₯Ό μ„œλ‘œ κ°„μ„­μ—†κ²Œ 격리
- 곡유 μ˜μ‘΄μ„±λ§Œ λŒ€μ—­μœΌλ‘œ λŒ€μ²΄


4. OrderServiceλ₯Ό λŸ°λ˜νŒŒμ™€ κ³ μ „νŒŒκ°€ ν…ŒμŠ€νŠΈν•œλ‹€λ©΄?

EX) μ˜ˆμ‹œ μƒν™©μœΌλ‘œ μ•„λž˜μ™€ 같이 OrderServiceμ—μ„œ OrderRepositoryλ₯Ό μ°Έμ‘°ν•˜κ³  Order에 μ˜μ‘΄ν•˜κ³  μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.
OrderλŠ” λ‚΄λΆ€μ μœΌλ‘œ OrderItemλ₯Ό μ°Έμ‘°ν•˜κ³ , OrderItem은 Item을 μ°Έμ‘°ν•˜κ³  μžˆλ‹€.

 

Case1. λ‚΄κ°€ 런던파인 경우

곡유 μ˜μ‘΄μ„±μΈ OrderRepository와 λ³€κ²½ κ°€λŠ₯ μ˜μ‘΄μ„±μΈ Order 클래슀λ₯Ό Mock으둜 λŒ€μ²΄ν•˜μ—¬ ν…ŒμŠ€νŠΈν•œλ‹€.

μ΄λ ‡κ²Œ 되면 OrderRepositoryλŠ” λ¬Όλ‘ , Order 클래슀 λ‚΄λΆ€λ₯Ό μ „ν˜€ ν…ŒμŠ€νŠΈν•  수 μ—†κ³  λ”°λ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 

 

Case2. λ‚΄κ°€ κ³ μ „νŒŒμΈ 경우

곡유 μ˜μ‘΄μ„±μΈ OrderRepositoryλ₯Ό Mock으둜 λŒ€μ²΄ν•œ 것은 λŸ°λ˜νŒŒμ™€ λ™μΌν•˜λ‹€.

ν•˜μ§€λ§Œ, λ³€κ²½ κ°€λŠ₯ μ˜μ‘΄μ„±μΈ Order의 κ²½μš°μ—λŠ” λŒ€μ²΄ ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ μ—°κ²°ν•˜μ—¬ ν…ŒμŠ€νŠΈν•œλ‹€λŠ” 점이 λ‹€λ₯΄λ‹€.


5. λ‚˜λŠ” κ³ μ „νŒŒμ΄λ‹€!

런던파 μ£Όμž₯ 1. ν…ŒμŠ€νŠΈκ°€ 맀우 μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λ‰˜μ–΄ μžˆμ–΄ ν•œ ν΄λž˜μŠ€μ—λ§Œ 집쀑할 수 μžˆλ‹€.
-> λ°˜λ°•:
  ν…ŒμŠ€νŠΈλŠ” μ½”λ“œμ˜ λ‹¨μœ„κ°€ μ•„λ‹Œ λ™μž‘μ˜ λ‹¨μœ„μ— Focus ν•˜λŠ”κ²Œ 이상적이라고 μƒκ°ν•œλ‹€.

런던파 μ£Όμž₯ 2. 객체 κ·Έλž˜ν”„κ°€ λ³΅μž‘ν•΄μ Έλ„ λŒ€μ—­μœΌλ‘œ λŒ€μ²΄λ˜κΈ° λ•Œλ¬Έμ— 상관이 μ—†λ‹€.
-> λ°˜λ°•:
κ³ μ „νŒŒλ₯Ό λ”°λ₯Έλ‹€λ©΄ ν…ŒμŠ€νŠΈ λŒ€μƒμ˜ ν˜‘λ ₯자인 객체 κ·Έλž˜ν”„λ₯Ό λͺ¨λ‘ 생성해야 ν•˜λ―€λ‘œ μž‘μ—…μ΄ λ§Žλ‹€κ³  생각할 수 μžˆλ‹€.
ν•˜μ§€λ§Œ, 이걸 μƒκ°ν•˜κΈ° μ „ 객체 κ·Έλž˜ν”„κ°€ λ„ˆλ¬΄ λ³΅μž‘ν•΄μ§€λŠ” κ²½μš°μ—λŠ” 섀계 문제λ₯Ό μ˜μ‹¬ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•œλ‹€.

런던파 μ£Όμž₯ 3. ν…ŒμŠ€νŠΈ μ‹€νŒ¨μ‹œ λŒ€μƒ 클래슀만 ν™•μΈν•˜λ©΄ λ˜λ―€λ‘œ 원인 νŒŒμ•…μ΄ 쉽닀.
-> λ°˜λ°•:
  κ³ μ „νŒŒλ₯Ό λ”°λ₯Έλ‹€λ©΄ 버그가 μžˆλŠ” 클래슀λ₯Ό μ°Έμ‘°ν•˜λŠ” λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•  μˆ˜λ„ 있긴 ν•˜λ‹€.
ν•˜μ§€λ§Œ, 이 κ²½μš°μ—λŠ” μ›λž˜ μ„±κ³΅ν•˜λ˜ ν…ŒμŠ€νŠΈκ°€ μžˆμ—ˆκ³  κ°‘μžκΈ° μ‹€νŒ¨ν•œλ‹€λ©΄ 방금 λ‚΄κ°€ 고쳀던 μ½”λ“œμ— μ˜ν•œ κ²ƒμ΄λ―€λ‘œ 원인 νŒŒμ•…μ΄ 어렡지 μ•Šλ‹€.

 

μœ„μ˜ μ΄μœ μ™€ ν•¨κ»˜ ν”„λ‘œκ·Έλž˜λ°μ€ 효율적인 뢀뢄도 챙겨야 ν•œλ‹€κ³  μƒκ°ν•˜κΈ°μ— λ‚˜λŠ” κ³ μ „νŒŒλ₯Ό λ”°λ₯΄κΈ°λ‘œ ν–ˆλ‹€.
λ¬Όλ‘ , 정말 μ€‘μš”ν•œ 도메인이고 도메인 둜직이 ν’λΆ€ν•˜λ©΄ Orderλ₯Ό λ”°λ‘œ ν…ŒμŠ€νŠΈν•  μˆ˜λ„ μžˆλ‹€κ³  μƒκ°ν•œλ‹€. (런던파λ₯Ό 쑴쀑)


6. λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μ•Œκ² κ³ , 톡합 ν…ŒμŠ€νŠΈλŠ” 뭐지?

λ‹¨μœ„ν…ŒμŠ€νŠΈλ§ŒμœΌλ‘œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ œλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ μ•Œ 수 μžˆλŠ” 방법이 μ—†λ‹€.
μ™œλƒν•˜λ©΄ λ‚΄κ°€ Mock으둜 곡유 μ˜μ‘΄μ„±μ„ λŠμ–΄λƒˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 톡해 λ‚΄ 도메인과 μ„œλΉ„μŠ€λ₯Ό ν’λΆ€ν•˜κ²Œ ν…ŒμŠ€νŠΈν•˜μ˜€λ‹€λ©΄ μ΄μ œλŠ” DBλ‚˜ νŒŒμΌ μ‹œμŠ€ν…œκ³Ό 같은 곡유 μ˜μ‘΄μ„±μ„ μ—°κ²°ν•˜μ—¬ 톡합적인 ν…ŒμŠ€νŠΈλ₯Ό ν•˜λŠ”κ²ƒμ΄ μ€‘μš”ν•˜λ‹€.

 

Presentation λ˜λŠ” Service Layerλ₯Ό λŒ€μƒμœΌλ‘œ 곡유 μ˜μ‘΄μ„±μ„ μ—°κ²°ν•˜μ—¬ 톡합 ν…ŒμŠ€νŠΈλ₯Ό ν•  수 μžˆλ‹€.
일반적으둜 κ°€μž₯ κΈ΄ μ£Όμš” 흐름과 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—μ„œλŠ” κ²€μ¦ν•˜μ§€ λͺ»ν•œ μ˜ˆμ™Έ 상황을 λͺ¨λ‘ 닀루면 λœλ‹€.
(λ¬Όλ‘  Repositoryλ§Œμ„ λ”°λ‘œ ν…ŒμŠ€νŠΈν•  μˆ˜λ„ μžˆλ‹€.)

 

ν†΅ν•©ν…ŒμŠ€νŠΈλ„ 기쀀이 λͺ¨ν˜Έν•˜λ‹€κ³  생각할 수 μžˆλ‹€. ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같이 λ‹¨μœ„ν…ŒμŠ€νŠΈμ™€ 비ꡐ할 수 μžˆλ‹€.

 

λ‹¨μœ„ν…ŒμŠ€νŠΈλŠ” 단일 λ™μž‘μ„ κ²€μ¦ν•˜κ³ , λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•˜κ³ , λ‹€λ₯Έ ν…ŒμŠ€νŠΈμ™€ κ²©λ¦¬λ˜μ–΄ μ‹€ν–‰ν•œλ‹€λŠ” μš”κ΅¬μ‚¬ν•­μ΄ μžˆμ—ˆλ‹€.
ν†΅ν•©ν…ŒμŠ€νŠΈλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ μš”κ΅¬μ‚¬ν•­μ„ ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ©΄ ν†΅ν•©ν…ŒμŠ€νŠΈλΌκ³  생각할 수 μžˆλ‹€.

 

λ¬Όλ‘  톡합 ν…ŒμŠ€νŠΈλ„ μž‘μ„±ν•΄μ•Όν•˜μ§€λ§Œ μ™ΈλΆ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό λͺ¨λ‘ μ—°κ²°ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ”κ²ƒμ€ λΉ„μš©μ΄ 많이 λ“€κ³  λŠλ¦¬λ‹€.
λ”°λΌμ„œ, ν†΅ν•©ν…ŒμŠ€νŠΈλ³΄λ‹€ λΉ„μš©μ΄ μ €λ ΄ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 더 많이 μž‘μ„±ν•˜λ €κ³  ν•΄μ•Όν•œλ‹€. 


7. 톡합 ν…ŒμŠ€νŠΈ μ™ΈλΆ€ μ˜μ‘΄μ„± μ’…λ₯˜

관리 μ˜μ‘΄μ„±
- λŒ€ν‘œμ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€κ°€ 있으며, 관리 μ˜μ‘΄μ„±μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 있으며, ν•΄λ‹Ή μ˜μ‘΄μ„±κ³Όμ˜ μƒν˜Έ μž‘μš©μ€ μ™ΈλΆ€ ν™˜κ²½μ—μ„œ λ³Ό 수 μ—†λ‹€.

비관리 μ˜μ‘΄μ„±
- λŒ€ν‘œμ μœΌλ‘œ SMTPκ°€ 있으며, ν•΄λ‹Ή μ˜μ‘΄μ„±κ³Όμ˜ μƒν˜Έ μž‘μš©μ„ μ™ΈλΆ€μ—μ„œ λ³Ό 수 μžˆλ‹€. 

관리 μ˜μ‘΄μ„±μ€ μ‹€μ œ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ 되고, 비관리 μ˜μ‘΄μ„±μ€ Mock으둜 λŒ€μ²΄ν•˜μ—¬ ν†΅ν•©ν…ŒμŠ€νŠΈν•œλ‹€.

 

ν˜„μž¬ κ°œλ°œν•˜κ³  μžˆλŠ” ν”Œλž«νΌμ—λ„ 넀이버 SMTPλ₯Ό μ΄μš©ν•œ 이메일 인증과 같은 κΈ°λŠ₯이 μžˆλ‹€. μ΄λŸ¬ν•œ 뢀뢄에 λŒ€ν•΄μ„œλŠ” μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈ 해야할지 λ§‰λ§‰ν•˜λ‹€.
이 뢀뢄에 λŒ€ν•΄μ„œλŠ” Mock으둜 λŒ€μ²΄ν•˜κ³  End To End ν…ŒμŠ€νŠΈμ—μ„œ 확인 ν•˜λ©΄ μΆ©λΆ„ν•˜λ‹€κ³  μƒκ°ν•œλ‹€.


✏️ ν›„κΈ°

ν…ŒμŠ€νŠΈλ₯Ό μ–΄λ–»κ²Œ 해야할지 μ „ν˜€ 감을 λͺ»μž‘κ³  μžˆμ—ˆλŠ”λ° μ±…μ΄λ‚˜ μ—¬λŸ¬ κ°•μ˜ 자료λ₯Ό 보고 λ°©ν–₯을 작게 λ˜μ—ˆλ‹€.

톡합 ν…ŒμŠ€νŠΈλ§Œ ν•˜λ©΄ λ˜λŠ”κ±°μ§€ μ™œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ”κ±°μ§€? 라고 μƒκ°ν–ˆμ§€λ§Œ μ˜€μ‚°μ΄μ—ˆλ‹€.

 

μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œ νŠΉμ • λΆ€λΆ„ μ½”λ“œλ₯Ό κ³ μΉ˜κ±°λ‚˜ μΆ”κ°€ν• μ‹œμ— 톡합 ν…ŒμŠ€νŠΈλ§Œ μ‘΄μž¬ν•œλ‹€λ©΄ DB와 κ΄€λ ¨λœ 뢀뢄이 μ•„λ‹ˆλ”λΌλ„ ν…ŒμŠ€νŠΈν•  λ•Œ DBλ₯Ό μ—°κ²°ν•΄μ•Ό ν•˜λ©° λ§Žμ€ λ¦¬μ†ŒμŠ€κ°€ μΆ”κ°€λ‘œ λ°œμƒν•œλ‹€.

 

λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” 속도가 훨씬 λΉ λ₯΄κ³  DB와 κ΄€λ ¨λœ μ½”λ“œλ₯Ό μ œμ™Έν•˜κ³  ν…ŒμŠ€νŠΈν•  수 μžˆμ–΄μ„œ λ‚΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ§Œ μž‘μ€ λ‹¨μœ„λ‘œ 검증할 수 있기 λ•Œλ¬Έμ— κΌ­ ν•„μš”ν•œ ν…ŒμŠ€νŠΈλΌλŠ”κ±Έ μ•Œκ²Œ λ˜μ—ˆλ‹€.