https://computerreport.tistory.com/72
[Spring]HTTP 란? (1)
✅ HTTP 란? (HyperText Transfer Protocol)다양한 형태(TEXT,IMAGE,FILE,HTML,JSON)가 World Wide Web(WWW,웹) 상에서 데이터를 주고받기 위한 프로토콜이다.서버간의 요청과 응답을 통해 작동한다.TCP/IP 통신 프로토콜
computerreport.tistory.com
지난 글에 이어 HTTP API 설계를 해보았다.
✅ HTTP API 설계
- 게시글 생성
- POST
- `/boards`
- 성공시 상태코드 2xx
- 실패시 4xx (클라이언트 문제) OR 5xx (서버 문제)
- 게시글 1개 조회
- GET
- `/boards/{id}`
- 성공시 상태코드 2xx
- 실패시 4xx (클라이언트 문제) OR 5xx (서버 문제)
- 게시글 목록 조회
- GET
- `/boards`
- 성공시 상태코드 2xx
- 실패시 4xx (클라이언트 문제) OR 5xx (서버 문제)
- 게시글 수정
- PUT or PATCH
- `/boards/{id}`
- 성공시 상태코드 2xx
- 실패시 4xx (클라이언트 문제) OR 5xx (서버 문제)
- 게시글 삭제
- DELETE
- `/boards/{id}`
- 성공시 상태코드 2xx
- 실패시 4xx (클라이언트 문제) OR 5xx (서버 문제)
추후에 Restful API 에 다룰 예정이다.
✅ HTTP Header란?
- 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보(Message Body 내용, 크기, 인증, 브라우저 정보, 서버 정보 등)를 전송할 수 있도록 만들어 준다.
♐ Header 구조
표준 헤더 링크
https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
List of HTTP header fields - Wikipedia
From Wikipedia, the free encyclopedia HTTP header fields are a list of strings sent and received by both the client program and server on every HTTP request and response. These headers are usually invisible to the end-user and are only processed or logged
en.wikipedia.org
✅ Restful API 란?
- REST를 잘 준수하는 API로 HTTP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 통해 자원(Resource)을 관리한다. 자원은 고유한 URI로 식별되며, HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 다양한 작업을 수행하며 요청과 응답은 일반적으로 JSON 또는 XML 형식으로 이루어진다.
💡 REST 란 무엇이죠?
자원(Resource)을 이름(Name)으로 구분하여 해당 자원의 상태(정보)를 주고받는 것을 의미한다.
참고자료:https://restfulapi.net/resource-naming/
REST API URI Naming Conventions and Best Practices
In REST, having a strong and consistent REST resource naming strategy – will prove one of the best design decisions in the long term. Let's discuss.
restfulapi.net
♐ 참고자료 정리
- 리소스는 명사를 사용해야 한다.
- 단수가 아닌 복수 형태를 사용해야 한다.
- 만약, REST만으로 해결하기 어려운 경우라면 동사를 허용한다.
- 자원의 계층 관계를 슬래시(/)로 표현한다.
- 마지막 문자에는 슬래시(/)가 있으면 안된다.
- 언더바(_)가 아닌 하이픈(-)을 사용해야 한다.
- 소문자를 사용해야 한다.
- URI에 파일 확장자를 포함하면 안된다.
- CRUD 함수명은 사용하지 않고, HTTP Method를 활용해야 한다.
- 정렬, 필터링, 페이징은 신규 API를 만드는것이 아닌 Query Parameter를 사용해야 한다.
♐ 성숙도 모델
- REST의 제약 조건에 따라 API를 등급화하는 방법이다.
Level0
- 웹 서비스를 제공하기 위해 URL만 매핑해 놓은 상태
POST /operation
{
"operation": "createUser",
"data": {
"name": "김지환",
"password": "1234"
}
}
Level1
- 외부로 공개하려는 리소스에 대해서 의미있는 URL로 표현하기 시작한 단계
- 적절한 패턴을 가지고 작성 되었지만 HTTP의 메소드 별로 서비스를 구분하여 사용하고 있지는 않다.
POST /users
{
"name": "김지환",
"password": "12345"
}
Level2
- 우리가 제공하고자 하는 리소스를 적절하게 용도와 상태에 따라서 HTTP Methods에 맞게 설계하고 서비스하는 단계.
- RESTful Service의 DB에 저장된 리소스를 확인하고 이러한 데이터를 조작하기 위해서 CRUD와 매칭되는 HTTP Methods를 이용하여 서비스 하는 것을 Level2 단계라고 한다.
GET /users/123 // 특정 사용자 조회
POST /users // 사용자 생성
{
"name": "김지환",
"password": "1234"
}
PUT /users/123 // 사용자 정보 수정
{
"name": "java",
"password": "spring"
}
DELETE /users/123 // 사용자 삭제
Level3
- 데이터를 가지고 그 다음 작업에서 어떠한 작업을 할 수 있는지 상태 정보를 함께 넘겨준다.(링크를 포함)
- 클라이언트 측에서는 서버가 제공하는 서비스를 일일이 찾는 수고를 겪지 않아도 된다.
GET /users/123
{
"id": 123,
"name": "김지환",
"links": {
"self": "/users/123",
"update": "/users/123",
"delete": "/users/123"
}
}
💡 Request methods
개발을 할땐 최소 Level 2 이상은 적용시키는 것이 바람직하다
참조링크
https://blog.restcase.com/4-maturity-levels-of-rest-api-design/
4 Maturity Levels of REST API Design
4 maturity levels of REST API with a more vide view along with REST API Design concepts like Versioning, Actions, Errors, Pagination and more.
blog.restcase.com
✅ Web Server
- HTTP 기반으로 동작하며 정적 리소스(HTML, CSS, JS, 이미지 등)를 제공한다.
♐ Web System 구성
- 정적 리소스는 Web Server 에서 처리한다.
- Web Server는 Application 로직이 필요한 요청만을 Was 에 전달한다.
💡 실제 Web System 구조의 장점은?
1️⃣ 효율적으로 리소스를 관리할 수 있다.
2️⃣ 오류 화면을 제공할 수 있다.
✅ Servlet
- Servlet은 HTTP 프로토콜 기반 요청(Request) 및 응답(Response)을 처리하는데 사용된다.
- JAVA에서 Sevlet은 HttpServlet 클래스를 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 기술 중 하나이다.
1. 서버와 TCP/IP 연결
2. HTTP Request Message 필요한 형태로 변환하여 읽기
1. HTTP Method 및 URL 분석
2. HTTP Header 분석
3. HTTP Message Body 읽기 및 변환
3. 분석한 결과를 통해 프로세스 실행
4. 비지니스 로직 실행
5. HTTP Response Message 생성
1. HTTP Start Line 생성
2. Header 생성
3. HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
4. 처리가 불가하다면 예외처리
6. 응답 전달
7. 연결 종료
♐ Servlet 동작순서
1. WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
2. WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 객체 호출
3. ExampleServlet에서 비지니스 로직 처리
4. 응답에 필요한 정보를 개발자가 입력
5. WAS는 Response 객체 정보(개발자가 입력한 정보)로 HTTP 응답 메세지 생성
♐ Servlet Container
- Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 있다. 서블릿 컨테이너는 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
서블릿 예시 코드
@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
@Override
protected void service(
HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
) {
// application logic
}
}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
// 위와 같은 코드
@WebServlet(name="Example3Servlet", urlPatterns = "/example3")
// 위와 같은 코드
@WebServlet(name="Example4Servlet", urlPatterns = "/example4")
// 위와 같은 코드
♐ Servlet Container 가 하는 일
1. 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
- Servlet 객체를 `싱글톤`으로 관리한다.
2. 동시 요청에 대한 처리를 위해 `Multi Thread`를 지원한다. 즉,WAS는 Multi Thread를 지원하기때문에 관련 코드를 고려하지 않아도 된다.
✅ Thread
- 플리케이션 코드를 하나하나 순차적으로 실행하는 것, Java에서 main method를 실행하면 main이라는 이름을 가진 Thread가 실행되며 하나의 Thread는 한번에 하나의 코드 라인만 수행한다.
- 만약 동시 처리가 필요하다면 Thread를 추가적으로 생성 해야한다.
다양한 Thread 가 있지만 현대에 사용하는 Thread 는 따로 존재한다.
♐ Thread Pool
- 요청이 들어오면 Thread Pool에서 Thread를 받아 사용한다.
- 사용 완료된 Thread는 Thread Pool에 반납한다.
장점
1. 요청 마다 Thread를 생성하는 단점을 보완하였다.
2. Thread가 미리 생성되어 있어서 Thread를 생성, 종료하는 비용이 절약된다. → 응답이 빠름
3. 생성 가능한 Thread 최대치가 제한되어 있어서 많은 요청이 들어와도 안전하게 처리할 수 있다.
단점
1. Thread Pool의 최대 Thread 수를 낮게 설정한다면 응답이 지연된다.
2. 최대 Thread 수가 너무 높으면 즉, 요청이 많아지면 리소스 부족으로 서버가 다운된다.
'Spring' 카테고리의 다른 글
[Spring] Controller 와 RestContoller 의 차이 (0) | 2025.04.10 |
---|---|
[Spring] MVC 패턴 (0) | 2025.04.07 |
[Spring]HTTP 란? (1) (0) | 2025.03.20 |
[Spring]DNS,URI,URL이란? (0) | 2025.03.19 |
[Spring] 네트워크에 대해 알아보자 (0) | 2025.03.19 |