메뉴 닫기

Java HttpURLConnection과 간단한 HTTP 서버 구현 방법

Java HttpURLConnection과 간단한 HTTP 서버 구현 방법

🌐 네트워크 프로그래밍의 핵심, 자바로 HTTP 클라이언트와 서버를 직접 만들어보세요

자바로 네트워크 프로그래밍을 공부하다 보면 Socket 프로그래밍을 필수적으로 접하게 됩니다.
그 중에서도 HTTP 프로토콜을 다루는 방법은 웹 애플리케이션 개발뿐 아니라 API 통신, 크롤러 제작, 간단한 서버 테스트 등 다양한 상황에서 매우 유용합니다.
특히 HttpURLConnection을 사용하면 자바에서 직접 HTTP 요청과 응답을 주고받을 수 있고, 최소한의 코드로 서버와 클라이언트를 구현할 수 있습니다.
이 글에서는 네트워크와 병렬 프로그래밍의 기초를 바탕으로, 실무에서도 활용 가능한 간단한 HTTP 서버와 클라이언트 구현 방법을 차근차근 알려드리겠습니다.

오늘은 단순히 개념을 설명하는 것에 그치지 않고, 직접 동작하는 예제 코드를 통해 HTTP 통신 과정을 이해하고, 이를 확장해 나만의 서버를 만들 수 있는 기초를 다져보겠습니다.
복잡한 프레임워크 없이도 순수 자바 코드로 구현이 가능하니, 네트워크 프로그래밍을 처음 접하시는 분들도 부담 없이 따라오실 수 있을 거예요.
준비되셨다면, 지금부터 차근차근 시작해보겠습니다.



🔗 HttpURLConnection 기본 이해와 동작 원리

Java에서 HTTP 통신을 구현할 때 가장 간단하면서도 표준적으로 사용할 수 있는 클래스가 HttpURLConnection입니다.
이 클래스는 자바 표준 라이브러리에 포함되어 있어 별도의 외부 라이브러리 없이도 HTTP 요청과 응답을 처리할 수 있습니다.
또한 HTTP뿐 아니라 HTTPS 프로토콜도 지원하므로, 보안이 필요한 환경에서도 쉽게 사용할 수 있습니다.

HttpURLConnection은 기본적으로 URL 객체를 통해 생성됩니다.
클라이언트가 서버로 요청을 보내면, 이 객체는 TCP 소켓을 열어 HTTP 요청 메시지를 작성하고 서버에 전송합니다.
이후 서버로부터 응답 메시지를 수신하고, 이를 InputStream을 통해 읽어 처리할 수 있습니다.
즉, 내부적으로는 소켓을 사용하지만, 개발자가 직접 소켓 프로그래밍을 하지 않아도 되도록 추상화해주는 역할을 합니다.

📌 주요 메서드와 속성

HttpURLConnection을 사용할 때 알아두면 좋은 주요 메서드와 속성은 다음과 같습니다.

  • 🛠️setRequestMethod(String method) : GET, POST, PUT, DELETE 등 HTTP 메서드 설정
  • ⚙️setRequestProperty(String key, String value) : 요청 헤더 설정
  • 🔌getInputStream() : 서버 응답 본문(InputStream) 읽기
  • 📡getResponseCode() : HTTP 응답 코드 확인
CODE BLOCK
URL url = new URL("https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");

int status = conn.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    content.append(inputLine);
}
in.close();
conn.disconnect();

💡 TIP: HttpURLConnection은 재사용이 불가능하므로, 매 요청마다 새로운 객체를 생성해야 합니다.

🛠️ Java에서 HTTP GET과 POST 요청 구현

HTTP 통신에서 가장 기본이 되는 메서드는 GETPOST입니다.
GET은 서버로부터 데이터를 요청할 때, POST는 서버로 데이터를 전송할 때 주로 사용됩니다.
Java의 HttpURLConnection을 활용하면 이 두 요청 방식을 간단하게 구현할 수 있습니다.

📌 GET 요청 예제

CODE BLOCK
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}
br.close();
conn.disconnect();

💡 TIP: GET 요청 시 파라미터는 URL 뒤에 ?key=value 형식으로 추가합니다.

📌 POST 요청 예제

CODE BLOCK
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; utf-8");
conn.setRequestProperty("Accept", "application/json");
conn.setDoOutput(true);

