κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ˜ μ˜€ν”ˆ APIλŠ” λ§Žμ€ μ›Ή μ„œλΉ„μŠ€λ‚˜ μ‹œμŠ€ν…œμ—μ„œ ν™œμš©ν•  수 μžˆλŠ” 데이터λ₯Ό μ œκ³΅ν•˜κ³  μžˆμ–΄μ„œ μ›Ή κ°œλ°œμžλ“€μ—κ²Œ ν•„μˆ˜μ μœΌλ‘œ 연동을 μš”κ΅¬ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. λ§Žμ€ κΈ°μ—…μ—μ„œ μ˜€ν”ˆ APIλ₯Ό ν™œμš©ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— 수 λ§Žμ€ μ›Ή κ°œλ°œμžκ°€ μ˜€ν”ˆ API에 λŒ€ν•œ 연동 였λ₯˜ λ•Œλ¬Έμ— νž˜λ“€μ–΄ν–ˆλ‹€. μ§€κΈˆμ€ 인증킀 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž URL μΈμ½”λ”©λœ 킀와 원본을 κ΅¬λ³„ν•΄μ„œ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— OpenAPI ν™œμš© μžμ²΄λŠ” 어렀움이 μ—†λ‹€κ³  생각이 λœλ‹€. λ§Œμ•½, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” 개발자라면 μΈμ½”λ”©λ˜μ§€ μ•Šμ€ 인증킀(Decoding)을 λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

ν•˜μ§€λ§Œ, κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ˜ μ˜€ν”ˆ APIκ°€ μ›Ή κ°œλ°œμžλ“€μ„ κ΄΄λ‘­νžˆλŠ” λ¬Έμ œλŠ” 생각보닀 λ§Žμ€λ° ν•¨κ»˜ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

간헐적 SERVICE_KEY_IS_NOT_REGISTERED_ERROR 였λ₯˜

곡곡데이터 ν¬ν„Έμ˜ μžμ£Όν•˜λŠ” 질문 쀑 μ„œλΉ„μŠ€ 였λ₯˜μ— λŒ€ν•œ λ‚΄μš©μœΌλ‘œ SERVICE_KEY_IS_NOT_REGISTERED_ERROR 였λ₯˜μ— λŒ€ν•œ 원인을 κ°„λ‹¨ν•˜κ²Œ μ†Œκ°œν•˜κ³  μžˆλ‹€. 잘λͺ»λœ 인증킀λ₯Ό λ„£μ–΄μ„œ ν˜ΈμΆœν•˜μ˜€κ±°λ‚˜ 인증 κΈ°κ΄€ μ„œλ²„λ‘œ λ™κΈ°ν™”λ˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•œλ‹€κ³  λ˜μ–΄μžˆλ‹€. ν•΄λ‹Ή 인증킀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μƒμ μœΌλ‘œ OpenAPIλ₯Ό ν˜ΈμΆœν•  수 μžˆμ—ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  λͺ‡ 초 λ§Œμ— 인증킀가 μ˜¬λ°”λ₯΄μ§€ μ•Šλ‹€λŠ” 였λ₯˜κ°€ κ°„ν—μ μœΌλ‘œ λ°œμƒν•˜κΈ°λ„ ν•œλ‹€.

ν†΅μΌλ˜μ§€ μ•Šμ€ μ˜€ν”ˆ API μ°Έκ³  λ¬Έμ„œ

μ˜€ν”ˆ API에 λŒ€ν•œ μ°Έκ³  λ¬Έμ„œμ˜ ν˜•μ‹μ„ κ°•μ œν•˜μ§€ μ•ŠλŠ” 결과둜 λ§Žμ€ κΈ°μ—…μ—μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν™•μž₯자인 .hwp둜 μž‘μ„±λ˜μ–΄ κ³΅μœ λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. 그둜 인해 μ›Ή κ°œλ°œμžλ“€μ€ ν•œκΈ€ λ¬Έμ„œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  ν•œκΈ€ λ¬Έμ„œλ₯Ό μ—΄ 수 μžˆλŠ” λ·°μ–΄λ₯Ό μ„€μΉ˜ν•΄μ•Όλ§Œ ν•œλ‹€. κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ˜ μ˜€ν”ˆ API μ€‘μ—λŠ” Swagger UI 기반의 OpenAPI λͺ…μ„Έμ„œλ₯Ό μ œκ³΅ν•˜κΈ°λ„ ν•œλ‹€.

ν•΄μ™Έ 아이피 μš”μ²­ μ œν•œ

κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ—μ„œ μ œκ³΅ν•˜λŠ” λͺ¨λ“  μ˜€ν”ˆ API에 ν•΄λ‹Ήν•˜λŠ” λ¬Έμ œλŠ” μ•„λ‹ˆμ§€λ§Œ μ˜€ν”ˆ API 쀑 λ³΄μ•ˆ 상 κ΅­λ‚΄ 아이피 λŒ€μ—­μ΄ μ•„λ‹Œ ν•΄μ™Έ μ•„μ΄ν”Όμ—μ„œ ν˜ΈμΆœν•˜λŠ” 것이 μ›Ή λ°©ν™”λ²½μœΌλ‘œ λ§‰ν˜€μ ΈμžˆλŠ” κ²½μš°λ„ μžˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ ν•œκ΅­μ „λ ₯κ±°λž˜μ†Œμ—μ„œ μ œκ³΅ν•˜λŠ” μ˜€ν”ˆ API둜 μ°Έκ³  λ¬Έμ„œμ— λ‚˜μ™€μžˆμ§€ μ•Šμ€ λ‚΄μš©μ΄μ§€λ§Œ κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ˜ κ²Œμ΄νŠΈμ›¨μ΄ 방식이 μ•„λ‹Œ KPXμ—μ„œ κ΄€λ¦¬ν•˜λŠ” μ„œλ²„λ‘œ μš”μ²­λ˜κΈ° λ•Œλ¬Έμ— AWS와 같은 ν΄λΌμš°λ“œ ν™˜κ²½μ—μ„œ ν˜ΈμΆœν•  수 μ—†κ³  κ΅­λ‚΄ μ„œλΉ„μŠ€λ‘œ μš°νšŒν•˜κ±°λ‚˜ μ‚¬μš©μ€‘μΈ 아이피 λŒ€μ—­μ„ μ „λ‹¬ν•˜μ—¬ λ°©ν™”λ²½ ν•΄μ œ 신청을 ν•΄μ•Όν•œλ‹€.

κ²Œμ΄νŠΈμ›¨μ΄ 방식 μ˜€ν”ˆ API

κ³΅κ³΅λ°μ΄ν„°ν¬ν„Έμ˜ κ²Œμ΄νŠΈλ°©μ‹ μ˜€ν”ˆ APIλŠ” μ—”λ“œν¬μΈνŠΈκ°€ apis.data.go.kr와 같이 κ΅¬μ„±λ˜λ©° μœ„μ—μ„œ 확인할 수 μžˆλ“―μ΄ κ²Œμ΄νŠΈμ›¨μ΄μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μ˜€ν”ˆ APIκ°€ JSON νƒ€μž…μ˜ 응닡 κ²°κ³Όλ₯Ό μ§€μ›ν•˜λ”λΌλ„ XML둜만 좜λ ₯λœλ‹€λŠ” μ œμ•½μ‚¬ν•­μ΄ μžˆλ‹€. μ΄λŸ¬ν•œ μ œμ•½μ‚¬ν•­μ„ κ³ λ €ν•˜μ§€ μ•Šκ³  응닡결과λ₯Ό JSON으둜 μ˜€ν•΄ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€. 심지어 HTTP μƒνƒœ μ½”λ“œκ°€ 200으둜 μ‘λ‹΅λ˜μ§€λ§Œ 응닡 결과에 였λ₯˜μ— λŒ€ν•œ λ‚΄μš©μœΌλ‘œ μ œκ³΅ν•œλ‹€λŠ” 점으둜 인해 HTTP μƒνƒœ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ 1차적으둜 ꡬ뢄할 수 μ—†κ³  응닡 λ°”λ””λ₯Ό 무쑰건 ν™•μΈν•΄μ„œ 정상적인 ν˜ΈμΆœμΈμ§€ μ•„λ‹Œμ§€λ₯Ό κ΅¬λ³„ν•΄μ•Όν•œλ‹€.

Unexpected exception thrown: net.minidev.json.parser.ParseException: Unexpected token <OpenAPI_ServiceResponse>
	<cmmMsgHeader>
		<errMsg>SERVICE ERROR</errMsg>
		<returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
		<returnReasonCode>30</returnReasonCode>
	</cmmMsgHeader>
</OpenAPI_ServiceResponse> at position 229.

λ”°λΌμ„œ, 곡곡데이터포털에 λŒ€ν•œ 연동을 ν•˜λŠ” 경우 μ›Ή κ°œλ°œμžλŠ” μ•„λž˜μ— λŒ€ν•΄ κ³ λ € λ˜λŠ” λŒ€μ‘μ„ ν•΄μ•Όν•œλ‹€.

  1. κ²Œμ΄νŠΈμ›¨μ΄ 방식 API 확인
  2. API 호좜 μ œν•œ μ œμ•½ 확인
  3. JSON κ³Ό XML 처리 λͺ¨λ‘ κ³ λ €
  4. 간헐적 인증킀 였λ₯˜ μΌ€μ΄μŠ€ λŒ€μ‘ (API 점검 포함)