Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- java변수
- While
- 인텔리제이 기초 설정
- 메서드
- for문
- continue문
- 집합관계
- 형 변환
- 반복문
- Java데이터 타입
- 상수
- IntelliJ IDEA
- 시스템 환경 변수 편집
- this예약어
- Java
- Thread
- function
- 접근제어지시자
- 컴파일
- 자바 멀티스레딩
- 포함관계
- break문
- OPP개념
- 연관관계
- JAVA객체지향
- multi-threading
- 생성자
- JAVA기초
- 인텔리제이 한글 깨짐 해결법
- 메서드 오버로딩
Archives
- Today
- Total
최원종의 개발 블로그
HTTP- 1 본문
웹 동작 방식
소켓 통신 (직접 연결):
프로그램 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 |

