반응형
✅개요
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 통신을 구현해보세요.
반응형
'JAVA' 카테고리의 다른 글
[Apache] CloseableHttpClient 사용 시 try-with-resources문으로 리소스 관리 (0) | 2025.01.08 |
---|