자바 Apache HttpClient를 활용한 HTTP 통신 구현

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();
}

태그: Apache HttpClient HTTP java REST API

7월 2일 21:22에 게시됨