-
RESTful APISpring 2021. 12. 19. 15:41
API는 Application Programming INterface로 컴퓨터 프로그램간 서로 정보 교환이 가능하도록 하는 것으로
REST API는 REST기반으로 서비스 API를 구현한 것이다.
RESTful API
RESTful API란 REpresentational State Transfer로 자원에 대한 행위 를 HTTP Method(GET, POST, PUT, DELETE)로 표현하고 자원을 URI로 표현하는 REST아키텍쳐를 스타일 을 따르면서 구현된 시스템을 말한다. 이해하기 쉽고 사용하기 쉬운 API를 만드는 것이 목적이다.
REST의 속성
REST는 자원 기반 구조(Resource Oriented Architecture)의 4가지 속성을 따른다.
- Addressability : 제공하는 모든 정보를 URI(주소)를 통해 표현 가능
- Connectedness : 하나의 리소스는 주면의 여러 연관 리소스들과 연결되어 표현이 가능
- Statelessness : 모든 요청은 1회성이며 이전 요청에 영향받지 않음, 현재 클라이언트 상태를 서버에서 관리하지 않고 URI에 현재 state 표현
- Homogeneous Interface : HTTP에서 제공하는 기본 method(4가지)와 추가 method(2가지)를 이용해 모든 동작을 정의
REST 아키텍쳐 스타일
REST 아키텍쳐 스타일을 작성하는 제약조건은 다음과 같다.
- client-server ( 클라이언트 / 서버 구조 ) : REST서버와 클라이언트는 각각의 역할이 독립되어 의존성이 낮아야 한다.
- stateless ( 무상태성 ) : API서버는 들어오는 요청만을 단순하게 처리하고 각 요청간 클라이언트의 Context는 서버에 저장하면 안된다. (ex)HttpSession(컨텍스트 저장소)에 상태정보 저장 혹은 관리하지 않음)
- cacheable ( 캐시 가능 ) : 클라이언트는 응답을 캐싱(HTTP 장치로 자주 쓰이는 문서의 사본을 자동으로 보관)할 수 있어야 한다.
- uniform interface ( 인터페이스 일관성 ) : 아키텍쳐는 단순화되고 작은 단위로 분리되어 클라이언트와 서버 별로 독립적으로 조작, 개선이 가능해야 한다.
- layered system ( 계층형 구조 ) : 클라이언트는 REST API서버만 호출하고 REST 서버는 다중계층으로 구성된다. 추가로 Proxy, 게이트웨이와 같은 네트워크 기반의 중간 매체를 사용할 수 있다.
- code-on-demand ( Optional ) : 서버로 부터 스크립트를 받아서 클라이언트에서 실행한다. (자바 애플릿/자바스크립트의 제공으로 서버가 클라이언트 실행 로직을 전송하여 기능을 확장가능)
REST API 설계 기본 규칙
- URI는 정보의 자원을 표현 ex) GET members
- 자원은 명사, 소문자를 사용
- 자원의 도큐먼트 이름으로는 단수 명사 사용
- 자원의 컬렉션(서버 관리 디렉터리 리소스), 스토어(클라이언트 관리 리소스 정보) 이름으로 복수 명사 사용
- 자원에 대한 행위는 HTTP method를 이용해 표현 ex) POST memebers/12
- URI에 HTTP method가 포함되면 안된다.
- URI에 행위에 대한 동사 표현이 들어가면 안된다. (CRUD기능을 나타내는 것은 URI에 사용하지 않는다)
- 경로에 변하는 부분은 유링한 겂으로 대체한다.
REST API 설계 규칙
- 슬래시 구분자( / )는 계층 관계를 나타내는데 사용
- URI 마지막 문자로 / 를 포함하지 않음
- 하이픈( - )은 URI 가독성을 높이는데 사용
- 밑줄( _ )은 URI에 사용하지 않음
- URI 경로에는 소문자 사용
- 파일 확장자는 URI에 포함하지 않음
- 리소스의 연관관계 표현 ( / 리소스명/ 리소스 id / 관계가 있는 다른 리소스명 )
REST API 설계 예시
HTTP method route 기능 GET /resources resource들을 표시 GET /resources/:id 하나의 resource를 표시 POST /resources 새로운 resource를 생성 PUT /resources/:id resource를 수정 DELETE /resources/:id resource를 삭제 응답 상태 코드
1xx ( 정보 ) 전송 프로토콜 수준의 정보 교환 (정보 요청, 프로세스 진행) 2xx ( 성공 ) 클라이언트 요청이 성공적으로 인식되고 수행됨 3xx ( 리다이렉션 ) 클라이언트 요청을 완료하기 위해 추가 작업 조치 필요 4xx ( 클라이언트 오류 ) 클라이언트의 잘못된 요청 (요청 처리할 수 없음) 5xx ( 서버 오류 ) 서버의 오류로 인한 유효한 요청에 대한 실패 (참고한 사이트)
https://brainbackdoor.tistory.com/53
https://stackoverflow.com/questions/671118/what-exactly-is-restful-programming
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://velog.io/@isthis/WIL-RESTful-API-etc
https://sanghaklee.tistory.com/57
'Spring' 카테고리의 다른 글
테스트 코드 작성할 때 Junit5 사용시 JUnit Vintage 오류 발생 (0) 2022.01.11 Lombok 사용시 주의할 점 (0) 2021.12.29 트랜잭션 (feat. @Transactional) (0) 2021.12.18 연관 관계의 엔티티 기준으로 order 해서 데이터를 가져오고 싶을 때 (0) 2021.11.06 multipart.MaxUploadSizeExceededException 오류 발생시 (0) 2021.11.06