서버란 무엇인가
clients ↔ response ↔ internet ↔ request ↔ server
사용자의 요청이 서버에 도달하기 위해서는 ip주소가 필요함
웹 서버 : 클라이언트에게 요청을 응답하는 일종의 컴퓨터
- 브라우저를 통해 HTTP Request로 웹사이트를 웹서버에 요청
- 이후 웹서버는 요청을 승인하고 HTTP Response를 통해 웹사이트 데이터를 브라우저에 전송
- 마지막으로 브라우저는 서버에서 받아온 데이터를 이용해 웹사이트를 브라우저에 그
- 브라우저가 웹서버에 GET method로 요청
API(application programming interface)는 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의합니다.
인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면을 의미합니다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미합니다.
RESTful API
Representational State Transfer(REST)
API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처 REST API : REST 아키텍처 스타일을 따르는 API REST 아키텍처를 구현하는 웹 서비스 : RESTful 웹 서비스
API의 리소스 식별자를 중복 없이 고유하게 잘 만들고 해당 API에 적절하게 HTTP 메서드를 사용했다면, RESTful하게 설계했다고 볼 수 있다.
URL
Uniform Resource Locator
서버는 고유 리소스 식별자로 각 리소스를 식별함.
REST 서비스의 경우 서버는 일반적으로 URL을 사용하여 리소스를 식별함.
- 리소스에 대한 경로를 지정함
- 웹페이지를 방문하기 위해 브라우저에 입력하는 웹사이트 주소와 유사함
- 요청 엔드포인트라고도 함
- 클라이언트의 요구사항을 서버에 명확하게 지정함
Method
개발자는 종종 HTTP(Hypertext Transfer Protocol)을 사용하여 API를 구현함
HTTP 메서드는 리소스에 수행해야하는 작업을 서버에 알려줌
HTTP 메서드 대표 4가지
GET
클라이언트 :
GET을 사용하여 서버의 지정된 URL에 있는 리소스에 액세스
GET 요청을 캐싱
RESTful API요청에 파라미터를 넣어 전송하여 데이터를 필터링하도록 서버에 지시
POST
클라이언트 :
POST를 사용하여 서버에 데이터를 전송
요청과 데이터 표현이 포함됨
동일한 POST요청을 여러번 전송하면 동일한 리소스를 여러 번 생성하는 문제 발생
PUT
클라이언트 :
PUT을 사용하여 서버의 기존 리소스를 업데이트
RESTful 웹 서비스에서 PUT요청을 여러 번 전송해도 결과는 동일
Q.왜?
Apache Tomcat
Web Server
브라우저에서 URL을 입력하여 어떠한 페이지를 요청했을 때 HTTP의 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를 사용자에게 전달해주는 역할을 함
웹 서버의 역할
- 정적인 컨텐츠(이미 완성된 HTML 등)를 브라우저로 전달
- 브라우저로부터 동적인 요청이 들어왔을때 요청을 WAS에 전달
웹 서버의 종류
Apache, Nginx 등
Web Application Server(WAS)
WAS는 웹 서버와 똑같이 HTTP 기반으로 동작
웹 서버에서 할 수 있는 기능 대부분이 WAS에서도 가능
WAS 의 종류
Tomcat, JBoss
Apache Tomcat
동적인 처리를 할 수 있는 웹 서버를 만들기 위한 웹 컨테이너
Apache Tomcat = Apache + Tomcat
정적인 데이터 처리와 동적인 데이터 처리를 효율적으로 할 수 있다.
Spring
Spring 프레임워크
2004년에 1.0이 등장한 이후 20년 가까이 계속해서 업그레이드 해온 오래되고 강력한 프레임워크
현재는 Spring 6.0
AOP, IoC/DI 등과 같은 아주 강력한 핵심 기능들을 가지고 있다.
이 기능들을 사용하기 위해 너무 많은 xml설정들이 필요했음
불편한 점을 개선하기 위해 SpringBoot가 등장
SpringBoot
기존의 xml 설정 대신 Java의 애너테이션 기반의 설정을 사용
무겁고 작성하기 힘들던 xml 대신에 애너테이션을 사용하여 아주 간편하게 설정가능
기본적으로 개발에 필요한 설정 정보들을 일반적으로 많이 사용하는 설정 값을 default로 하여 자동으로 설정해줌
외부 라이브러리나 하위 프레임워크들의 의존성 관리가 매우 쉬워짐
기존에는 외부 라이브러리와 프레임워크를 사용하기 위해서 각각의 버전들의 호환성을 직접 확인해가면서 의존성들을 설정해야 했지만 SpringBoot에서는 spring-boot-starter-web 처럼 필요한 외부 라이브러리들과 프레임워크들을 의존성에 맞게 starter로 묶어서 제공해 줌
이전처럼 각각의 버전 호환성을 직접 확인할 필요가 없어짐
SpringBoot의 강점 : 내장 Apache Tomcat
Spring 프레임워크에서는 서버를 실행시키기 위해 Apache Tomcat을 직접 다운로드 받고 설정하고 프로젝트에 삽입헤야 함
이러한 불편함을 해결하기 위해 SpringBoot에서는 기본적으로 starter-web dependency를 설정하면 자동으로 내장형 Apache Tomcat을 제공해 줌
HTTP란 무엇일까
HTTP : 데이터를 주고받는 양식을 정의한 통신 규약중 하나
범용적인 양식을 가지고 있어 전 세계에서 제일 널리 쓰임
통신 규약 : 컴퓨터끼리 데이터를 주고받을 때 정해둔 약속
대부분의 웹 서버가 HTTP를 기반으로 정해준 규칙에 맞게 데이터를 송수신
모든 브라우저는 HTTP 프로토콜을 기본으로 지원
HTTP가 데이터를 송수신하는 방법
Request : 브라우저는 서버에게 자신이 원하는 페이지(URL 등의 정보)를 요구
Response : 서버는 브라우저가 원하는 페이지가 있는지 확인하고, 있다면 해당 페이지에 대한 데이터를 실어 응답, 없다면 없는 페이지에 대한 데이터 반환
브라우저에서 HTTP가 동작하는 것을 직접 확인해보기
- 개발자 도구와 네트워크 탭 열어보기
- 원하는 웹 페이지
- 브라우저에서 F12→DevTool (개발자 도구)
- 원하는 웹 페이지
- 브라우저에서 F12→DevTool (개발자 도구)하단에 뜨는 창. 색이나 위치가 다를 수 있음!
- 네트워크 탭
- 새로고침
- 브라우저가 지금 페이지를 보여주기 위해 서버에서 받아온 데이터 목록
2) 네트워크(Network) 탭 좌측 Name 목록 아래 요청 클릭
3) Headers 탭 살펴보기
General
브라우저에서 서버로 보낸 Request 데이터
Status Code 200 : 요청이 성공했다는 뜻!
**Status Code(**HTTP 상태 코드)
브라우저와 서버간의 요청, 응답 과정에서 발생할 수 있는 상황들을 표현
- 첫 번째 자리 숫자 : 상태 코드의 분류
- 나머지 두 자리 : 세부적인 정보
1xx (Informational)
- 요청이 수신 되었으며 처리가 계속되고 있음
- 주로 웹 브라우저와 같은 클라이언트가 서버와의 연결 상태를 확인하기 위해 사용
2xx (Successful)
- 클라이언트의 요청이 성공적으로 처리 되었음
- 가장 많이 사용되는 상태 코드는 200
- 200 : 요청이 성공적으로 처리 되으며 클라이언트가 요청한 데이터가 서버에서 제공됨을 의미합니다.
3xx (Redirection)
- 클라이언트가 추가적인 조치를 취해야 함
- 이 상태 코드는 주로 페이지 이동, 리다이렉션 등에 사용
4xx (Client Error)
- 클라이언트에 오류가 있음
- 이 상태 코드는 주로 클라이언트의 잘못된 요청, 인증 오류 등에 사용됨
- 404 : 클라이언트가 요청한 페이지나 리소스를 서버에서 찾을 수 없음
5xx (Server Error)
- 서버에 오류가 발생했음
- 주로 서버의 오류, 서버 과부하 등에 사용
- 500 : 서버 내부 오류가 발생함
Request Headers
브라우저에서 서버로 보낸 Request 데이터
Response Headers
서버가 웹 페이지 데이터와 함께 보낸 추가 데이터
- Response 탭 살펴보기
- Response 탭으로 고고
- 서버에서 여러분의 브라우저로 반환해준 웹 페이지를 그려주기 위한 데이터
Headers 탭 추가 데이터 vs Response 탭 그냥 데이터
HTTP의 구성 요소
Method (호출/요청 방식)
GET: 어떤 리소스를 얻을 때 사용
- 브라우저의 주소창에 URL을 입력하면 GET 메서드를 사용해서 서버에 요청을 보냄
POST: 웹 서버에 데이터를 게시할 때 사용(ex. 회원가입, 게시글 작성, 댓글 작성)
기타 DELETE 등등
Header (추가 데이터. 메타 데이터)
- 브라우저가 어떤 페이지를 원하는지
- 요청 받은 페이지를 찾았는지
- 요청 받은 데이터를 성공적으로 찾았는지
- 어떤 형식으로 데이터를 보낼지
GET **naver.com** HTTP/1.1
- 이외에도 의사 표현을 위한 데이터를 모두 Header 필드에 넣고 주고 받음
- 위에서 설명 된 메서드도 사실은 헤더에 포함되어 서버로 보내짐
Payload (데이터. 실제 데이터)
- 서버가 응답을 보낼 때에는 항상 Payload를 보낼 수 있다.
- 클라이언트(브라우저)가 요청을 할 때에도 Payload를 보낼 수 있다. 그리고 "GET method를 제외하곤 모두 Payload를 보낼 수 있다" 는게 HTTP에서의 약속!
- HTML
<!DOCTYPE html>
<html>
<head><title>By @ResponseBody</title></head>
<body>Hello, Spring 정적 웹 페이지!!</body>
</html>
- JSON
{ "name":"Robbie", "age": 20 }
- HTTP의 Payload를 통해 위와 같은 데이터들을 요청하고 응답 받을 수 있다.
'TIL(Develop)' 카테고리의 다른 글
Lombok과 application.properties (0) | 2023.11.02 |
---|---|
테스트코드 (0) | 2023.11.02 |
첫 실습! HelloWorld GET해오기 with SpringBoot + Postman (1) | 2023.11.01 |
Spring 입문 (1) | 2023.10.31 |
Html 속성 Html Attributes (0) | 2023.09.06 |