[Java] 심화 - HTTP 웹서버 (ServerSocket과 Socket을 활용한 네트워크 통신)

이지연·2025년 12월 27일

개요

아래의 내용은 java_grammer 레파지토리 C09NetWorking 디렉터리에 저장되어있는 내용을 정리함

기본 HTTP GET 웹서버 구현부터 쿼리 파라미터 처리까지 순차적으로 학습하는 내용임. ServerSocket과 Socket을 활용한 네트워크 통신 원리 이해가 핵심이다.


HTTP 웹서버 기본 구현 (C01WebServerGet)

핵심 개념

HTTP 통신은 Request-Response 구조로 이루어져 있고 각 문서는 Start Line + Header + Empty Line + Body로 구성된다.

1. Start Line (필수): HTTP/1.1 200 OK
   - HTTP/1.1: 프로토콜 버전
   - 200: 성공 상태코드
   - OK: 상태 설명

2. Header (선택): Content-Type, Content-Length 등
   - Content-Type: text/html; charset=UTF-8
   - Content-Length: 17 (Body 바이트 길이)

3. Empty Line: \r\n (Header와 Body 구분)

4. Body: "hello world java"

코드 동작 과정

ServerSocket serverSocket = new ServerSocket(8080);  // 서버 소켓 생성
Socket socket = serverSocket.accept();               // 클라이언트 연결 대기
socket.getOutputStream().write(response.getBytes()); // 응답 전송
socket.close();                                      // 연결 종료

포트와 소켓 개념

  • 포트: 같은 IP 내 프로그램 구분 (8080번 포트 사용)
  • ServerSocket: 클라이언트 연결 대기용 가상 소켓
  • Socket: 실제 클라이언트와의 통신 끝점

테스트: http://localhost:8080 접속 → "hello world java" 응답

동적 응답 처리 (C02WebServerGet)

쿼리 파라미터 처리 추가

사용자가 http://localhost:8080?id=1로 접속하면 id 값 추출해서 동적 응답 생성한다.

요청 파싱 과정

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

StringBuffer sb = new StringBuffer();
String line;
while (line != null && !line.isEmpty()) {
    sb.append(line).append("\n");
    line = br.readLine();
}

// "GET /?id=1 HTTP/1.1" → 첫 번째 줄 추출 → "/?id=1" → "1" 파싱
String firstLine = sb.toString().split("\n")[0];
String infos = firstLine.split(" ")[1];
String id = infos.contains("?") ? infos.split("=")[1] : "";

응답 생성

응답: "HTTP/1.1 200 OK\r\n\r\nhello world java 1"

  • 사용자 요청에 따른 동적 화면 확인

두 코드 비교

구분C01WebServerGetC02WebServerGet
기능고정 응답쿼리 파라미터 처리
InputStream사용 안함BufferedReader로 요청 읽기
응답"hello world java""hello world java " + id
파싱없음GET 라인 분석

실무 적용 팁

문제점: 현재 코드는 단일 클라이언트만 처리 (연결 대기 상태)
해결책: 각 클라이언트별 별도 스레드 생성

// 개선 예시
new Thread(() -> {
    // 클라이언트 처리 로직
}).start();

다음 단계: POST 요청 처리 (Body 데이터 읽기), 멀티스레딩 적용, 실제 HTML 응답

POST와 차이점: POST는 Request Body에 데이터 포함 → socket.getInputStream()으로 이름/이메일 등 읽어야 한다. Postman 툴로 테스트 가능함.

  • Postman 툴로 확인한 모습 예시(GET요청)
profile
Eazy하게

0개의 댓글