JAVA

자바로 배우는 HTTP통신

jiyoon12 2025. 6. 19. 09:11

1. HTTP란 무엇인가?

HTTP의 정의

  • **HTTP (HyperText Transfer Protocol)**는 보통 웹 브라우저(클라이언트)와 웹 서버가 데이터를 주고받기 위한 통신 규칙입니다.
  • 카페에서 주문하는 것과 같습니다.
손님(클라이언트) → "아메리카노 하나 주세요" → 직원(서버)
손님(클라이언트) ← "여기 아메리카노입니다" ← 직원(서버)

 

2. HTTP의 핵심 특징

요청-응답 구조

  • 클라이언트가 먼저 **요청(Request)**을 보냄
  • 서버가 **응답(Response)**을 돌려줌
  • 항상 이 순서를 지켜야 함

상태를 기억하지 않음 (Stateless)

  • 매번 새로운 대화처럼 시작
  • 이전 요청을 기억하지 않음
  • 예: 카페에서 매번 새 손님처럼 주문해야 함

 

3. HTTP 메세지 구조

<요청 메세지>

GET /search?q=java HTTP/1.1    ← 첫 줄: 무엇을 원하는지
Host: www.google.com           ← 헤더: 추가 정보
User-Agent: Chrome/120.0
                               ← 빈 줄

 

<응답 메세지>

HTTP/1.1 200 OK               ← 첫 줄: 처리 결과
Content-Type: text/html       ← 헤더: 응답 정보
Content-Length: 1024
                              ← 빈 줄
<html>실제 웹페이지 내용</html>  ← 본문: 실제 데이터

 

 

4. 주요 HTTP 메서드

메서드 의미 예시
GET 데이터를 달라고 요청 웹페이지 보기, 검색
POST 데이터를 서버에 전송 회원가입, 글 작성
PUT 데이터를 수정 프로필 수정
DELETE 데이터를 삭제 게시글 삭제

 

 

5. HTTP 상태 코드

코드
의미
설명
200
OK
요청 성공
404
Not Found
페이지를 찾을 수 없음
500
Internal Server Error
서버 내부 오류
403
Forbidden
접근 권한 없음
400
Bad Request
잘못된 요청

 

6. 소켓 vs HTTP 관계

 

앱/브라우저
    ↓ HTTP 요청 
HTTP 프로토콜 (규칙/약속)
    ↓
TCP 소켓 (실제 통신 담당)
    ↓
인터넷

 


  •  GET 요청 방식 실습
package ch01;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Connection;

public class SimpleHttpClient {

    // 메인 메서드
    public static void main(String[] args) {
        // HTTP 통신 : 클라이언트 <--> 서버 (요청과 응답)

        String urlString = "https://www.naver.com/";

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try{
            // HTTP 통신을 하기 위한 준비물 및 순서

            // 1. URL 객체가 필요하다.
            URL url = new URL(urlString);
            // 2. URL 객체를 사용해서 HTTP 커넥션 객체를 오픈한다.
            connection = (HttpURLConnection) url.openConnection(); // 다운캐스팅

            // 요청 방식 설정 (HTTP 메세지 시작줄 기술이 됨_ --> 데이터 요청
            connection.setRequestMethod("GET");
            // 요청 메세지에 추가로(기본값 있음) 헤더 설정을 할 수 있다.
            connection.setRequestProperty("User-Agent2","Java-HttpClient/1.0");

            // 실제 서버에 통신 요청 처리
            int responseCode = connection.getResponseCode();
            System.out.println("HTTP 응답 코드 확인 : " + responseCode);

            // 방어적 코드 작성
            if(responseCode == 200) {
                System.out.println("요청 성공!");
            } else {
                System.out.println("요청 실패! 코드 : " + responseCode);
                return;
            }

            // 요청이 성공 했다면 --> 응답 HTTP 메세지에서 데이터를 추출할 예정

            // 응답 헤더 정보를 추출해보자.
            System.out.println("\n응답 헤더 정보:");
            System.out.println("Content-Type: " + connection.getContentType()); //어떤 타입으로 보내는지
            System.out.println("Content-Length: " + connection.getContentLength());

            // 응답 본문 읽기(바디에서 데이터 추출)
            reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream(),"UTF-8"));

            String line;
            StringBuffer response = new StringBuffer();

            while ((line = reader.readLine()) != null) {
                response.append(line).append("\n");
            }

            // 결과 출력하기
            System.out.println("\n서버 응답 내용");
            System.out.println(response.toString());


        } catch (Exception e) {
            System.out.println("오류 발생 : " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 리소스 닫기
            try{
                if(reader != null) reader.close();
                connection.disconnect();
            } catch (Exception e) {
                System.out.println("리소스를 닫는 도중 오류 발생");
                e.printStackTrace();
            }
        }
    } // end of main
}

 

 

  • POST 요청 방식 실습
package ch01;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpPostClient {

    public static void main(String[] args) {

        String urlString = "https://jsonplaceholder.typicode.com/posts";
        HttpURLConnection connection = null;
        OutputStream os = null; // 서버로 데이터를 보내기 위한 스트림
        BufferedReader reader = null; // 서버의 응답을 받기 위한 리더 스트림

        try{
            // 1 단계: POST 요청을 보낼 URL 설정
            URL url = new URL(urlString);

            // 2 단계 : HTTP 연결 객체 생성
            connection = (HttpURLConnection) url.openConnection();

            // 3 단계: POST 요청을 위한 HTTP 요청 메시지 설정
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            // 추가 헤더 설정 
            connection.setRequestProperty("Content-type","application/json; charset=UTF-8");

            // 4 단계 : 서버 측에 보낼 데이터 준비 (형식 - JSON)
            String jsonData = "{\n" +
                    "  \"id\": 101,\n" +
                    "  \"title\": \"오늘 뭐 먹노\",\n" +
                    "  \"body\": \"난 다이어트 중\",\n" +
                    "  \"userId\": 100\n" +
                    "}";

            // 5 단계 : 서버로 JSON 형식에 문자열을 HTTP 요철 메시지 Body 에 감아서 보낼 예정
            // 5.1 아웃풋 스트림 준비
            os = connection.getOutputStream();
            // 5.2 바이트 단위로 전송
            os.write(jsonData.getBytes("UTF-8")); // UTF-8로 인코딩된 바이트 전송
            os.flush(); // 모든 데이터가 전송되도록 함

            // ----------------------------------------------------------//
            // 응답 처리

            int responseCode = connection.getResponseCode(); // HTTP 헤더의 상태코드 받기
            System.out.println("응답 코드 확인: " + responseCode);
            // 다른 헤더 속성을 현재 출력 안함

            // HTTP 200 -->GET 방식 요청 성공
            // HTTP 201 -->POST 방식 자원 요청 생성 성공

            if(responseCode == 201) {
                System.out.println("정상 요청 성공(자원 생성 요청)");
            } else {
                System.out.println("요청 실패 : " + responseCode);
            }

            // 7 단계 : HTTP 응답 메시지 본문에서 데이터 추출
            reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream(), "UTF-8"));

            String line;
            StringBuffer response = new StringBuffer();
            while ((line = reader.readLine()) != null){
                response.append(line).append("\n");
            }

            // 8단계 : 서버 응답 출력
            System.out.println("\n서버응답 내용: ");
            System.out.println(response.toString());

        } catch (Exception e) {
            System.out.println("서버에서 오류 발생");
            e.printStackTrace();
        }finally {
            //리소스 닫기
            // .. 생략
        }

    }
}