본문 바로가기

JAVA

JAVA로 만드는 간단한 HTTP Client 튜토리얼

반응형

✅개요

Java로 HTTP 통신을 구현하는 것은 현대 웹 개발에서 필수적인 스킬입니다.

이 튜토리얼에서는 Java의 다양한 HTTP Client 구현 방법을 단계별로 알아보겠습니다.

1. Java 기본 HttpURLConnection 사용하기

GET 요청 구현

public String sendGet(String url) throws IOException {
    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("GET");
    
    // 응답 읽기
    BufferedReader in = new BufferedReader(
        new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuilder response = new StringBuilder();
    
    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();
    
    return response.toString();
}

 

POST 요청 구현

public String sendPost(String url, String body) throws IOException {
    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    
    // POST 설정
    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "application/json");
    con.setDoOutput(true);
    
    // 데이터 전송
    try (OutputStream os = con.getOutputStream()) {
        byte[] input = body.getBytes("utf-8");
        os.write(input, 0, input.length);
    }
    
    // 응답 읽기
    try (BufferedReader br = new BufferedReader(
        new InputStreamReader(con.getInputStream(), "utf-8"))) {
        StringBuilder response = new StringBuilder();
        String responseLine;
        while ((responseLine = br.readLine()) != null) {
            response.append(responseLine.trim());
        }
        return response.toString();
    }
}

 

2. Java 11+ HttpClient 사용하기

HttpClient 설정

private final HttpClient httpClient = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    .connectTimeout(Duration.ofSeconds(10))
    .build();

 

GET 요청 구현

public String modernGet(String url) throws IOException, InterruptedException {
    HttpRequest request = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create(url))
        .setHeader("User-Agent", "Java HTTP Client")
        .build();
    
    HttpResponse<String> response = httpClient.send(request, 
        HttpResponse.BodyHandlers.ofString());
    
    return response.body();
}

POST 요청 구현

public String modernPost(String url, String jsonBody) 
    throws IOException, InterruptedException {
    
    HttpRequest request = HttpRequest.newBuilder()
        .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
        .uri(URI.create(url))
        .header("Content-Type", "application/json")
        .build();
    
    HttpResponse<String> response = httpClient.send(request,
        HttpResponse.BodyHandlers.ofString());
    
    return response.body();
}

 

 

3. 실용적인 활용 예제

REST API 호출 클래스

public class ApiClient {
    private final HttpClient httpClient;
    private final String baseUrl;
    
    public ApiClient(String baseUrl) {
        this.baseUrl = baseUrl;
        this.httpClient = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .connectTimeout(Duration.ofSeconds(10))
            .build();
    }
    
    public <T> T get(String endpoint, Class<T> responseType) 
        throws IOException, InterruptedException {
        
        HttpRequest request = HttpRequest.newBuilder()
            .GET()
            .uri(URI.create(baseUrl + endpoint))
            .header("Content-Type", "application/json")
            .build();
            
        HttpResponse<String> response = httpClient.send(request,
            HttpResponse.BodyHandlers.ofString());
            
        // JSON 응답을 객체로 변환
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(response.body(), responseType);
    }
}

 

4. 주요 고려사항

에러 처리

public String safeGet(String url) {
    try {
        HttpRequest request = HttpRequest.newBuilder()
            .GET()
            .uri(URI.create(url))
            .build();
            
        HttpResponse<String> response = httpClient.send(request,
            HttpResponse.BodyHandlers.ofString());
            
        if (response.statusCode() >= 400) {
            throw new RuntimeException("HTTP error code: " + response.statusCode());
        }
        
        return response.body();
    } catch (IOException | InterruptedException e) {
        throw new RuntimeException("네트워크 오류 발생", e);
    }
}

 

타임아웃 설정

타임아웃은 사이트에 맞게끔 적절하게 설정한다.

HttpClient client = HttpClient.newBuilder()
    .connectTimeout(Duration.ofSeconds(10))
    .build();

 

5. 성능 최적화 팁

Connection Pooling

HttpClient client = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    .connectTimeout(Duration.ofSeconds(10))
    .executor(Executors.newFixedThreadPool(5))
    .build();

 

비동기 요청 처리

public CompletableFuture<String> asyncGet(String url) {
    HttpRequest request = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create(url))
        .build();
        
    return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body);
}

 

✅실전 활용 예시

REST API 통신

public class UserService {
    private final ApiClient apiClient;
    
    public UserService() {
        this.apiClient = new ApiClient("https://api.example.com");
    }
    
    public User getUser(Long id) throws IOException, InterruptedException {
        return apiClient.get("/users/" + id, User.class);
    }
}

 

✅마무리

Java의 HTTP Client는 계속 발전하고 있습니다.

Java 11부터 도입된 새로운 HTTP Client는 더 나은 성능과 사용성을 제공합니다.

이 튜토리얼의 예제들을 활용하여 효율적인 HTTP 통신을 구현해보세요.

반응형