String jsonInputString = "{\"name\": \"홍길동\", \"age\": 30}";
try(OutputStream os = conn.getOutputStream()) {
    byte[] input = jsonInputString.getBytes("utf-8");
    os.write(input, 0, input.length);
}

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
    response.append(responseLine.trim());
}
System.out.println(response.toString());

⚠️ 주의: POST 요청 시 setDoOutput(true)를 반드시 설정해야 본문 전송이 가능합니다.



⚙️ 간단한 HTTP 서버 구현 방법

Java에서는 com.sun.net.httpserver.HttpServer 클래스를 사용하여 매우 간단하게 HTTP 서버를 구현할 수 있습니다.
이 방식은 서블릿 컨테이너나 프레임워크 없이도 기본적인 요청-응답 구조를 처리할 수 있어, 테스트나 로컬 개발 환경에서 자주 활용됩니다.

아래 예제는 8000번 포트에서 동작하는 간단한 HTTP 서버 코드입니다.
서버는 클라이언트 요청을 받아 “Hello, World”라는 응답을 반환합니다.

CODE BLOCK
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class SimpleHttpServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null); // 기본 실행자 사용
        server.start();
        System.out.println("서버가 8000번 포트에서 시작되었습니다.");
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "Hello, World";
            exchange.sendResponseHeaders(200, response.getBytes().length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(response.getBytes());
            }
        }
    }
}

📌 HttpServer 장점

  • 🚀간단한 코드로 HTTP 서버 구현 가능
  • 🧪테스트 및 로컬 개발 환경에 최적
  • 🛠️별도 서버 설정 없이 즉시 실행 가능

⚠️ 주의: com.sun.net.httpserver 패키지는 경량 서버 용도로 설계되었기 때문에, 대규모 트래픽 처리에는 적합하지 않습니다.

🔌 병렬 프로그래밍을 활용한 멀티스레드 서버

기본적인 HTTP 서버는 요청을 순차적으로 처리하기 때문에 동시에 여러 사용자가 접속하면 응답 속도가 느려질 수 있습니다.
이를 해결하기 위해 멀티스레드 또는 스레드 풀(Thread Pool)을 활용하면, 동시에 여러 요청을 병렬로 처리할 수 있어 성능이 향상됩니다.

Java의 ExecutorService를 사용하면 HttpServer에 스레드 풀을 적용해 효율적인 요청 처리가 가능합니다.
아래 예제는 고정 크기 스레드 풀을 이용하여 다중 클라이언트 요청을 처리하는 방식입니다.

CODE BLOCK
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class MultiThreadHttpServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(Executors.newFixedThreadPool(10)); // 10개의 스레드로 처리
        server.start();
        System.out.println("멀티스레드 HTTP 서버가 8000번 포트에서 시작되었습니다.");
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "멀티스레드 서버 응답";
            exchange.sendResponseHeaders(200, response.getBytes().length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(response.getBytes());
            }
        }
    }
}

📌 멀티스레드 서버 장점

  • 여러 요청을 동시에 처리하여 응답 지연 감소
  • 🛠️서버 리소스 활용 최적화
  • 📈대규모 동시 접속 환경에서도 안정적 동작

⚠️ 주의: 스레드 수를 너무 많이 설정하면 오히려 CPU와 메모리 부하가 커져 성능이 저하될 수 있습니다.
적절한 스레드 풀 크기를 선택하는 것이 중요합니다.



💡 실무에서 활용 가능한 응용 사례

HttpURLConnection과 간단한 HTTP 서버 구현 기술은 단순 학습을 넘어 실제 프로젝트에서도 유용하게 쓰입니다.
API 통신, IoT 기기 데이터 수집, 테스트 서버 구축, 크롤러 제작 등 다양한 영역에서 활용이 가능합니다.

📌 주요 활용 예시

  • 🔍외부 API 호출을 통한 데이터 수집 및 분석
  • 🖥️내부 시스템 간 데이터 전송 및 연동 테스트
  • 📡IoT 센서 데이터 수집 서버 구현
  • 🤖웹 크롤러를 통한 자동화 데이터 수집
  • 🧪서비스 배포 전 로컬 테스트 환경 구축

📌 간단한 API 서버 예시

