개발

[React.js, 스프링부트, AWS로 배우는 웹 개발] 1장 - HTTP 메서드

jih0ssang 2024. 7. 16. 22:00

웹 개발 경험 없이는 컴퓨터 시스템 흐름을 평생 이해하기 어렵겠다 싶어서 개발... 까짓거 해보자 싶어서

냅다 도서관에 달려가 책 한 권을 빌렸다.

 

 

애플리케이션의 아키텍처

  • HTML/CSS/React.js
    • 프론트엔드 애플리케이션 개발에 사용
    • 프론트엔드 클라이언트를 반환하는 서버는 역할이 하나이다. React.js 애플리케이션을 반환하는 것이다!
  • 스프링부트
    • 백엔드 애플리케이션 개발에 사용
    • 스프링부트로 REST API를 구현. 이 API는 프론트엔드 애플리케이션이 사용한다.

 

HTTP ( HyperText Transfer Protocol)

 

  • 애플리케이션 레벨(L7)의 네트워크 프로토콜
  • 하이퍼텍스트 ('다른 문서로 향하는 링크가 있는 텍스트') + 트랜스펄 프로토콜 ('통신 규약')
  • 하이퍼링크를 위한 마크업 언어

 

  • 사용자는 브라우저라는 클라이언트를 통해 서버에 HTTP 요청을 전송함
    1. 브라우저의 주소창에 Domain을 입력하고 엔터
    2. DNS 서버가 해당 Domain의 서버 IP 반환
    3. 브라우저는 HTTP GET 요청을 서버에 전송
    4. 서버는 HTTP 응답을 브라우저에 렌더링 (화면에 Display)

[예제 1-1. HTTP 요청]

GET / HTTP/1.1
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML,
like Gecko) Version/14.0.3 Safari/605.1.15
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
  • Host는 localhost:8080   ( 발송자는 localhost:8080을 향해 GET 요청을 전송함 )
  • 프로토콜은 HTTP 1.1버전
  • 운영체제는 Mac OS X
  • 브라우저는 Safari
  • 요청 메서드는 GET   ( Host에 어떤 작업을 하고 싶은지 알려주는 역할) 

 

HTTP 메서드와 기능

메서드 기능
GET 리소스를 가져올 때 사용
POST 리소스에 대한 임의 작업(생성, 수정 등)할 때 사용
PUT 리소스를 대체할 때 사용
DELETE 리소스를 삭제할 때 사용

 

  • HTTP 메서드가 이런 기능을 하지만 개발자가 리소스에 어떤 작업도 하지 않고 그냥 반환만 할 수 있음
  • DELETE 메서드에 아무것도 삭제하지 않는 API를 구현해 사용할 수도 있음
  • 각 메서드에 연결되는 API는 개발자가 작성해야 함

 

[예제 1-2. HTTP 응답]

HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Keep-Alive: timeout=60
Pragma: no-cache
X-XSS-Protection: 1; mode=block
Expires: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Date: Sat, 17 Apr 2021 05:28:42 GMT
Content-Length: 32
Connection: keep-alive
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers

<html></html>
  • Content-Type: 응답의 미디어 타입. 미디어 타입에는 text/html, text/css, application/json, video/mpeg 등이 있음
  • 서버 애플리케이션은 보통 HTTP 응답 바디에 요청 처리 결과 ( ex_ Google의 랜딩 페이지 HTML)  를 보냄

 

JSON ( JavaScript Object Notation )

  • '오브젝트'를 표현하는 문자열
  • 자바스크립트에서 오브젝트를 생성하는 문법과 유사해 자바스크립트 오브젝트 노테이션이라고 이름이 붙음

 

오브젝트 (Object)

  • 메모리상에 존재하는 어떤 자료 구조

 

애플리케이션 1 --------------------------인터넷 -------------------------------> 애플리케이션 2

  • 인터넷을 이용해 데이터를 교환하려면 애플리케이션 1, 2는 서로 언어도 다르고 아키텍처도 다르지만 둘다 이해할 수 있는 형태로 오브젝트를 변환해야 함
  • 저장 또는 전송을 위해 메모리상의 오브젝트를 다른 형태(ex_JSON)로 변환하는 작업을 직렬화 (Serialization)
  • 다른 형태에서 메모리상의 오브젝트로 변환하는 것을 역직렬화 (deserialization) 라고 함

 

서버란?

서버에서 클라이언트에게 요청을 읽어올 때, 응답을 작성할 때 FTP (File Transfer Protocol)을 사용한다면 FTP 서버가 되는 것이고, HTTP를 사용한다면 HTTP 서버가 되는 것이다.

import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {
 public static void main(String[] args) {
  new WebServer().run();
 }
 
 public void run() {
  try {
   ServerSocket serverSocket = new ServerSocket(8080);
   while (true) {
    try {
     Socket client = serverSocket.accept();
     new Thread(() -> handleClient(client)).start();
    } catch (Exception e) {
     e.printStackTrace();
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  
  private static void handleClient(Socket client) {
    // (1) 클라이언트의 요청 읽어오기
    // (2) 클라이언트의 요청에 맞는 작업 수행하기
    // (3) 클라이언트에게 응답 작성하기
    // (4) 소켓 닫기
  }
}
  • 서버는 프로그램이다.
  • 8080포트에 소켓을 열고 클라이언트가 연결할 때까지 무한 대기하며 기다린다.
  • 클라이언트가 연결하면 해당 클라이언트 소켓에서 요청을 받아 수행하고 응답을 작성해 전달한다.

 

정적 웹 서버  ( Static Web Server)

  • 리소스 파일을 리턴하는 서버
  • 정적 웹 서버 흐름
    서버 호스트는 8080에서 실행하고 있는 로컬 호스트라고 가정하자.
    1. 클라이언트(브라우저)에서   localhost:808/file.html HTTP 요청을 서버 호스트에 보내면
    2. 정적 웹 서버인 이 서버는 지정된 디렉터리 경로에서 file.html을 찾아 그 내용을 HTTP 응답 바디에 반환
    3. 서버는 해당 HTML 파일에 아무 작업 없이 파일 있는 그대로 리턴
  • ex_Apache, Nginx
  •