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
      1. Client -> Server: GET http://api.com/coffee/1234
      2. Client <- Server: 200 OK with ETag "123456789"
      3. Client -> Server: GET http://api.com/coffee/1234 with If-None-Match "123456789"
      4. Client <- Server
        1. 200 OK with new ETag "abcdefghi" (변경된 리소스)
        2. 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 참고

Reference


댓글

이 블로그의 인기 게시물

Android essentials summary

[Math] GCD & LCM

Useful Linux Command Line Bash Shortcuts You Should Know