정보공간_1

[5기 강북 강현호] RESTful Open API with JAX-RS #1 본문

IT 놀이터/Elite Member Tech & Talk

[5기 강북 강현호] RESTful Open API with JAX-RS #1

알 수 없는 사용자 2014. 6. 8. 23:01

RESTful Open API with JAX-RS #1


 스마트폰과 SNS 의 발달로, Open 과 공유 라는 개념이 많이 익숙해진 요즘입니다. Open 과 공유라는 개념에 있어서 개발자라면 Open API 를 빼놓을 수 없을 겁니다. 많은 개발자, 개발사 들이 Open API 를 제작 하고 있고, 이를 통해서 자사의 서비스를 여러 곳에서 사용하도록 유도 하고 있습니다. 개발자 분들이라면 대부분 하나 이상의 Open API 를 써보신 기억이 있을 겁니다. 저도 Amazon API, Facebook, Twitter, OpenTok 등등 꽤 많은 API 들을 써봤습니다. 쓰다보니 한번 만들어 보고 싶다는 생각이 들더군요. 직업병이겠지요 뭔가 재밌는걸 보면 직접 내 스타일로 한번 만들어 볼까? 이건 이렇게 하면 더 나을거 같은데 라는 생각을 하게 됩니다. 그래서! Open API 에 대해 알아 보게 됬고 그렇게 알게된 지식을, 그러니까 Open API 제작에 필요한 기초 지식을 여러분과 공유해 볼까 합니다.  


어떤일이든 기초는 정말 중요합니다. 건물의 기반 같은 것이라 기초가 흔들리면 절대 크고, 튼튼한 건물을 완성할 수가 없습니다. 그러니까, 기초중의 기초 개념부터 알고 갑시다.  


Open API 

 

1. 정의

Open API 는 Open Application Programmer Interface 의 약자 입니다. API 는 라이브러리 등의 기능을 사용하기 편리하게 추상화 한 인터페이스를 의미 하고, Open API 라 하면 공통으로 사용하고, 관리할 만한 자원을 공동으로, 쉽게 사용할 수 있게 하기 위해 제작된 API 를 의미 합니다. 무료로 제공되는 것이지만, 이 API 를 통해서 자사의 서비스가 널리 사용됨으로써 수익 창출의 기회가 늘어남이 확인 되었기 때문에 많은 기업들이 Open API 를 제작하고 제공하고 있습니다. 


2. 구현

Open API 는 초창기, Client/Server 구조로, RPC(Remote Procedure Call)을 쓰는 방식으로 구현 되었었다고 합니다. 쉽게 이야기해서 무식하게 서로의 함수를 호출하는 방식 이었답니다. 하지만, 보안문제와 OS 의존성 문제가 있었습니다. 그래서, CORBA 가 등장했습니다. CORBA 는 OS 의존성은 해결 했지만, 너무 가격이 비싸고 무겁다는 문제가 있었습니다. 그래서 여러분도 잘 아시는 SOAP(Simple Object Access Protocol) 을 사용하여 서비스를 하기 시작했습니다.  SOAP 는 자유로워서 원하는 방식으로 서비스를 정의할 수 있지만 그만큼 복잡했습니다. 이 복잡성은 서비스를 무겁게 했고, 개발 난이도를 높히는 결과를 가져왔습니다. 그래서 그 대안으로 부각된 것이 RESTful 서비스 입니다. 


<SOAP 아키텍처>


<SOAP Response>


<SOAP Request>



RESTful 서비스


REST 는 Representational State Transfer 의 약자로, Roy Fielding 의 논문에 의해서 세상에 처음 발표된 개념이며, 웹의 특성을 활용한 서비스 호출 Architecture 입니다. 웹 서비스 에서는 모든 상태(State) 가 URL 로 표현되며, 서로 다른 URL 을 활용해서 서로 다른 상태로 이동(Transfer) 하게 되는데, 이러한 웹 서비스의 특성을 활용하여, 어플리케이션을 구동하고 그 결과를 받아 처리하는 방식이 REST 방식입니다. 

REST 의 핵심 개념은 HTTP URI + HTTP Method 라 할 수 있습니다. 특정 서비스의 자원을 명시하는 방식으로 URI 를 활용하고, 명시된 자원으로 무엇을 할지를 HTTP Method 로 정의 하는 것이지요. 


