RESTful 자바 패턴과 실전 응용: 4장 성능을 고려한 설계
4장 성능을 고려한 설계
Caching
- String caching header
- Expire
- Cache-Control
- private: 브라우저에서만 캐쉬 가능
- public: 브라우저, 프록시, CDN 모두 캐쉬 가능
- no-cache: 캐쉬 불가
- no-store: 메모리에만 캐쉬
- max-age: 리소스 유효 기간 (초)
- Weak caching header
- Last-Modified
- ETag
- Client -> Server: GET http://api.com/coffee/1234
- Client <- Server: 200 OK with ETag "123456789"
- Client -> Server: GET http://api.com/coffee/1234 with If-None-Match "123456789"
- Client <- Server
- 200 OK with new ETag "abcdefghi" (변경된 리소스)
- 304 Not-Modified (변경되지 않은 경우)
- Stringly validating ETag match
- Weakly validating ETag match
REST에서 비동기 작업 및 실행 시간이 긴 작업
- 비동기 요청 응답: 202 Accepted
JAX-RS 2.0에 추가된 비동기 인터페이스와 클래스
- Server-side
- AsyncResponse: 주입 가능한 JAX-RS 비동기 응답. 서버 측에서 비동기적으로 응답 처리할 수단 제공
- @Suspended: 컨테이너가 HTTP 요청을 다음 스레드에서 처리하도록 지시
- CompletionCallback: 요청 처리 완료 시 호출되는 callback
- ConnectionCallback: 접속과 관련된 비동기 응답의 라이프사이클 이벤트를 받는 비동기 요청 처리 라이프사이클 callback
- Client-side
- InvocationCallback: 호출 처리 과정에서 비동기 처리 이벤트를 받아 처리하는 callback
- Future: 클라이언트로 하여금 비동기 작업의 완료 상태를 폴링하거나 차단, 대기할 수 있게 해주는 장치
@Context를 활용한 비동기 응답 코드
@Suspend를 활용한 비동기 응답 코드
@Context 대비하여 코드가 더 깔끔하다.
Future를 이용한 비동기 클라이언트 요청 코드
서버에서 응답이 오기까지 30초를 기다린다.
그 외에 javax.ws.rs.client.InvocationCallback을 활용하여 구현할 수 있다.
비동기 리소스에 관한 베스트 프랙티스
202 Accepted 메시지 전송
리소스가 오래 걸리지 않고 (몇 초 이내) 준비될 수 있다면 202 Accepted 응답을 리턴하고, 메시지 내부에 Location 헤더를 통해 클라이언트가 생성될 리소스를 어디에서 찾아야 할 지 알려준다.
큐에 대기 중인 객체의 만료 시각 설정
메시지 큐를 이용한 비동기 처리
AMQP(Advanced Messaging Queuing Protocol)는 안전한 방법으로 메시지를 구독, 출판, 큐잉, 라우팅할 수 있는 표준.
RabbitMQ 참고
HTTP PATCH와 부분 업데이트
HTTP PATCH를 이용하여 부분적인 정보를 업데이트한다. 전체 데이터를 포함하지 않아도 되므로 대역폭을 절약할 수 있다.
PATCH /coffee/orders/1234
{ "status" : "COMPLETED" }
패치를 지원하지 않는 서버, 클라이언트때문에 POST/PUT을 이용한 부분 업데이트도 같이 지원한다. 페이스북 API는 POST를 활용하나, CRUD 작업이 많이 일어나는 RESTful 리소스나 메소드를 구현하는 경우엔 PUT으로 부분 업데이트를 하는 것이 좀 더 일관적이다.
아래와 같이 @PATCH annotation을 생성할 수 있다.
JSON patch
RFC 6902에 JSON patch가 소개되어 있다. JSON 패치 문서는 Content-Type을 "application/json-patch+json"로 지정한다. JSON 패치는 아래와 같은 멤버로 구성된다.
- op: 수행할 작업
- add, replace, move, remove, copy, test
- path: 문서 내부 위치를 가리키는 포인터
- value: 교체할 값
- from: move시 이동시킬 값이 위치한 경로
HTTP patch 요청과 함께 전송된 JSON 패치 문서 예제
자세한 내용은 http://jsonpatchjs.com 참고
댓글
댓글 쓰기