Home > Troubleshooting > πŸ”[Troubleshooting] πŸš€ 검색 API: GET vs POST 방식 비ꡐ

πŸ”[Troubleshooting] πŸš€ 검색 API: GET vs POST 방식 비ꡐ
Troubleshooting Backend Development Spring Boot

πŸš€ 검색 API: GET vs POST 방식 비ꡐ

β€œκ²€μƒ‰(쑰회)은 λ‹Ήμ—°νžˆ GET μ•„λ‹ˆμ•Ό?” 라고 μƒκ°ν•˜λŠ” 것이 REST API의 κΈ°λ³Έ 원칙에 λŒ€ν•œ μ˜¬λ°”λ₯Έ μ΄ν•΄μž…λ‹ˆλ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  μ‹€λ¬΄μ—μ„œ 검색 κΈ°λŠ₯에 POSTλ₯Ό μ‚¬μš©ν•˜λŠ” λ°μ—λŠ” λͺ‡ κ°€μ§€ ν˜„μ‹€μ μΈ μ΄μœ κ°€ μžˆμŠ΅λ‹ˆλ‹€.


βœ… 원칙: 검색은 GET이 λ§žμŠ΅λ‹ˆλ‹€

λ©±λ“±μ„±(Idempotent)을 κ°€μ§€λŠ” λ‹¨μˆœ 쑰회 κΈ°λŠ₯은 GET λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 RESTful API의 원칙에 κ°€μž₯ λΆ€ν•©ν•©λ‹ˆλ‹€.

GET λ°©μ‹μ˜ μž₯점

  • λ©±λ“±μ„±: μ—¬λŸ¬ 번 ν˜ΈμΆœν•΄λ„ κ²°κ³Όκ°€ λ™μΌν•œ νŠΉμ„±. β€œμ„ μ‚¬μ‹œλŒ€β€λ₯Ό 100번 검색해도 항상 같은 κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.
  • 캐싱: GET μš”μ²­μ€ λΈŒλΌμš°μ €λ‚˜ λ„€νŠΈμ›Œν¬ μž₯λΉ„μ—μ„œ 캐싱될 수 μžˆμ–΄ μ„±λŠ₯에 이점이 μžˆμŠ΅λ‹ˆλ‹€.
  • 뢁마크 및 곡유: URL μžμ²΄μ— 검색 쑰건이 ν¬ν•¨λ˜μ–΄ (?q=μ„ μ‚¬μ‹œλŒ€) 링크λ₯Ό λΆλ§ˆν¬ν•˜κ±°λ‚˜ λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ κ³΅μœ ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

πŸ€” ν˜„μ‹€: μ™œ POSTλ₯Ό μ‚¬μš©ν• κΉŒμš”?

μ΄λ‘ μ μœΌλ‘œλŠ” GET이 λ§žμ§€λ§Œ, λ‹€μŒκ³Ό 같은 GET의 ν•œκ³„ λ•Œλ¬Έμ— μ‹€λ¬΄μ—μ„œλŠ” POSTλ₯Ό μ‚¬μš©ν•˜κ³€ ν•©λ‹ˆλ‹€.

1. 검색 쑰건이 λ³΅μž‘ν•˜κ³  κΈΈμ–΄μ§ˆ λ•Œ

λ§Œμ•½ 검색 쑰건이 λ‹¨μˆœνžˆ chapterName ν•˜λ‚˜κ°€ μ•„λ‹ˆλΌ, μ—¬λŸ¬ ν•„ν„°λ₯Ό μ‘°ν•©ν•΄μ•Ό ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”?

λ³΅μž‘ν•œ 검색 μ˜ˆμ‹œ

  • β€œμ„ μ‚¬μ‹œλŒ€β€ 챕터 μ€‘μ—μ„œ
  • β€œκ΅¬μ„κΈ°β€ λ˜λŠ” β€œμ‹ μ„κΈ°β€ μ‹œλŒ€μ˜ 유물 쀑
  • νŠΉμ • μ§€μ—­(β€œμ—°μ²œ 전곑리”)μ—μ„œ λ°œκ²¬λ˜μ—ˆκ³ 
  • λ“±λ‘λœ μ§€ 1λ…„ 이내인 데이터

GET λ°©μ‹μ˜ 문제점

URL이 μ•„λž˜μ²˜λŸΌ 맀우 κΈΈκ³  λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€.

/api/search?chapter=μ„ μ‚¬μ‹œλŒ€&type=유물&periods=ꡬ석기&periods=신석기&region=μ—°μ²œ 전곑리&registeredAfter=2024-10-07...

가독성이 λ–¨μ–΄μ§€κ³  κ΄€λ¦¬ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

POST λ°©μ‹μ˜ ν•΄κ²°

