From 3e6d0c9600d869e9e18b865b75656c59746fa90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 21 Mar 2026 09:34:30 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[changes]=20Docker=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=20MNG=E2=86=92API=20=ED=98=B8=EC=B6=9C=20internal=5Furl=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=9D=B4=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- INDEX.md | 1 + .../20260321_bending_api_internal_url_fix.md | 92 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 changes/20260321_bending_api_internal_url_fix.md diff --git a/INDEX.md b/INDEX.md index 7fbf913..14c170c 100644 --- a/INDEX.md +++ b/INDEX.md @@ -307,6 +307,7 @@ DB 도메인별: | [20260320_sales_to_mng_rd_migration.md](dev/changes/20260320_sales_to_mng_rd_migration.md) | Sales → MNG 연구개발 메뉴 통합 이관 (11개 페이지) | | [20260320_daily_work_logs_codebridge_migration_fix.md](changes/20260320_daily_work_logs_codebridge_migration_fix.md) | 일일업무일지 codebridge DB 이관 누락 수정 (sam→codebridge 데이터 복구) | | [20260321_process_duplicate_feature.md](changes/20260321_process_duplicate_feature.md) | 공정관리 공정 복제(복사) 기능 추가 (API+React) | +| [20260321_bending_api_internal_url_fix.md](changes/20260321_bending_api_internal_url_fix.md) | Docker 환경 MNG→API 호출 internal_url 미적용 500 에러 수정 | --- diff --git a/changes/20260321_bending_api_internal_url_fix.md b/changes/20260321_bending_api_internal_url_fix.md new file mode 100644 index 0000000..ffdfea3 --- /dev/null +++ b/changes/20260321_bending_api_internal_url_fix.md @@ -0,0 +1,92 @@ +# Docker 환경 MNG→API 호출 internal_url 미적용 500 에러 수정 + +**날짜:** 2026-03-21 +**작업자:** Claude Code (R&D실) + +## 변경 개요 + +다른 개발자가 작성한 절곡품(Bending) 관련 컨트롤러 4개에서 Docker 환경의 MNG→API 내부 통신 규칙(`API_INTERNAL_URL`)을 적용하지 않아 로컬 Docker에서 500 에러가 발생하던 문제를 수정했다. + +## 원인 + +MNG에서 API를 호출할 때 환경별로 다른 URL을 사용해야 한다: + +| 환경 | 사용할 URL | 이유 | +|------|-----------|------| +| Docker (로컬) | `API_INTERNAL_URL` (`https://nginx`) | 컨테이너 간 내부 통신, `api.sam.kr` DNS 해석 불가 | +| 서버 (개발/운영) | `API_BASE_URL` | 직접 도메인 접근 가능 | + +문제 컨트롤러들은 `config('services.api.base_url')` (`https://api.sam.kr`)만 사용하고, `internal_url` 분기 처리가 없었다. + +**에러 로그:** +``` +cURL error 7: Failed to connect to api.sam.kr port 443 after 4 ms: Could not connect to server +``` + +## 수정된 파일 + +| 파일 | 변경 내용 | +|------|----------| +| `app/Http/Controllers/BendingBaseController.php` | `api()` 메서드에 `internal_url` + `Host` 헤더 분기 추가 | +| `app/Http/Controllers/BendingProductController.php` | `api()` 메서드에 `internal_url` + `Host` 헤더 분기 추가 | +| `app/Http/Controllers/FileViewController.php` | `show()` 메서드 HTTP 클라이언트에 `internal_url` 분기 추가 | +| `app/Http/Controllers/DocumentTemplateController.php` | `getPresignedUrlFromApi()`, `getPresignedUrlByPath()` 두 메서드에 분기 추가 | + +## 상세 변경 사항 + +### 수정 패턴 + +기존 `FormulaApiService::resolveApiConnection()` 패턴을 참고하여, `API_INTERNAL_URL`이 설정된 경우 해당 URL로 요청하되 `Host` 헤더에 원래 도메인을 전달하도록 수정했다. + +**수정 전:** +```php +$baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + +return Http::baseUrl($baseUrl) + ->withoutVerifying() + ->withHeaders([...]) +``` + +**수정 후:** +```php +$baseUrl = config('services.api.base_url', 'https://api.sam.kr'); +$internalUrl = config('services.api.internal_url'); + +$headers = [...]; + +// Docker: internal_url(nginx 컨테이너) 경유, Host 헤더로 서버 블록 라우팅 +if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; +} + +return Http::baseUrl($baseUrl) + ->withoutVerifying() + ->withHeaders($headers) +``` + +### 동작 원리 + +1. `API_INTERNAL_URL` 설정됨 (Docker): `https://nginx`로 요청 + `Host: api.sam.kr` 헤더 → Nginx가 Host 헤더로 서버 블록 라우팅 +2. `API_INTERNAL_URL` 미설정 (서버): `API_BASE_URL`로 직접 요청 (기존과 동일) + +## 신규 API 호출 코드 작성 시 필수 규칙 + +MNG에서 API를 호출하는 코드를 새로 작성할 때는 반드시 다음을 준수한다: + +``` +필수 config('services.api.internal_url') 확인 후 분기 처리 +필수 internal_url 사용 시 Host 헤더에 base_url의 도메인 전달 +권장 FormulaApiService::resolveApiConnection() 참조 +``` + +## 테스트 체크리스트 + +- [x] 로컬 Docker에서 `/bending/base` 페이지 정상 로드 +- [x] 로컬 Docker에서 `/bending/products` 페이지 정상 로드 +- [x] pint 코드 스타일 검사 통과 + +## 관련 문서 + +- `config/services.php` — `services.api.base_url`, `services.api.internal_url` 설정 +- `app/Services/FormulaApiService.php` — `resolveApiConnection()` 참조 구현