From c2d6eb4c34cf1d7861694ea870cd295ea8f9529c Mon Sep 17 00:00:00 2001
From: Rinjae
Date: Thu, 13 Aug 2026 16:52:04 +0900
Subject: [PATCH] =?UTF-8?q?=EB=A0=88=EA=B1=B0=EC=8B=9C=20=EC=95=94?=
=?UTF-8?q?=ED=98=B8=ED=99=94=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?=
=?UTF-8?q?=EC=A0=9C=EA=B1=B0=20-=20=EB=82=B4=EB=B6=80=20API=20=ED=86=A0?=
=?UTF-8?q?=ED=81=B0=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EB=A1=9C=EC=A7=81=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=EC=A0=95=EA=B7=9C=EC=8B=9D=20?=
=?UTF-8?q?=EC=84=B1=EB=8A=A5=20=EC=B5=9C=EC=A0=81=ED=99=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../portalmenu/PortalMenuCacheClient.java | 51 +++++++++++++++----
1 file changed, 40 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/portalmenu/PortalMenuCacheClient.java b/src/main/java/com/eactive/eai/rms/onl/apim/portalmenu/PortalMenuCacheClient.java
index c0565d4..5d7fc1f 100644
--- a/src/main/java/com/eactive/eai/rms/onl/apim/portalmenu/PortalMenuCacheClient.java
+++ b/src/main/java/com/eactive/eai/rms/onl/apim/portalmenu/PortalMenuCacheClient.java
@@ -1,11 +1,15 @@
package com.eactive.eai.rms.onl.apim.portalmenu;
+import com.eactive.apim.portal.common.internal.InternalApiTokenService;
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;
@@ -33,8 +37,12 @@ import java.util.concurrent.TimeUnit;
* (기본 {@code http://127.0.0.1:39130/internal/menu/reload}).
* 포탈이 다중 인스턴스로 기동되는 환경을 위해 콤마/세미콜론/줄바꿈 으로 여러 URL 을 나열할 수 있으며,
* 나열된 모든 서버로 병렬 호출한다. 각 호출의 connect/read 타임아웃은 {@value #TIMEOUT_MS}ms 이다.
- * portal 측은 {@code menu.internal.allow-ips} 허용 IP 목록으로 요청을 검증한다.
* 오류는 결과 Map 으로 감싸 화면에 서버별 사유를 표시한다 — 예외를 전파하지 않는다.
+ *
+ * portal 측 검증은 두 겹이다: {@code menu.internal.allow-ips} 허용 IP 목록과
+ * {@link InternalApiTokenService} 공유 토큰 헤더. 토큰/헤더명은 PTL_PROPERTY 로 portal 과 공유하므로
+ * 이 클래스는 읽기만 한다(생성 주체는 portal). 값이 아직 없으면 헤더 없이 호출하게 되어 portal 이
+ * 401 로 거부하며, 이때는 portal 을 먼저 기동해 토큰을 생성해야 한다.
*/
@Component
public class PortalMenuCacheClient {
@@ -55,16 +63,21 @@ public class PortalMenuCacheClient {
private static final int MAX_PARALLELISM = 10;
private final PortalPropertyService portalPropertyService;
+ private final InternalApiTokenService internalApiTokenService;
private final RestTemplate restTemplate;
@Autowired
- public PortalMenuCacheClient(PortalPropertyService portalPropertyService) {
- this(portalPropertyService, createRestTemplateWithTimeout(TIMEOUT_MS));
+ public PortalMenuCacheClient(PortalPropertyService portalPropertyService,
+ InternalApiTokenService internalApiTokenService) {
+ this(portalPropertyService, internalApiTokenService, createRestTemplateWithTimeout(TIMEOUT_MS));
}
/** 테스트용 — 타임아웃이 설정된 RestTemplate 을 직접 주입한다. */
- PortalMenuCacheClient(PortalPropertyService portalPropertyService, RestTemplate restTemplate) {
+ PortalMenuCacheClient(PortalPropertyService portalPropertyService,
+ InternalApiTokenService internalApiTokenService,
+ RestTemplate restTemplate) {
this.portalPropertyService = portalPropertyService;
+ this.internalApiTokenService = internalApiTokenService;
this.restTemplate = restTemplate;
}
@@ -98,7 +111,8 @@ public class PortalMenuCacheClient {
*/
public Map reload() {
List urls = resolveUrls();
- List