문서 개요 (Overview)

JinyPHP Locale Server 의 API 및 주소/우편번호 서비스 전반에 대한 개요 문서입니다.

# API 서비스 개요

## 📋 API 서비스 소개

JinyPHP Locale Server는 **우편번호 및 주소 정보를 제공하는 RESTful API 서비스**입니다.
이 서비스는 Google Places API와 연동하여 전 세계 주소 및 우편번호 정보를 조회하고,
데이터베이스에 캐싱하여 빠른 응답 속도를 제공합니다.

### 주요 특징

- **Proxy API 역할**: 데이터베이스에 없는 정보를 Google Places API에서 자동으로 조회하여 저장
- **캐싱 기능**: 한 번 조회한 데이터는 데이터베이스에 저장하여 재사용 (빠른 응답)
- **다양한 검색 방식**: 우편번호, 주소, Place ID로 검색 가능
- **다국가 지원**: ISO 국가 코드 기반 다국가 주소 정보 제공
- **자동 데이터 동기화**: Google Places API로부터 최신 정보 자동 조회 및 저장

---

## 🔄 API 동작 방식

### Proxy API 동작 흐름

```
사용자 요청

1. 데이터베이스에서 데이터 조회

2. 데이터베이스에 데이터가 있는가?
├─ YES → 데이터베이스 데이터 반환 (빠른 응답)
└─ NO → Google Places API 조회

3. 조회한 데이터를 데이터베이스에 저장

4. 저장한 데이터 반환
```

### 상세 동작 과정

1. **데이터베이스 조회**: 요청된 우편번호/주소 정보가 데이터베이스에 존재하는지 확인
2. **Google Places API 조회**: 데이터베이스에 데이터가 없거나 정확히 일치하지 않는 경우 Google Places API 호출
3. **데이터 저장**: Google Places API로부터 조회한 정보를 데이터베이스에 저장 (Place ID 기준 중복 방지)
4. **결과 반환**: 조회한 정보를 JSON 형식으로 반환

---

## 🌐 Base URL

```
http://your-domain.com/api/v1/zipcode
```

---

## 📊 공통 응답 형식

### 성공 응답

```json
{
"success": true,
"message": "우편번호 정보를 조회했습니다.",
"data": {
"id": 1,
"country_code": "KR",
"zipcode": "06042",
"state": "서울특별시",
"state_en": "Seoul",
"city": "강남구",
"city_en": "Gangnam-gu",
"formatted_address": "서울특별시 강남구 테헤란로",
"latitude": 37.5010,
"longitude": 127.0394,
"place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"retrieved_from": "database"
}
}
```

### 오류 응답

```json
{
"success": false,
"message": "우편번호 정보를 찾을 수 없습니다.",
"data": null
}
```

### 검증 오류 응답

```json
{
"success": false,
"message": "입력값이 올바르지 않습니다.",
"errors": {
"zipcode": ["zipcode 필드는 필수입니다."]
}
}
```

---

## 📍 주요 엔드포인트

- **[우편번호 검색](/docs/zipcode)**: 우편번호로 주소 정보 조회 (한국, 일본, 미국, 중국 지원)
- **[주소 검색](/docs/address)**: 주소로 우편번호 및 상세 정보 조회
- **[Place ID 검색](/docs/place)**: Google Places API Place ID로 정보 조회

### 다국가 지원

현재 다음 국가의 우편번호 체계를 지원합니다:
- 🇰🇷 **한국 (KR)**: 5자리 숫자, 4단계 행정구역 (시/도 → 시군구 → 읍면동 → 상세주소)
- 🇯🇵 **일본 (JP)**: 7자리 (하이픈 포함), 3단계 행정구역 (도도부현 → 시정촌 → 구/정)
- 🇺🇸 **미국 (US)**: ZIP Code (5자리 또는 ZIP+4), 3단계 행정구역 (State → County → City)
- 🇨🇳 **중국 (CN)**: 6자리 숫자, 3단계 행정구역 (성/시 → 시/구 → 구/현)

