πŸ”κ²€μƒ‰ API μ΄λ ‡κ²Œ λ§Œλ“€μ—ˆμ–΄μš”!!

μž„κ·œμ„±Β·2025λ…„ 5μ›” 5일
1

ν•œ μŠ€ν…μ”© μ‹ μ€‘νžˆ

검색 κΈ°λŠ₯은 μ‚¬μš©μžκ°€ 뭘 μ›ν•˜λŠ”μ§€ λΆ€ν„° κΈ°λŠ₯이 μ •μ˜ λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.
λ”°λΌμ„œ UX섀계 -> UI섀계 -> API섀계 -> APIκ΅¬ν˜„ 각 Stepμ—μ„œμ˜ 고민이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

1. UX

μ–΄λ–€ 것을 μ‚¬μš©μžκ°€ μ›ν• κΉŒ?

λ‹¨μˆœνžˆ 검색 κΈ°λŠ₯을 κ°œλ°œν•œλ‹€κ°€ μ•„λ‹Œ μ‚¬μš©μžμ˜ μ§„μ •ν•œ NeedsλŠ” λ¬΄μ—‡μΌκΉŒμ—μ„œ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. 이후 3개둜 정리할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

πŸ” Need 1. ν˜„μž¬ μœ„μΉ˜μ—μ„œ κ°€κΉŒμš΄ μ£Όμ°¨μž₯을 μ•Œκ³  싢을 λ•Œ
β€œμ•½μˆ˜μ—­ κ·Όμ²˜μ— μ£Όμ°¨μž₯이 μžˆλ‚˜?”
βœ… μ‚¬μš©μžλŠ” 지도λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν•œ μ£Όλ³€ 탐색을 원함
βœ… 검색 없이도 ν˜„μž¬ μœ„μΉ˜ 쀑심 반경 μ£Όμ°¨μž₯ 쑰회 κΈ°λŠ₯ ν•„μš”


πŸ” Need 2. νŠΉμ • μž₯μ†Œ 근처의 μ£Όμ°¨μž₯을 μ•Œκ³  싢을 λ•Œ
β€œμ•½μˆ˜μ—­ νšŸμ§‘μ—μ„œ μΉœκ΅¬λ“€μ΄λž‘ λ§Œλ‚˜κΈ°λ‘œ ν–ˆλŠ”λ°, κ·Όμ²˜μ— μ£Όμ°¨μž₯ μžˆλ‚˜?”
βœ… μ‚¬μš©μžλŠ” κ°€κ²Œ/μž₯μ†Œλͺ…을 μž…λ ₯ν•˜κ³  κ·Έ μ£Όλ³€ μ£Όμ°¨μž₯을 νƒμƒ‰ν•˜κ³ μž 함
βœ… μž₯μ†Œ 검색 β†’ ν•΄λ‹Ή μœ„μΉ˜ μ€‘μ‹¬μœΌλ‘œ 지도 이동 β†’ μ£Όλ³€ μ£Όμ°¨μž₯ ν‘œμ‹œ
(λ°‘μ˜ UIλ₯Ό ν™•μΈν•˜λ©΄ 이해가 쉽닀..!!)


πŸ” Need 3. μ£Όμ°¨μž₯λͺ… "였제제%" 이름을 κ°€μ§€λŠ” μ£Όμ°¨μž₯
β€œκ·Έλ•Œ κ°”λ˜ μ£Όμ°¨μž₯이 β€˜μ˜€μ œμ œ μ£Όμ°¨μž₯β€™μ΄μ—ˆλ˜ 것 같은데…”
βœ… μ‚¬μš©μžλŠ” κΈ°μ–΅λ‚˜λŠ” 이름 μΌλΆ€λ§ŒμœΌλ‘œ κ²€μƒ‰ν•˜κ³  싢어함
βœ… ν…μŠ€νŠΈ 기반 μ£Όμ°¨μž₯λͺ… ν‚€μ›Œλ“œ 검색 κΈ°λŠ₯ 제곡 ν•„μš”


μ΄λ ‡κ²Œ μ‚¬μš©μžμ˜ Needs와 핡심 UXλ₯Ό μ„€κ³„ν–ˆκ³  ν•΄λ‹Ή μ•„λž˜μ— UI둜 κ΅¬ν˜„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

2. UI

UXλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ UI둜 μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜λŠ” κ²°κ³Ό μž…λ‹ˆλ‹€. 각 λΆ€μ—°μ„€λͺ…에 UXλ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν• μ§€κ°€ λ‚˜νƒ€λ‚˜μ Έ μžˆμŠ΅λ‹ˆλ‹€.


3. API 섀계

1. 병λͺ© λ°œμƒ μ˜ˆμƒ κ°€λŠ₯

ν‚€μ›Œλ“œ 검색 μ‹œ APIμ—μ„œ 검색 응닡을 μ€€λ‹€λ©΄ 1)μ£Όμ°¨μž₯ DB 탐색 2)카카였 둜컬 검색 APIν˜ΈμΆœμ„ ν•˜κ²Œ λ©λ‹ˆλ‹€.
1)μ£Όμ°¨μž₯ DB 탐색 μ™„λ£Œν–ˆμ§€λ§Œ 2)카카였 둜컬 검색 API호좜 진행쀑인 병λͺ©μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²°μ±…

