ITN Dev 07-22
fix: Mattermost REST 클라이언트의 HTTP/1.1 고정을 테스트 전용으로 분리
WireMock(Jetty)의 h2c 업그레이드 협상 문제를 회피하려던 HTTP/1.1 고정이
운영 코드(RestClient)에 들어가 있어 실제로는 HTTPS/ALPN으로 협상하는
운영 전송 계층까지 불필요하게 좁히고 있었다. 전송 설정을 주입 가능한
생성자로 분리해 운영 생성자는 프레임워크 기본값을 쓰고, 테스트만
HTTP/1.1을 고정하도록 수정했다.
@b1ad537477470b323b942b95359298bc8d12a51c
src/main/java/kr/itn/itnhub/mattermost/MattermostRestClient.java
--- src/main/java/kr/itn/itnhub/mattermost/MattermostRestClient.java
+++ src/main/java/kr/itn/itnhub/mattermost/MattermostRestClient.java
@@ -3,12 +3,10 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import kr.itn.itnhub.config.MattermostProperties;
 import org.springframework.http.MediaType;
-import org.springframework.http.client.JdkClientHttpRequestFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestClient;
 import org.springframework.web.client.RestClientException;
 
-import java.net.http.HttpClient;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -20,15 +18,17 @@
     private final String teamId;
 
     public MattermostRestClient(MattermostProperties props) {
+        this(props, RestClient.builder());
+    }
+
+    /**
+     * 전송 계층(transport)을 직접 지정할 수 있는 생성자. 운영 코드에서는 사용하지 않으며,
+     * 테스트 등 별도의 {@link RestClient.Builder} 설정이 필요한 호출자를 위한 확장 지점이다.
+     */
+    MattermostRestClient(MattermostProperties props, RestClient.Builder builder) {
         this.teamId = props.teamId();
-        // JDK HttpClient의 기본 HTTP/2 h2c 업그레이드 협상이 WireMock(Jetty) 상대로
-        // POST 요청에서 간헐적으로 RST_STREAM을 유발해 HTTP/1.1로 고정한다.
-        HttpClient httpClient = HttpClient.newBuilder()
-                .version(HttpClient.Version.HTTP_1_1)
-                .build();
-        this.rest = RestClient.builder()
+        this.rest = builder
                 .baseUrl(props.baseUrl())
-                .requestFactory(new JdkClientHttpRequestFactory(httpClient))
                 .defaultHeader("Authorization", "Bearer " + props.token())
                 .build();
     }
src/test/java/kr/itn/itnhub/mattermost/MattermostRestClientTest.java
--- src/test/java/kr/itn/itnhub/mattermost/MattermostRestClientTest.java
+++ src/test/java/kr/itn/itnhub/mattermost/MattermostRestClientTest.java
@@ -5,6 +5,10 @@
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.springframework.http.client.JdkClientHttpRequestFactory;
+import org.springframework.web.client.RestClient;
+
+import java.net.http.HttpClient;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.*;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
@@ -28,7 +32,16 @@
                 "문정원",
                 "법률검토");
 
-        client = new MattermostRestClient(props);
+        // 이 HTTP/1.1 고정은 테스트 하네스(WireMock/Jetty)만의 제약이다: JDK 21 HttpClient의
+        // 기본 h2c 업그레이드 협상이 WireMock 상대로 POST 요청에서 간헐적으로 RST_STREAM을
+        // 유발하기 때문에 여기서만 고정한다. 운영 환경은 HTTPS/ALPN으로 협상하므로 해당되지 않는다.
+        HttpClient httpClient = HttpClient.newBuilder()
+                .version(HttpClient.Version.HTTP_1_1)
+                .build();
+        RestClient.Builder builder = RestClient.builder()
+                .requestFactory(new JdkClientHttpRequestFactory(httpClient));
+
+        client = new MattermostRestClient(props, builder);
     }
 
     @AfterEach
Add a comment
List