3.4 KiB
3.4 KiB
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 헤더에 원래 도메인을 전달하도록 수정했다.
수정 전:
$baseUrl = config('services.api.base_url', 'https://api.sam.kr');
return Http::baseUrl($baseUrl)
->withoutVerifying()
->withHeaders([...])
수정 후:
$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)
동작 원리
API_INTERNAL_URL설정됨 (Docker):https://nginx로 요청 +Host: api.sam.kr헤더 → Nginx가 Host 헤더로 서버 블록 라우팅API_INTERNAL_URL미설정 (서버):API_BASE_URL로 직접 요청 (기존과 동일)
신규 API 호출 코드 작성 시 필수 규칙
MNG에서 API를 호출하는 코드를 새로 작성할 때는 반드시 다음을 준수한다:
필수 config('services.api.internal_url') 확인 후 분기 처리
필수 internal_url 사용 시 Host 헤더에 base_url의 도메인 전달
권장 FormulaApiService::resolveApiConnection() 참조
테스트 체크리스트
- 로컬 Docker에서
/bending/base페이지 정상 로드 - 로컬 Docker에서
/bending/products페이지 정상 로드 - pint 코드 스타일 검사 통과
관련 문서
config/services.php—services.api.base_url,services.api.internal_url설정app/Services/FormulaApiService.php—resolveApiConnection()참조 구현