APIλ₯Ό λ‘κ°œλ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€!!!

1. Mathing된 ν‚€μ›Œλ“œμ™€ 인덱슀 ν‘œμ‹œ

UI적으둜 ν‚€μ›Œλ“œμ™€ 맀칭된 ν•˜μ΄λΌμ΄νŒ…μ„ ν•˜κ²Œλœλ‹€λ©΄ 가독성이 μ’‹μ•„μ§ˆ κ²ƒμž…λ‹ˆλ‹€.
λ”°λΌμ„œ ν•΄λ‹Ή ν•„λ“œλ„ Response DTO에 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€!

응닡 JSON 일뢀

"parkingZones": [
      {
		      "matchedInfo": [
				  {
				    "field": "zoneName",
				    "value": "였제제 μ£Όμ°¨μž₯",
				    "matchedText": "였제제",
				    "startIndex": 0,
				    "endIndex": 2
				  },
				  {
				    "field": "cityName",
				    "value": "μ„œμšΈνŠΉλ³„μ‹œ",
				    "matchedText": "μ„œμšΈ",
				    "startIndex": 0,
				    "endIndex": 1
				  }
				]

4. κ΅¬ν˜„ λ°‘ μ½”λ“œ

TDDλ°©μ‹μ˜
RED -> GREEN -> REFACTORING
단계λ₯Ό μ€€μˆ˜ν•˜λ©° κ΅¬ν˜„ν•΄λƒˆμŠ΅λ‹ˆλ‹€.

1. Web client의 ν…ŒμŠ€νŠΈ

Web Client μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμš©ν•΄ μ™ΈλΆ€ APIλ₯Ό ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ
ν•΄λ‹Ή Web Clientλ₯Ό μ–΄λ–»κ²Œ λͺ¨ν‚Ήν•˜κ³  λ‹¨μœ„ν…ŒμŠ€νŠΈν• μ§€κ°€ 막막해 GPTν•œν…Œ 물어보고 ꡬ글 μ„œμΉ­μ„ 1μ‹œκ°„ λ„˜κ²Œ μ§„ν–‰ν–ˆκ³  κ²°κ΅­ MockWebServerλΌλŠ” 라이브러리λ₯Ό ν™œμš©ν–ˆμŠ΅λ‹ˆλ‹€.

직접 Mocking을 μ•„λ‹ˆμ§€λ§Œ μ™ΈλΆ€ API ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ§€ λ•Œ 맀우 μœ μš©ν•©λ‹ˆλ‹€!!

PR 링크

1) ν‚€μ›Œλ“œ 검색 μ½”λ“œ https://github.com/Team-Devmon-IN-KU/HonorsParking-BE/pull/80
2) 카카였 둜컬 검색 μ½”λ“œ : https://github.com/Team-Devmon-IN-KU/HonorsParking-BE/pull/87


Q1 : 카카였 검색을 λ„‰λ„‰ν•˜κ²Œ μ‚¬μš© κ°€λŠ₯ν•œκ°€?

1) 일간 10만 μΏΌν„° μ΄ˆκ³Όμ‹œ 유둜 μš”κΈˆ λ°œμƒ

ref : https://developers.kakao.com/docs/latest/ko/getting-started/quota

2) λ„‰λ„‰ν•œ 응닡 개수
넀이버 둜컬 검색은 μ΅œλŒ€ 5κ°œλ°–μ— 응닡을 받을 수 μ—†μ—ˆμ§€λ§Œ μ΅œλŒ€ 45개 데이터 μŠ΅λ“ κ°€λŠ₯

5. λŠλ‚€μ 

1) 본격적인 TDDκ°œλ°œμ„ ν•˜λ‹ˆ 쒀더 절차적인 κ°œλ°œμ„ ν•  수 μžˆμ—ˆλ‹€.
λ˜ν•œ ν…ŒμŠ€νŠΈκ°€ μ€‘μ μœΌλ‘œ κ°œλ°œμ„ ν•˜λ‹ˆ "ν”„λ‘œλ•νŠΈ μ½”λ“œμ—μ„œ νƒ€μ—½ν•˜μ§€ μ•Šκ²Œ" λ˜μ—ˆλ‹€.

2) UXλΆ€ν„° κΉŠμ€ 개발 μš”μ†ŒκΉŒμ§€ ν•΄κ°€λ©΄μ„œ λ°±μ—”λ“œ κ°œλ°œμžμ™Έ λ‹€λ₯Έ νŒŒνŠΈλ„ μΆ©λΆ„νžˆ μ–΄λ ΅κ³  μ‹ μ€‘ν•œ 선택이 ν•„μš”ν•¨μ„ μ•Œκ²Œλ˜μ—ˆλ‹€. 이λ₯Ό 기반으둜 μ•žμœΌλ‘œ 맑은 업무에 λŒ€ν•΄ μ±…μž„κ°μ„ 더 더할 수 μžˆμ„ 것 κ°™λ‹€.

profile
μ‚Άμ˜ μ§ˆμ„ λ†’μ—¬μ£ΌλŠ” 개발자

0개의 λŒ“κΈ€