최원종의 개발 블로그

HTTP- 1 본문

Java/JAVA 유용한 클래스

HTTP- 1

chl6698 2026. 3. 31. 16:58

웹 동작 방식

소켓 통신 (직접 연결):
  프로그램 A ──────────────────► 프로그램 B
  (규칙을 우리가 직접 정해야 함)

웹(HTTP) 통신 (약속된 규칙):
  브라우저 ── HTTP 규칙 ──► 웹 서버
  (전 세계가 공통으로 쓰는 규칙을 따름)

 

HTTP는 소켓 위에서 동작함.

실제 데이터 전송은 소켓이 담당하고, HTTP는 그 위에서 "어떤 형식으로 요청하고 응답할지"를 약속한 것

[ 브라우저 / 우리 프로그램 ]
          |
     HTTP (규칙/약속)
          |
    TCP 소켓 (실제 통신)
          |
        인터넷

 


HTTP 란?

HTTP(HyperText Transfer Protocol) 는 웹에서 데이터를 주고받기 위한 통신 규칙.

// 예시
손님(클라이언트) → "아메리카노 하나 주세요" → 직원(서버)
손님(클라이언트) ← "여기 아메리카노입니다" ← 직원(서버)

 

 

HTTP 두 가지 핵심 특징

1. 요청-응답 구조 (Request - Response)
   클라이언트가 먼저 요청 → 서버가 응답
   항상 이 순서를 지킴

2. 상태를 기억하지 않음 (Stateless)
   매 요청이 독립적, 이전 요청을 기억하지 않음
   로그인 유지가 필요하면 쿠키/세션으로 별도 처리

 

 

 


HTTP 메서드

서버에게 무엇을 원하는지 알려주는 방법

메서드 의미 예시
GET 데이터를 가져옴 게시글 조회, 검색
POST 데이터를 전송 회원가입, 글 작성
PUT 데이터를 수정 프로필 수정
DELETE 데이터를 삭제 게시글 삭제

 


HTTP 상태 코드

서버가 요청을 처리한 결과를 숫자로 알려줌

코드 의미
200 성공
201 생성 성공 (POST 요청 후)
400 잘못된 요청
403 접근 권한 없음
404 찾을 수 없음
500 서버 내부 오류

 


HTTP 메시지 구조

 

 

요청 메세지

GET /posts/1 HTTP/1.1                ← 메서드 + 경로 + HTTP 버전
Host: jsonplaceholder.typicode.com   ← 헤더: 어느 서버에 요청하는지
Accept: application/json             ← 헤더: JSON 형식으로 응답 요청
                                     ← 빈 줄 (헤더 끝을 알리는 구분선)

 

응답 메시지

HTTP/1.1 200 OK                      ← 상태 코드
Content-Type: application/json       ← 헤더: 응답 데이터 형식
                                     ← 빈 줄
{"id": 1, "title": "..."}            ← 본문: 실제 데이터

자바 실습 코드

 

실습 주소 https://jsonplaceholder.typicode.com/posts/1 (가짜 데이터 제공하는 무료 테스트 API)

 

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere...",
  "body": "quia et suscipit..."
}

 

package http.ch01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

//https://jsonplaceholder.typicode.com/todos/1
public class SimpleHttpClient {

    public static void main(String[] args) {
        //자바로 HTTP요청과 응답 만들어 보기
        //String urlString = "https://jsonplaceholder.typicode.com/todos/10";
        String urlString = "https://www.naver.com/";
        //HTTP 통신하는 클래스
        HttpURLConnection connection = null;

        //1단계 URL 객체 생성 후
        //try catch로 감싸기
        try {
            URL url = new URL(urlString);
            // 2단계 : HTTP 연결 객체 생성
            connection = (HttpURLConnection) url.openConnection();

            //3 단계 : 요청 방식 설정 (GET , POST, PUT, DELETE)
            //자원에 요청 --> GET 던져야 함
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept", "application/json");

            //4단계 : 실제 요청 전송 --> 서버 --> 즉시응답 --> (응답 코드)
            int responseCode = connection.getResponseCode();
            System.out.println("응답 코드 확인 : " + responseCode);

            if (responseCode != 200) {
                System.out.println("요청 실패!");
                return;
            }

            //5단계 : 응답 본문 읽기
            //I/O 단원에서 배운 체인 그대로 사용 가능
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()))) {

                //문자가 많을 때 StringBuffer 를 사용하는게 좋다
                StringBuffer response = new StringBuffer();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line).append("\n");
                }

                System.out.println("응답 내용 : ");
                System.out.println(response.toString());
            }


        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}