λ™μΌν•œ 검색 쑰건을 JSON Body에 λ‹΄μ•„ 보내면 훨씬 ꡬ쑰적이고 λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{
  "chapterName": "μ„ μ‚¬μ‹œλŒ€",
  "type": "유물",
  "periods": ["ꡬ석기", "신석기"],
  "region": "μ—°μ²œ 전곑리",
  "registeredAfter": "2024-10-07"
}

2. URL 길이 μ œν•œ

문제점

λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €μ™€ μ›Ή μ„œλ²„λŠ” URL의 길이λ₯Ό μ•½ 2000자 λ‚΄μ™Έλ‘œ μ œν•œν•©λ‹ˆλ‹€.

λ³΅μž‘ν•œ 검색 μ‘°κ±΄μ΄λ‚˜, μ—¬λŸ¬ 개의 ID λͺ©λ‘μœΌλ‘œ κ²€μƒ‰ν•˜λŠ” 경우 이 길이λ₯Ό μ‰½κ²Œ μ΄ˆκ³Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

POST λ°©μ‹μ˜ ν•΄κ²°

HTTP POST μš”μ²­μ˜ BodyλŠ” URL 길이 μ œν•œκ³Ό λ¬΄κ΄€ν•˜λ―€λ‘œ, 훨씬 더 λ§Žμ€ μ–‘μ˜ 검색 쑰건을 μ•ˆμ „ν•˜κ²Œ μ„œλ²„λ‘œ 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.


3. λ³΄μ•ˆ 및 민감 정보

문제점

GET μš”μ²­μ€ λͺ¨λ“  검색 쑰건이 URL에 κ·ΈλŒ€λ‘œ λ…ΈμΆœλ©λ‹ˆλ‹€.

μ΄λŠ” λΈŒλΌμš°μ € λ°©λ¬Έ 기둝, μ›Ή μ„œλ²„ 둜그, 곡유된 링크 등에 λ―Όκ°ν•œ 정보(예: μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ, 개인 이름)κ°€ κ·ΈλŒ€λ‘œ 남을 수 μžˆλ‹€λŠ” λ³΄μ•ˆμ  약점을 κ°€μ§‘λ‹ˆλ‹€.

POST λ°©μ‹μ˜ ν•΄κ²°

POST μš”μ²­μ˜ BodyλŠ” URL에 λ“œλŸ¬λ‚˜μ§€ μ•ŠμœΌλ―€λ‘œ, λ―Όκ°ν•œ 정보λ₯Ό λ‹΄μ•„ 검색해야 ν•  λ•Œ 훨씬 μ•ˆμ „ν•œ λ°©λ²•μž…λ‹ˆλ‹€.


πŸ“Š 비ꡐ 정리

Β  GET (이상적) POST (ν˜„μ‹€μ /μ‹€μš©μ )
μž₯점 β€’ REST 원칙 λΆ€ν•©
β€’ 캐싱 κ°€λŠ₯
β€’ 뢁마크/곡유 용이
β€’ λ³΅μž‘ν•œ 쑰건 ν‘œν˜„
β€’ 길이 μ œν•œ μ—†μŒ
β€’ λ³΄μ•ˆμ— 유리
단점 β€’ λ³΅μž‘ν•œ 쑰건 ν‘œν˜„ 어렀움
β€’ URL 길이 μ œν•œ
β€’ λ³΄μ•ˆ μ·¨μ•½
β€’ REST 원칙 μœ„λ°° κ°€λŠ₯μ„±
β€’ 캐싱 λΆˆκ°€
β€’ 뢁마크/곡유 λΆˆκ°€
μΆ”μ²œ μš©λ„ λ‹¨μˆœν•œ ν‚€μ›Œλ“œ 검색
ID둜 단건 쑰회
λ³΅μž‘ν•œ 필터링
닀쀑 쑰건 검색
민감 정보 검색

πŸ’‘ κ²°λ‘ 

β€œλ‹¨μˆœ 검색은 GET, λ³΅μž‘ν•œ 검색은 POST”

이번 경우처럼 λ‹¨μˆœνžˆ chapterName ν•˜λ‚˜λ§ŒμœΌλ‘œ κ²€μƒ‰ν•œλ‹€λ©΄ GETμœΌλ‘œλ„ μΆ©λΆ„ν•˜μ§€λ§Œ, μ•žμœΌλ‘œ 이 검색 κΈ°λŠ₯이 더 λ³΅μž‘ν•΄μ§ˆ κ°€λŠ₯성을 염두에 두고 ν™•μž₯성을 μœ„ν•΄ POSTλ₯Ό μ„ νƒν•˜λŠ” 것은 맀우 μ‹€μš©μ μ΄κ³  ν˜„λͺ…ν•œ 섀계 결정일 수 μžˆμŠ΅λ‹ˆλ‹€.