Search
📒

3-1. 컴퓨터 통신과 HTTP

저희가 일상적으로 사용하는 웹 서비스, 웹 브라우저의 주소창에서 찾아볼 수 있는 HTTP라는 문구, 주소창의 복잡한 영문자들. 이들이 각자 무슨 역할을 하는지, Spring Boot를 비롯한 웹 프레임워크 라는 것의 역할이 무엇인지, 본격적으로 시작하기 전에 알아보고 가도록 합시다.

HTTP란?

우선 HTTP가 컴퓨터 통신이라는 개념에서 어떤 위치에 있는지를 살펴봅시다.
위의 그림은 컴퓨터 통신을 나타낼때 사용되는 OSI (7계층) 모델, 그리고 인터넷 통신에 널리 사용되는 TCP/IP 모델을 나타낸 그림입니다. 완전히 일치하는 그림은 아니나, 비슷한 색의 계층이 비슷한 역할을 표현한다고 보시면 됩니다. 기본적으로 HTTP를 비롯한 흔히 이야기하는 ‘통신 규약’ 이라는 것은 양쪽 모델에서 둘다 ‘응용 계층’에 해당하는 이야기 입니다. 응용 계층 상에 통신 규약이 정의되어 있다는 것은, 데이터를 주고받는 단계는 문제없이 진행 → 데이터를 어떤 형식으로 전달하고 해석하는지에 대하여 이야기한다는 뜻입니다.
이중 HTTP라는 통신 규약은, HyperText Transfer Protocol의 약자로서, 일반적으로 저희가 인터넷을 사용한다고 할때 사용하는 HTML을 비롯한 HyperText를 전달하기 위해 고안된 규약(Protocol)이라는 뜻입니다.
HTTP와 REST

HTTP 요청 / 응답

HTTP 요청과 응답은 유사한 세 부분으로 나눠져 있습니다. HTTP 요청의 형식을 보자면 다음과 같습니다.
Request Line: Method, Path, Version으로 나타나는 요청의 목적지와 목적이 드러나는 정보가 표현된 부분입니다.
Request Headers: 요청을 해석하는데 필요 / 도움되는 정보를 포함하고 있는, Metadata의 일종으로 생각할 수 있습니다.
Request Body: 요청을 시행하기 위한, 또는 시행하는 대상이 되는 데이터를 작성하는 부분입니다.
그리고 HTTP 응답 역시 유사하게 세 부분으로 나누어져 있습니다.
Status Line: 요청 처리에 대한 상태를 표시하는 부분입니다. 흔히 볼 수 있는 404 오류와 같은 부분도 여기에 작성됩니다.
Response Headers: Request Headers와 마찬가지로, 응답을 해석하는데 필요 / 도움되는 정보를 포함하고 있습니다.
Response Body: 요청 처리에 대하여, 요청한 데이터 또는 실제 응답에 대한 데이터입니다.

URL - Uniform Resource Locator

HTTP 요청의 내용을 보자면, Request Line에는 어디로 어떤 요청을 보내게 됩니다. 여기서 HOST, 즉 주소나 IP에 대한 정보는 표현되지 않습니다. HTTP 요청은 전달되어야 하는 컴퓨터에 대한 내용은 없지만, 해당 요청이 컴퓨터의 어디로 전달되어야 하는지가 작성되어 있습니다. 이를 Path, 즉 경로라고 부릅니다. 이 Path는 저희가 흔히 주소라고 부르는, URL 구조의 일부입니다.
URL은 Uniform Resource Locator의 약자로서, 인터넷 상의 특정 자원의 위치를 표현하는 용도로 사용된다고 볼 수 있습니다. 이는 위에 표시하였듯, 인터넷 상의 컴퓨터를 나타내는 부분과 컴퓨터 내부의 위치를 나타내는 부분으로 나눌 수 있습니다.
저희가 만드는 Web Application Server의 경우, 완성된 산출물을 어떤 특정한 컴퓨터에 전달하여, 해당 컴퓨터에서 실행, 그에 더해 다양한 서버 설정 작업을 필요로 합니다. 이는 Spring Boot를 다루는 부분과는 관계가 없는 내용입니다. 즉 저희가 Spring Boot를 다루게 되면, 위의 URL의 Path 이전까지는 직접적으로 다룰 일이 매우 한정적이라는 뜻입니다. 반면 내부에서 어디로 요청을 보낼지를 나타내는 경로는 Spring Boot Application을 만들면서, 제공해야 할 다양한 데이터 및 기능을 분류하기 위해 빈번하게 설정해야 합니다.
종합적으로 살펴볼때, 웹 어플리케이션, 정확히는 Backend Server를 만든다는 것은, 어떤 경로에 HTTP 요청이 들어오게 되는지를 결정하고, 해당 요청에 대한 처리를 하여 기능을 제공하는 부분을 코드로 작성하는 것을 의미하게 됩니다. 가장 간단하게는 웹 서비스를 위한 데이터의 관리, 브라우저에서 실행하기 힘든 기능의 처리, 사용자 정보 관리 등의 내용이 포함됩니다.

Media Type

Media Type(과거의 MIME Type)이란, 인터넷 상으로 오고가게 되는 데이터의 형식을 가리키는 식별자입니다. 저희가 인터넷을 통해서 볼 수 있는 데이터는 다양한 종류가 있습니다. 단순 글에서 부터, 사진, 음성, 영상 등 다양한 형태의 데이터가 오고갑니다. 이때 HTTP 요청 또는 응답에 어떤 데이터가 오고갈지를 Header에 표현을 하게 되며, 이때 사용하는게 Media Type입니다. 인터넷 상에서 사용하는 확장자라고 생각할 수 있습니다.
HTTP의 경우, 요청이든 응답이든 Content-Type 이라는 Header에 이 Media Type 식별자를 부여하게 됩니다. 저희가 흔히 접하는 HTML은 위 그림의 예시처럼 text/html 이라는 Media Type에 해당됩니다. 크롬 브라우저의 개발자 도구를 사용하면, 하나의 웹 페이지가 보여지면서 오고가는 다양한 데이터와 그 Media Type을 다 확인할 수 있습니다.
흔히 사용하는 이미지와 영상 외에 저희가 특히 알아야할 Media Type이 있다면, application/jsonmulitpart/form-data 를 들 수 있습니다. Backend 서버를 구성하고 데이터를 주고받게 되는 과정에서, 데이터를 표현하는 방식이 정의된 Media Type입니다. 일반적으로 정보만 주고받는 경우 application/json 을 많이 사용하고, 파일을 비롯한 binary 데이터를 주고받아야 하는 상황에, 요청을 multipart/form-data 로 보내도록 유도하게 됩니다.
특히 JSON 같은 경우 일반적인 Java 객체의 형태로 해석하기 편합니다. 그래서 Spring Boot를 사용하게 되면 이렇게 사용자의 데이터를 Java 객체의 형태로 표현하여 사용하는 것이 일반적입니다. JSON은 그 외에도 인터넷 Application들이 상호간에 소통을 할때 정보를 주고받기 위해 많이 사용하는, Attribute - Value 로 표현된 데이터 형식입니다. 문자, 숫자, Boolean 형 데이터를 지원하며, 배열과 하위 Attrubute - Value 형태의 객체를 표현할 수 있기에 복잡한 데이터도 쉽게 표현하기 좋습니다.