상세 컨텐츠

본문 제목

POST요청과 GET요청의 차이점

IT

by JR 2025. 11. 21. 19:08

본문

300x250
반응형

 

 

 

 

1️⃣ POST 요청

if ("POST".equals(method)) {
    // ...
}
  • 목적: 서버에 데이터를 보내서 처리할 때 사용
  • 특징:
    • 요청 본문(Body)에 데이터가 들어감 → 여기서는 JSON (PaymentRequest)
    • 서버는 데이터를 처리하고, 처리 결과를 응답으로 돌려줌
  • 이번 예제에서는:
    • Main → PaymentService → MockPaymentServer
    • 서버는 JSON을 받고, 콘솔 출력 후 응답 JSON을 돌려줌
    • 실제 결제 요청 같은 행위를 시뮬레이션

POST = “데이터 보내기 / 작업 수행 요청”


2️⃣ GET 요청

else if ("GET".equals(method)) {
    // ...
}
  • 목적: 서버에서 데이터를 가져오기 위해 사용
  • 특징:
    • 요청 본문은 거의 없고, URL과 쿼리스트링을 통해 데이터 요청
    • 브라우저에서 URL을 열면 기본적으로 GET 요청
  • 이번 예제에서는:
    • 브라우저에서 http://localhost:8081/payment 열 때 GET 요청 발생
    • 서버는 requestLogs 리스트를 HTML로 변환해 브라우저에 보여줌
    • 콘솔이 아니라 웹 화면에서 확인용

GET = “데이터 조회 / 보기 전용”


3️⃣ 왜 나눴는가?

  1. POST → Main이 보내는 실제 요청 데이터 처리
  2. GET브라우저에서 요청 로그 확인용
  • POST와 GET을 분리하지 않으면
    • 브라우저에서 열 때 서버가 JSON 처리하려고 하거나
    • Main에서 POST 요청 보내는 것과 브라우저 요청이 충돌할 수 있음
  • HTTP 설계 원칙:
    • POST → 서버에 변화가 있는 작업
    • GET → 서버 상태 조회, 부작용 없음

4️⃣ 호출 경로

Main (클라이언트)  ---POST--->  MockPaymentServer (서버)
 브라우저            ---GET--->  MockPaymentServer (서버, 로그 확인용)
  • POST: 데이터 보내고 처리 → 서버 응답(JSON)
  • GET: 데이터 읽기만 → 서버 응답(HTML 로그)

 

 


server.createContext("/payment", httpExchange -> { ... }) 개념

server.createContext("/payment", httpExchange -> { 
    // 여기서 요청 처리 코드
});

의미

  1. server.createContext(String path, HttpHandler handler)
    • path : 클라이언트가 접근할 URL 경로 (/payment)
    • handler : HTTP 요청을 처리할 코드 블록 (HttpHandler 인터페이스)
  2. httpExchange -> { ... }
    • 람다 표현식, 사실상 다음과 같은 함수형 인터페이스 구현과 동일:
server.createContext("/payment", new HttpHandler() {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
        // 요청 처리
    }
});
  • 여기서 httpExchange가 POST/GET 요청 정보를 가지고 있는 객체
  • 서버는 /payment URL로 요청이 들어오면 이 람다(혹은 handle 메서드)를 호출

2️⃣ HttpExchange 내부 구조 (개념도)

         +-----------------------+
클라이언트 |      Http Request      |
---------> |  - Method: POST/GET   |
           |  - Headers            |
           |  - Body(InputStream)  |
           +-----------------------+
                     │
                     ▼
          +------------------------+
          |  HttpExchange 객체      |
          |------------------------|
          | getRequestMethod()     | <-- 요청 메서드
          | getRequestHeaders()    | <-- 헤더
          | getRequestBody()       | <-- 바디
          | getResponseHeaders()   | <-- 응답 헤더
          | getResponseBody()      | <-- 응답 바디
          | sendResponseHeaders()  | <-- 상태코드 설정
          +------------------------+
                     │
                     ▼
           서버 응답(Http Response)
           <-----------------------

요약

  • HttpExchange = 클라이언트 요청 + 서버 응답 정보 모두 담고 있는 객체
  • POST/GET 구분: httpExchange.getRequestMethod()
  • 요청 바디 읽기: httpExchange.getRequestBody()
  • 응답 작성: httpExchange.getResponseBody().write(...) + sendResponseHeaders(...)

3️⃣ 예제 흐름

[Main.java] POST(JSON)
        │
        ▼
[MockPaymentServer.java / httpExchange] <-- exchange가 모든 정보 담음
        │   - POST인지 GET인지 확인
        │   - 요청 바디 읽고 로그 저장
        │   - 응답 JSON 생성 후 client에게 반환
        ▼
[Main.java] 응답 JSON 수신

브라우저가 URL 열면:

[Browser] GET
        │
        ▼
[MockPaymentServer.java / httpExchange]
        │   - GET인지 확인
        │   - requestLogs HTML로 변환
        ▼
[Browser] HTML 로그 확인

🔹 핵심 포인트

  1. server.createContext("/payment", ...) → "/payment" 요청을 처리하는 컨텍스트 생성
  2. 람다의 httpExchange → 요청/응답 정보 전체 담고 있음
  3. POST/GET 요청을 구분해 각각 다르게 처리 가능
  4. 브라우저는 기본 GET → HTML 출력, Main/클라이언트는 POST → JSON 처리

 

300x250
반응형

관련글 더보기