URL 객체가 필요한 이유

문자열은 그냥 문자열이다.

"https://jsonplaceholder.typicode.com/todos" 는 자바 입장에서 그냥 긴 문자열 하나이다.

HttpURLConnection 은 URL 객체를 요구하기 때문에 이 문자열만으로는 HTTP연결을 만들 수 없다
// HttpURLConnection 은 URL 객체를 받음
connection = (HttpURLConnection) url.openConnection(); // URL 객체 필요

 

파싱 개념

문자열은 그냥 문자열이다.

"https://jsonplaceholder.typicode.com/todos" 는 자바 입장에서 그냥 긴 문자열 하나이다.

HttpURLConnection 은 URL 객체를 요구하기 때문에 이 문자열만으로는 HTTP연결을 만들 수 없다
URL url = new URL("https://jsonplaceholder.typicode.com/todos?page=1");

url.getProtocol(); // "https"
url.getHost();     // "jsonplaceholder.typicode.com"
url.getPath();     // "/todos"
url.getQuery();    // "page=1"
url.getPort();     // -1 (기본 포트 443 사용)

"https://jsonplaceholder.typicode.com/todos?page=1"
  ↓
URL 객체 파싱
  ↓
프로토콜 : https
호스트   : jsonplaceholder.typicode.com
경로     : /todos
쿼리     : page=1
포트     : 443 (https 기본값)

 

문자열을 직접 안 쓰고 객체로 만드는 이유

// 문자열로는 이게 불가능
String urlString = "https://jsonplaceholder.typicode.com/todos";
urlString.openConnection(); // 문자열에는 이런 메서드 없음

// URL 객체는 가능
URL url = new URL(urlString);
url.openConnection(); // TCP 소켓 연결 생성

 


I/O 단원과의 연결

대상이 파일 → 소켓 → HTTP 연결로 바뀌었지만 읽는 구조는 항상 동일함

HTTP:  connection.getInputStream() → InputStreamReader → BufferedReader
소켓:  socket.getInputStream()     → InputStreamReader → BufferedReader
파일:  FileInputStream             → InputStreamReader → BufferedReader

 


핵심 요약

HTTP
  웹에서 데이터를 주고받기 위한 통신 규칙
  TCP 소켓 위에서 동작
  클라이언트 요청 → 서버 응답 구조

HTTP 메서드
  GET(조회), POST(전송), PUT(전체 교체), DELETE(삭제)
  부분 수정은 PATCH 가 담당 (스프링 부트에서 다룸는 내용)

HTTP 상태 코드
  200(성공), 404(없음), 500(서버 오류)

HttpURLConnection
  자바에서 HTTP 통신하는 클래스
  getResponseCode() 호출 시 실제 요청 전송
  Closeable 미구현 → try-with-resources 불가, finally 로 disconnect()
  Java 11 이상에서는 HttpClient (java.net.http) 가 대안 → Closeable 구현, 현대적 API

'Java > JAVA 유용한 클래스' 카테고리의 다른 글

JSON 파싱 - HTTP-3  (0) 2026.04.01
JSON - HTTP - 2  (0) 2026.03.31
컬렉션 프레임워크 실습 - 회원 관리 시스템  (0) 2026.03.31
Map 인터페이스 - 컬렉션  (0) 2026.03.31
Set 인터페이스 - 컬렉션  (0) 2026.03.30