아래 코드는 간단한 JSON API 서버 예제입니다.
클라이언트가 /data 경로로 요청을 보내면 JSON 형태의 데이터를 응답합니다.

CODE BLOCK
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class JsonApiServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/data", new JsonHandler());
        server.setExecutor(null);
        server.start();
        System.out.println("JSON API 서버가 8000번 포트에서 시작되었습니다.");
    }

    static class JsonHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String jsonResponse = "{\"status\":\"success\",\"message\":\"Hello JSON\"}";
            exchange.getResponseHeaders().add("Content-Type", "application/json; charset=utf-8");
            exchange.sendResponseHeaders(200, jsonResponse.getBytes().length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(jsonResponse.getBytes());
            }
        }
    }
}

💡 TIP: JSON 응답을 보낼 때는 반드시 Content-Type 헤더를 application/json으로 설정해야 합니다.

자주 묻는 질문 (FAQ)

HttpURLConnection은 HTTPS도 지원하나요?
네, HttpURLConnection은 HTTPS 프로토콜을 지원하며, SSL 인증서 설정을 통해 안전한 통신이 가능합니다.
com.sun.net.httpserver.HttpServer는 상용 서비스에 적합한가요?
해당 클래스는 경량 서버 용도로 설계되어 있어, 상용 서비스보다는 테스트나 로컬 개발 환경에서 사용하는 것이 좋습니다.
멀티스레드 서버의 스레드 풀 크기는 어떻게 정하나요?
CPU 코어 수와 예상 동시 접속자 수를 고려하여 설정하는 것이 좋으며, 과도하게 크면 오히려 성능이 저하될 수 있습니다.
HttpURLConnection 대신 다른 HTTP 라이브러리를 써야 하는 이유는?
복잡한 요청 처리, 비동기 통신, 쿠키 관리 등 고급 기능이 필요하다면 OkHttp, Apache HttpClient 같은 외부 라이브러리를 사용하는 것이 더 편리합니다.
간단한 API 서버를 배포하려면 어떻게 해야 하나요?
클라우드 서비스(AWS, GCP, Azure 등)나 VPS 환경에 서버 코드를 업로드하고, 방화벽에서 해당 포트를 열어주면 외부에서 접근 가능합니다.
POST 요청에서 JSON 대신 Form 데이터를 전송할 수 있나요?
가능합니다. Content-Type을 application/x-www-form-urlencoded로 설정하고, 키=값&키=값 형식으로 데이터를 전송하면 됩니다.
HTTP 서버에서 정적 파일을 제공할 수 있나요?
가능합니다. 요청 경로를 분석하여 로컬 파일을 읽어 응답으로 전송하는 방식으로 구현할 수 있습니다.
HttpURLConnection은 요청 타임아웃 설정이 가능한가요?
가능합니다. setConnectTimeout()과 setReadTimeout() 메서드를 사용하여 연결 및 응답 대기 시간을 설정할 수 있습니다.

🚀 Java HttpURLConnection과 HTTP 서버 구현 핵심 정리

Java에서 HttpURLConnection은 외부 라이브러리 없이도 HTTP 요청과 응답을 손쉽게 처리할 수 있는 강력한 도구입니다.
GET, POST 요청부터 헤더 설정, 응답 코드 확인까지 다양한 기능을 제공하며, HTTPS도 지원해 보안 통신에도 적합합니다.
또한 com.sun.net.httpserver.HttpServer를 사용하면 간단한 HTTP 서버를 구현할 수 있고, 병렬 프로그래밍을 적용해 멀티스레드 환경에서도 안정적으로 동작시킬 수 있습니다.

이 기술들은 API 서버 구축, IoT 데이터 수집, 웹 크롤러 제작 등 실무에서도 널리 활용됩니다.
특히 개발 초기 단계나 테스트 환경에서는 가볍고 빠른 구현이 가능해 효율적입니다.
단, 대규모 트래픽 처리나 고급 기능이 필요한 경우에는 Spring Boot, Netty, OkHttp 같은 대안도 고려할 수 있습니다.


🏷️ 관련 태그 : Java네트워크, HttpURLConnection, Java서버구현, 멀티스레드서버, 자바프로그래밍, API서버, 네트워크프로그래밍, Socket프로그래밍, HTTPS, 병렬프로그래밍