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 {
//리소스 닫기
// .. 생략
}
}
}