웹 서비스 구조
HTTP socket을 segment로 나눠서 Packet 형태로 모아 전송
- TCP/IP - HTTP를 통해 Client와 Web의 연결
Client가 URL를 통해 페이지 요청(GET) → Web에서 Html 문서 뷰어 + (CSS)를 보냄
Html + CSS(정적) + JS(동적)
POST 등장으로 양방향 상호작용 가능
상태 전이를 위해 클라이언트와 서버 쪽 모두 기억해야 할 것이 생김 → 클라이언트 쪽: Cookie 서버 쪽: DB
REST란?
Representational State Transfer라는 용어의 약자로서 웹의 장점을 최대한 활용할 수 있는 아키텍처
API란?
많은 개발자들이 데이터와 상호작용을 하기 위한 인터페이스
용어
- Resource : 어떤 것의 대표 혹은 객체이다. 이는 관련 데이터를 갖고 있고, 이를 운용하기 위한 메소드 집합을 가질 수 있다. 예: Animals, schools, employees는 resources이고 delete, add, update는 이 resources에서 수행되는 operations이다.
- Collections : resources의 집합이다. 예: Companies는 Company resource의 집합이다.
- URL (Uniform Resource Locator) : 어느 resource가 어디에 위치할 수 있고 어떤 action들이 수행될 수 있는 지를 나타내는 경로이다.
REST API 란 ?
- HTTP URL을 통해 자원을 명시하고 HTTP Method (POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD OPERATION을 적용하는 것을 의미한다.
- 웹의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.
- 플랫폼에 맞추어 새로운 서버를 만드는 수고를 들이지 않기 위해 범용적으로 사용성을 보장하는 서버 디자인이다.
Restful api 만드는 이유
- Client Side를 정형화된 플랫폼이 아닌 모바일, PC, 어플리케이션 등 플랫폼에 제약을 두지 않는 것을 목표로 한다.
- 메시지 기반, XML, JSON과 같은 Client에서 바로 객체로 치환 가능한 형태의 데이터 통신을 지향하게 되면서 Server와 Client의 역할을 분리한다.
REST의 구성
- 자원(Resource) : URL
- 행위(Verb) : Http Method
- 표현(Representations)
자원 (Resource) - URL
- 모든 자원에 고유한 ID가 존재하고 이 자원은 Server에 존재한다.
- 자원을 구별하는 ID는 /orders/order_id/1 와 같은 HTTP URI이다.
예시)
https://(도메인)/classes/2 → 학원 반 목록을 받아오는 요청 → 초급 반의 정보가 온다.
{
"results" : [
{"idx": 1, "name": "예비반"},
{"idx": 2, "name": "초급반"},
{"idx": 3 , "name": "중급반"},
]
{
행위 (Verb) - Http Method
- HTTP 프로토콜의 Method를 사용한다.
- HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다.
표현 (Representaion of Resource)
- Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답을 보낸다.
- REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태로 나타낼 수 있다.
- 현재는 JSON으로 주고 받는 것이 대부분이다.
HTTP METHOD의 알맞는 역할
- POST : POST를 통해 해당 URL를 요청하면 리소스를 생성한다.
- GET : GET를 통해 해당 리소스를 조회한다. 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다.
- PUT : PUT을 통해 해당 리소스를 모두 수정한다.
- DELETE : DELETE를 통해 리소스를 삭제한다.
- PATCH : 정보 중 일부를 특정 방식으로 수정할 때 사용한다.
특징
- BODY에 CRUD 정보 요청 작성
- GET. DELETE 보다 POST. PUT. PATCH가 비교적 안전하게 감춰서 실어 보낸다.
예시
- 몇 가지 다른 사용 사례에서 resource 아래에 여러 개의 resources가 있는 경우 (예 : 회사의 직원들), API endpoint(API 호출이 수행되는 곳)는 아래와 같을 수 있다.
- GET /companies/3/employees 는 company 3에 속하는 employees 전체 목록을 가져온다.
- GET /companies/3/employees/45 는 company 3에 속하는 employee 45의 상세 내용을 가져온다.
- DELETE /companies/3/employees/45 는 company 3에 속하는 employee 45를 삭제한다.
- POST /companies 는 새로운 company를 생성하고 생성된 company의 상세 내용을 리턴한다.
HTTP 상태 코드
클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능
2XX : 요청 정상 처리
200 : OK
201 : 서버가 리소스 생성..Location : /members/100
204: 저장 시 보낼 데이터 없음
3XX : 요청을 완료하려면 추가 행동이 필요. 리다이랙트 사용 시
4XX : 클라이언트 오류
5XX : 서버 오류
특징
클라이언트 / 서버 구조
- 클라이언트는 유저와 관련된 처리를 하고 서버는 REST API를 제공함으로써 각각의 역할이 확실하게 구분되고 일괄적인 인터페이스로 분리되어 작동할 수 있게 한다.
- REST Server : API를 제공하고 비지니스 로직 처리 및 저장을 책임진다.
- Client : 사용자 인증이나 context (세션, 로그인 정보) 등을 직접 관리하고 책임진다.
무상태성
- REST는 HTTP의 특성을 이용하기 때문에 무상태성을 갖는다. 즉 서버에서 어떤 작업을 하기 위해 상태 정보를 기억할 필요가 없고 들어온 요청에 대해서만 처리해주면 되기 때문에 구현이 쉽고 단순해진다.
캐시 처리 가능
- HTTP라는 기존 웹 표준을 사용하는 REST의 특징 덕분에 기본 웹에서 사용하는 인프라를 그대로 사용 가능하다.
- 대량의 요청을 효율적으로 처리하기 위해 캐시가 요구된다.
자체 표현 구조
- JSON을 이용한 메시지 포멧을 이용하여 직관적으로 이해할 수 있고 REST API 메시지만으로 그 요청이 어떤 행위를 하는지 알 수 있다.
기타 특징
- 각 요청이 어떤 동작이나 정보를 위한 것인지 요청의 모습 자체로 추론이 가능하다.
- Restful하게 만든 API는 요청을 보내 주소만으로도 무엇을 하는지 대략 유추 가능하다.
- URL은 오직 resources(명사)만 포함해야 하며 동사나 actions를 포함해서는 안된다.
- GraphQL이 대안으로 떠오르고 있다.
규칙
중심 규칙
- URL은 정보의 자원을 표현해야 한다.
- 자원에 대한 행위는 HTTP Method (GET, POST, PUT, DELETE 등)으로 표현한다.
세부 규칙
- 슬래시 구분자 ( / )는 계층 관계를 나타내는데 사용한다.
- URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.
- 하이픈 ( - )은 URI 가독성을 높이는데 사용한다.
- 밑줄 ( _ )은 URI에 사용하지 않는다.
- URI 경로에는 소문자가 적합하다.
- 파일확장자는 URI에 포함하지 않는다.
Swagger
스웨거란 RESTAPI 개발시 문서를 자동으로 만들어주는 프레임워크이다.
Request 날릴때 사용한다.
postman을 사용해도 되고 이 swagger를 사용해도 좋다.
gradle인 경우 라이브러리에 추가해야 한다.

OrderRequest/Response: 송/수신 DTO 파일
Controller에 @ApiOperation 어노테이션을 API에 추가해 API에 대한 주석을 달 수 있음(옵션)
Response용 DTO에 @ApiModelProperty
public class OrderResponse {
@ApiModelProperty(example = "Order id")
private String id = null;
@ApiModelProperty(example = "주문 수량")
private int quantity = 0;
@ApiModelProperty(example = "주문 일자")
private String date = null;
@ApiModelProperty(example = "주문 상태")
private String status = null;
@ApiModelProperty(example = "주문 완료 여부")
private boolean complete = false;
기본 세팅법
의존성 추가, 설정 추가
SwaggerConfig.class
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private static final String API_NAME = "Study API";
private static final String API_VERSION = "0.0.1";
private static final String API_DESCRIPTION = "Study API 명세서";
@Bean
public Docket api() {
Parameter parameterBuilder = new ParameterBuilder()
.name(HttpHeaders.AUTHORIZATION)
.description("Access Tocken")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
List<Parameter> globalParamters = new ArrayList<>();
globalParamters.add(parameterBuilder);
return new Docket(DocumentationType.SWAGGER_2)
.globalOperationParameters(globalParamters)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.kjh.study.api"))
.paths(PathSelectors.any())
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(API_NAME)
.version(API_VERSION)
.description(API_DESCRIPTION)
.build();
}
}
api 작성 예제 https://petstore.swagger.io
Swagger UI
petstore.swagger.io
Postman
API 개발을 보다 빠르고 쉽게 구현 할 수 있도록 도와주며, 개발된 API를 테스트하여 문서화 또는 공유 할 수 있도록 도와 주는 플랫폼
GET은 단순하게 확인이 가능하지만 post / put / delete 등 HTTP의 응답을 확인하기 위해 별도의 작업이다.
GET : 데이터를 주소에 붙여서 보내기
POST
raw, JSON 선택
@RequestBody
@RestController
Collections에 API URL을 추가한다.
API 추가 (요청 준비) NEW - Request - name(임의) - Collection명 정하고 체크 - Save 결과 확인하기 요청방식. URL 짝 맞게 메소드 설정 - URL 입력하고 Send -> Response 표시
+ 버튼으로 새탭을 열어 요청정보 추가 가능 새로 연 탭은 Save 버튼으로 Collection에 저장이 가능