기본 콘텐츠로 건너뛰기

REST Web Service에서 Projection 기능 활용

REST Web Service에서 Projection을 이용한 웹 인터페이스 유연성 확보하기.

Projection 기능이란?

  프로젝터와 같이 실제하는 물체를 보고 싶은 형태로 볼 수 있게 도와주는 기능을 말한다. 좀 더 쉽게 말하면 실제하는 물체란 필름을 말하는 것이고, 보고 싶은 형태란 70인치 화면으로 보여주는 것을 말한다. 설정에 따라 30인치 화면으로 볼 수도 있다.
  즉, Projection 기능이 있다면 상황에 맞는 화면 크기로 보여 줄 수 있는 것이다.
[프로젝터]

웹 인터페이스 설계의 어려움

  웹서버를 개발하는 개발자 입장에서 하나의 인터페이스라도 만드는 일은 쉽지 않다. 그렇기 때문에 웹 인터페이스의 개수를 줄이려고 노력하는 것이 일반적이다. 그러기 위해서는 좀 더 일반적인(General) 형태의 인터페이스로 설계하는 수밖에 없다. 그러나 아이러니하게도 사용자(인터페이스를 사용하는 다른 개발자) 입장에서는 이런 일반적인 인터페이스를 쓰기란 여간 어려운게 아니다.

클라이언트마다 필요한 데이터가 다르다.

 REST 웹서비스에서는 리소스에 해당하는 데이터를 다음과 같이 JSON 형식의 Response로 전달해준다. 예를 들어 다음과 같이 상품 정보를 보내주는 RESR API가 있다고 해보자.

GET /api/furniture/item/123334333

위의 REST API를 이용하여 다음과 같은 데이터를 받을 수 있다.

{
      "item_id" : 1233343333,
      "name" : "chair",
      "category" : "furniture",
      "price" : 56000,
      "seller" : "Makers",
      "description" : "Good Chair"
}

 그러나 문제가 있다. 모든 클라이언트가 위의 모든 데이터를 필요로 할거라고 생각했지만, 실제로는 어떤 클라이언트는 "item_id"와 "name", "price"만 필요로 할 뿐이라고 한다. 나머지는 불필요한 데이터이다. 궂이 웹서비스로 가져올 필요도 없는 부분이다. 이런 클라이언트가 많은 경우 새로운 인터페이스를 만들어줘야 할까?

Projection 기능을 활용하자.

  웹서비스에서 쓰이는 프로젝션 기능을 활용해보자. Projection 기능이란, 앞서 말한 프로젝터의 기능과 같다. 실제하는 데이터가 있고, 그 데이터를 사용자가 보고 싶은 크기로 줄였다가 늘렸다가 하는 것을 도와주는 것이다.  데이터의 필드(JSON Tag)를 선택적으로 보여줄 수 있게 해준다.

  클라이언트에서 원하는 데이터가 다음과 같이 3가지라고 해보자.

  • 아이템 ID
  • 이름
  • 가격
   웹서비스 결과로 다음과 같은 결과가 오는 것이 최선일 것이다.


{
      "item_id" : 1233343333,
      "name" : "chair",
      "price" : 56000
}

 다음 장에서 Spring Data의 Projection 기능을 이용하여 이를 쉽게 해결하는 방법은 볼 것이다.

Goto "Spring Data Projection"

댓글

이 블로그의 인기 게시물

AWS ELB 504 Error