1. Resource 명시

이렇게 설명하면 개념이 잘 이해되지 않을 수 있으니, 예를 들어 보도록 할께요. 먼저 HTTP URI 로 자원을 표현하는 예제를 생각해 봅시다. SSM (www.ssm.org) 이라는 집단의 Member 들 중, KHH 라는 멤버를 HTTP URI 로 표현하게 되면,

http://www.ssm.org/Members/KHH 이렇게 표현 할 수 있을 겁니다.

예를 하나 더 들어 볼까요? KBSSM (www.kbssm.org) 라는 집단의 SeminarRoom 중에 Creation 이라는 이름의 세미나 실을 표현해 봅시다.

http://www.kbssm.org/SeminarRoom/Creation 가 되겠죠.

위의 예제들 같이 HTTP URI 를 활용해서, 자원을 명시할 경우 매우 심플하고 직관적으로 자원을 명시할 수 있습니다. Creation 실의 URI 를 알면 Vision 이라는 세미나 실의 URI 는

http://www.kbssm.org/SeminarRoom/Creation 라는 것을 쉽게 생각해 낼 수 있습니다.


2. Resource 활용

그러면 이 자원들을 어떻게 활용할 지는 어떻게 명시해야 할까요?

앞서 말씀드렸듯 자원 활용에는 HTTP Method 를 씁니다. 쉽게 이야기 해서 자원에 관한 CRUD (Create, Read, Update, Delete) 를 수행 할 때는 HTTP Method 를 활용한다는 겁니다.

각 메소드 별로 예를 들면서 확인해 볼까요?

먼저 SSM 단체의 회원들의 목록을 확인 하고 싶습니다 어떻게 하면 될까요?


URI : http://www.ssm.org/Members  

Method : GET


마찬가지로 회원 생성을 하려면


URI : http://www.ssm.org/Members  

Method : POST


회원 정보를 삭제 하려면


URI : http://www.ssm.org/Members  

Method : DELETE


회원 정보를 수정 하려면


URI : http://www.ssm.org/Members  

Method : PUT 

이 될겁니다.


3. 유의할 점

RESTful 아키텍처는 위에서 설명한 것 같이 개발자가 매우 직관적인 서비스를 제작할 수 있게  합니다. 직관적이기 때문에 잘 설계만 된다면, 유지보수도 매우 편리해 집니다. 하지만 잘 설계될 경우 라는 전제가 붙습니다. RESTful 아키텍처를 어떤식으로 구현해야 한다는 가이드는 존재하지만, URI 를 어떤식으로 설계할지는 전적으로 개발자에 달려있기 때문입니다. 누구라도 이해하기 쉽고, 제공할 서비스를 전부 포괄할 수 있는 URI 를 기획하지 못하면 RESTful 아키텍처는 본래의 직관적인 기능성을 전부 잃어 버리고 복잡하고 난해한 서비스가 되어 버리고 맙니다. 때문에 RESTful 서비스를 제작할 때는 URI 구성에 많은 노력을 쏟을 필요가 있습니다. 



JAX-RS 


JAX-RS(Java API for RESTful Web Services) 는 RESTful 아키텍처를 따르는 서비스를 개발 하기 편리 하도록 만들어진 정의된 인터페이스의 모음입니다. 위에서 언급했 듯 좋은 RESTful 서비스의 제작을 위해서는 좋은 설계가 필요합니다. JAX-RS 는 좋은 설계에 개발자가 집중할 수 있도록 REST 서비스 구현에 필요한 Java API 들의 모음입니다. 

JAX-RS 의 주요 기능들은 다음과 같습니다. 

1. 자원 클레스 및 데이터 유형에 대한 어노테이션 콜렉션

2. 런타임 컨텍스트 액세스를 위한 인터페이스 세트

3. 사용자 정의 컨텐츠 핸들러 통합을 위한 확장 가능 프레임 워크


다음 포스트에서는 JAX-RS 정의를 따른 프레임 워크인 Jersey 프레임 워크를 활용한 RESTful 서비스를 직접 구현해 보면서, JAX-RS 의 개념과, RESTful 서비스를 이해해 보도록 하겠습니다. 



<JAX-RS 를 활용한 웹 서비스 아키텍처의 예시>