HTTP(HyperText Transfer Protocol)는 웹 환경에서 클라이언트와 서버 간의 데이터 교환을 위해 설계된 애플리케이션 계층 프로토콜입니다. RFC 2616을 기반으로 표준화된 HTTP/1.1은 요청(Request)과 응답(Response) 모델을 따르며, 연결 상태를 유지하지 않는 Stateless(무상태) 특성을 가집니다. 레거시 SOAP 웹 서비스를 현대적인 HTTP 기반의 API로 마이그레이션할 때, 자바 환경에서는 Apache HttpClient 라이브러리를 활용하여 안정적이고 효율적인 네트워크 통신을 구현할 수 있습니다.
HttpClient 인스턴스 생성 및 타임아웃 설정
안정적인 HTTP 통신을 위해서는 클라이언트 인스턴스를 생성할 때 연결 및 읽기 타임아웃을 명시적으로 설정해야 합니다. 이를 통해 네트워크 지연이나 서버 장애 상황에서도 애플리케이션이 무한정 대기하는 것을 방지할 수 있습니다.
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.setConnectionRequestTimeout(5000)
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.build();
POST 요청 객체 생성 및 파라미터 인코딩
전송할 데이터를 설정하기 위해 HttpPost 객체를 생성하고, 폼 데이터 형식에 맞춰 파라미터를 인코딩합니다. 문자 인코딩 문제와 데이터 길이 불일치를 방지하기 위해 UTF-8을 명시적으로 지정하고 엔티티를 통해 본문을 설정하는 것이 좋습니다.
HttpPost httpPost = new HttpPost("http://target-server.com/epgs/api/setSyncCode");
httpPost.setHeader(HttpHeaders.CONNECTION, "Keep-Alive");
List<NameValuePair> payload = new ArrayList<>();
payload.add(new BasicNameValuePair("syncCode", targetSyncCode));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(payload, Consts.UTF_8);
httpPost.setEntity(formEntity);
요청 실행 및 응답 상태 코드 검증
구성된 요청을 실행한 후, 서버로부터 반환된 HTTP 상태 코드와 본문(Body) 데이터를 파싱하여 비즈니스 로직에 반영합니다. 리소스 누수를 방지하기 위해 try-with-resources 구문을 사용하여 응답 스트림을 안전하게 닫아줍니다.
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) {
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
String responsePayload = EntityUtils.toString(httpResponse.getEntity(), Consts.UTF_8);
boolean isSyncSuccess = "true".equalsIgnoreCase(responsePayload);
if (isSyncSuccess) {
// 동기화 성공 시 후속 처리 로직
}
}
} catch (IOException e) {
// 네트워크 및 I/O 예외 처리
} finally {
httpClient.close();
}