AWS EC2  운영 중 가끔씩 볼 수 있는 에러가 있습니다. 대표적으로 다음의 세가지 502, 503, 504 입니다. 이 중에서 이번에 알아볼 문제는 HTTP 504 에러입니다 .  타임 아웃이 되어   Request 를 처리하지 못하는 상황이 됩니다 .   해결 방법부터 이야기 하자면 다음과 같이 웹서버의 Time-out 시간을 60 초 이상으로 늘리는 것입니다 . Web Server & Application Time-out >= 60 sec 그 이유는 다음과 같은 ELB의 특성 때문입니다. ELB는 클라이언트와 EC2 서버 양쪽으로 커넥션을 유지하고 있습니다. ELB는 클라이언트와  EC2 서버간의 커넥션을 관리하는 역할을 맡고 있습니다. 그래서 유효한 커넥션만을 남겨놓습니다. 이를 위해서 Time-out 시간을 가지고 이 시간동안 데이터가 송수신되지 않으면 연결을 끊습니다.  기본적으로 Elastic Load Balancing는 두 연결 모두에 대해 Time-out(유휴 시간) 시간을 60초로 되어 있습니다. 그렇기 때문에 HTTP 또는 HTTPS를 사용할 경우 "KeppAlive" 옵션을 사용하여 커넥션을 재활용해야 합니다. 이 때  ELB 커넥션도 재사용되기 때문에 CPU 사용률을 줄일 수 있습니다. Browser Time-out Opera 11.11 120 sec IE 9 60 sec Chrome 13 300 sec FireFox 4 115 sec 서버 로직 중에서 60초 이상 실행될 수 있는 부분이 있는 경우 504 에러를 자주 볼 수 있을 것입니다. 문제 해결을 위해서는 Web Server는 물론  Tomcat 설정 또한 60초 이상으로 변경해주어야 합니다. ...

Spring Data Projection 기능 활용

Projection Spring Data REST에서는 Projection 기능을 제공하고 있습니다. Spring Data란?   Data Access Layer에 대한 추상화 기능을 제공하는 프레임워크입니다. 간단히 설명하자면 기존에는 Database에 데이터를 저장하고 읽어오기 위해서는 Database의 종류, 스키마를 고려하여 SQL Query를 사용해서 데이터를 저장하고 읽어왔습니다. 그러나 Spring Data를 이용하게 되면 이 과정을 ORM을 사용하여 함수를 사용하여 쉽게 처리할 수 있습니다. ORM(Object Relational Mapping)란?   데이터베이스가 테이블, 필드간 상관 관계를 통해 도메인 데이터를 표현하였다고 한다면,  ORM은 Object, 클래스 간의 상관 관계를 통해 도메인 데이터를 표현하는 것을 말합니다. 다음의 링크는 Spring Data REST Documentation 중에서 Projection 부분입니다.               8. Projections and Excerpts 그러나 실제 "Projection" 기능을 사용하는데는 한가지 문제점이 있습니다. 레거시 웹서비스를 쓰고 있다거나, Spring Data  REST를 이용하지 않는다면 "Projection" 기능을 활용하는 것이 힘들다는 것입니다. Spring Data REST의 경우 데이터  Response Type이 json-hal 타입만을 지원하기 때문입니다. JSON-HAL 타입으로 경우 웹서비스 제공 입장에서 최선의 선택일 수 있습니다. 그러나 실제 프로젝트에서는 이를 쓰려는 클라이언트가 없을 경우 사용할 수 없게 될 것입니다. 그렇다면 Projection 기능만을 사용할 수 있는 방법이 없을까요? 있습니다. ProjectionFactory 를 직접 사용하는 것입니다. 다음과 같이 Spr...

Java Case Sensitive 함수 사용시 주의 사항

자바는 유니코드를 지원하는 프로그램 언어이다. 그렇기 때문에 왠만한 다국어 지원 문제는 별 탈없이 해결된다. 그러나 자바 프로그래머라면 한가지 주의해야 할 점이 있다. 자바의 문자열을 다루는 몇몇 함수들은 “Locale Sensitive”함수라는 것이다. 먼저 유니코드가 무엇인지에 대해서 짚고 넘어가자. 유니코드 > 정  의   유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다. > 목  적  유니코드의 목적은 현존하는 수많은 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다. 기존의 인코딩들은 그 규모나 범위 면에서 한정되어 있고, 다국어 환경에서는 서로 호환되지 않는 문제점이 있었다. 유니코드가 다양한 문자 집합들을 통합하는 데 성공하면서 유니코드는 컴퓨터 소프트웨어의 국제화와 지역화에 널리 사용되게 되었으며, 비교적 최근의 기술인 XML, 자바, 그리고 최신 운영 체제 등에서도 지원하고 있다. 원본 위치 [Wikipedia](https://ko.wikipedia.org/wiki/유니코드)  UTF-8  UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만들었다 UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. 원본 위치 [Wikipedia](htt...