---

## 📊 응답 데이터 필드 설명

### 주요 필드

| 필드명 | 타입 | 설명 |
|--------|------|------|
| `id` | integer | 데이터베이스 레코드 ID |
| `country_code` | string | 국가 코드 (ISO 3166-1 alpha-2) |
| `zipcode` | string | 우편번호 |
| `state` | string | 주/도 (한국어) |
| `state_en` | string | 주/도 (영어) |
| `city` | string | 시/군/구 (한국어) |
| `city_en` | string | 시/군/구 (영어) |
| `formatted_address` | string | 포맷된 전체 주소 |
| `latitude` | float | 위도 |
| `longitude` | float | 경도 |
| `place_id` | string | Google Places API Place ID |
| `retrieved_from` | string | 조회 출처 (`database` 또는 `google`) |

### `retrieved_from` 필드

- `database`: 데이터베이스에서 조회한 데이터 (빠른 응답)
- `google`: Google Places API에서 새로 조회한 데이터 (처음 조회 또는 업데이트)

---

## ⚠️ 오류 처리

### HTTP 상태 코드

| 상태 코드 | 설명 |
|----------|------|
| `200` | 성공 |
| `404` | 데이터를 찾을 수 없음 |
| `422` | 입력값 검증 실패 |
| `500` | 서버 오류 |

---

## 🔧 설정 요구사항

### 환경 변수

API 서비스를 사용하기 위해서는 다음 환경 변수가 설정되어 있어야 합니다:

```env
GOOGLE_PLACES_API_KEY=your_google_places_api_key_here
```

### Google Places API 키 발급

1. [Google Cloud Console](https://console.cloud.google.com/) 접속
2. 프로젝트 생성 또는 선택
3. API 및 서비스 > 라이브러리에서 "Places API" 활성화
4. 사용자 인증 정보에서 API 키 생성
5. `.env` 파일에 `GOOGLE_PLACES_API_KEY` 설정

---

## 📝 참고사항

### 국가 코드 및 우편번호 체계

국가 코드는 ISO 3166-1 alpha-2 형식을 사용합니다:

| 국가 코드 | 국가명 | 우편번호 형식 | 예시 |
|----------|--------|--------------|------|
| `KR` | 대한민국 | 5자리 숫자 | `06042` |
| `JP` | 일본 | 7자리 (하이픈 포함) | `150-0001` |
| `US` | 미국 | ZIP Code (5자리 또는 ZIP+4) | `90210` 또는 `90210-1234` |
| `CN` | 중국 | 6자리 숫자 | `100000` |

**상세 정보**: [국가별 우편번호 체계 및 조회 방식](/docs/zipcode#-국가별-우편번호-체계-및-조회-방식) 문서를 참고하세요.

### Place ID

Place ID는 Google Places API에서 제공하는 고유 식별자입니다.
동일한 장소는 항상 동일한 Place ID를 가지므로, Place ID를 사용하면
정확한 장소 정보를 조회할 수 있습니다.

### 데이터 캐싱

- 한 번 조회한 데이터는 데이터베이스에 저장되어 재사용됩니다
- 동일한 요청은 데이터베이스에서 빠르게 응답합니다
- Google Places API 호출은 데이터베이스에 데이터가 없을 때만 발생합니다

---

## 🚀 성능 최적화

### 캐싱 전략

1. **데이터베이스 캐싱**: 한 번 조회한 데이터는 데이터베이스에 저장
2. **Place ID 기반 중복 방지**: 동일한 Place ID는 한 번만 저장
3. **빠른 응답**: 데이터베이스에 있는 데이터는 즉시 반환

### 권장 사항

- 자주 조회하는 우편번호/주소는 미리 조회하여 캐싱
- Place ID를 사용하면 더 정확한 결과를 얻을 수 있음
- 국가 코드를 지정하면 검색 정확도 향상