RESTful API라는 말은 정말 많이도 들어봤을 지 모른다.
누군가는 GraphQL로 RESTful 을 대체 하기도 하겠지만, 웹 기반 시스템에서 RESTful을 아예 배제하고 개발을 진행하기는 쉽지 않다.
이번 포스팅에서는 RESTful API의 특징과 장단점에 대해 알아보도록 하자.
API는 Application Programming Interface의 약자다. 사실 이걸 굳이 해석을 해야할까 싶다. 해석 해도 똑같이 애플리케이션 프로그래밍 인터페이스다. 대체 할 한국어가 따로 없는 것 같다.
API는 애플리케이션 간 통신 규약이라고도 할 수 있다. 사실 애플리케이션 내에 로직들 간에 뭔가 통신 규약이라 할 법한 걸 가지고 있진 않다. 하지만 분리되어있는 프로그램 간에 데이터를 전달해야 한다면 얘기는 달라진다. 당장 MVC 구조에서 View에 데이터를 전달해야 할 때 View에서 Controller 에 Request가 전달된다. 그런 Request를 확인 한 후 Model로 명령이 전달되든 어떻게 되든 Response가 View에 전달 될 것이다.
이런 것 또한 API라고 볼 수는 있다. 엄연히 Model, View, Controller는 분리 되어있는 소프트웨어니까. 하지만 더 큰 의미로 생각 해 보면 API는 완전히 분리 된 애플리케이션 간에 통신에 사용된다. 비유를 하자면 리모콘과 TV의 관계를 생각 해볼 수 있다.
리모콘 내의 소프트웨어와 TV의 소프트웨어는 완전히 분리되어있다. 또한 완전히 다른 소프트웨어라 볼 수 있다. 하지만 리모콘에서 특정 버튼을 누름과 동시에 TV는 그 명령을 수행한다. 실제 API가 작동하는 방식과 동일하다.
API는 이렇게 다른 종류의 소프트웨어와 통신하고 서비스를 제공하는 역할을 한다. JAVA API든 Windows API든 여러가지 API가 존재한다. 실제로 우리는 JAVA API를 활용하여 다양한 클래스들을 직접 구현하는 게 아니라 불러다 쓸 수 있다.
System.out.println("Hello World!");
우린 이미 프로그래밍을 배우는 초창기부터 사실은 API를 쓰고 있었던 것이라 생각하면 편하다.
API의 종류는 정말 많다. 굳이 모두 서술하자면 그것만으로 장편 시리즈가 나올 것이다. 백엔드 개발자로써 가장 많이 다루게 될 API는 웹 API라고 할 수 있다.
웹 API는 웹 애플리케이션에서 다른 서비스에 요청을 보내고 응답을 받기 위해 정의 된 명세를 일컫는다. 위키백과에서도 알 수 있듯이 우리는 특정 웹 서비스를 사용하기 위해 반드시 그 웹서비스에 접속해서 직접 서비스를 이용 할 필요가 없다. 네이버 블로그 글은 네이버 API를 통해 자동으로 올리도록 프로그래밍 할 수도 있고, 지도 API를 통해 특정 작업이 이루어졌을 때 해당 위치를 알 수 있도록 프로그래밍 할 수도 있다.
Representational State Transfer의 약자다.
즉 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든것을 의미한다.
HTTP의 메소드를 최대한 활용하여 사용할 수 있는 API다. 하지만 HTTP 메소드 그 자체를 사용하는 것이 전부는 아니다. RESTful 하다는 개념을 만족시켜야지만 비로소 RESTful API라고 할 수 있다.
RESTful API는 자원을 명시하고 HTTP 메소드를 통해 해당 자원에 대한 상태를 주고받는다.
정리하자면 아래와 같다.
1. HTTP URL을 통해 자원을 명시한다.
2. HTTP 메소드(GET, POST, PUT, DELETE) 를 통해 해당 자원에 대한 CRUD(Create, Read, Update, Delete) Operation을 정의한다.
CRUD에 대해 언급한 적이 있는 것 같지만 한번 더 정리하자면 CRUD Operation에는 각각 다음과 같은 HTTP 메소드를 사용한다.
물론 반드시 각각의 CRUD Operation에 해당 HTTP 메소드를 사용하지는 않는다. 상황에 따라 다르다. POST에 모든 정보를 집어넣어서 보내는 경우도 분명 존재하기는 하지만...우선은 일반적으로는 이렇게 쓴다는 것 정도는 알아두자.
총 다섯가지 대표적인 특징들이 있다.
당연한 얘기지만 서버 클라이언트 구조를 통해 API가 전달된다.
클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 따로 보존하고 있지 않다는 의미다.
반대로 Stateful은 서버가 클라이언트의 상태를 보존한다는 의미.
캐시가 사용 가능해야 한다는 것이다.
캐싱은 속도가 상대적으로 느린 시스템, 부하에 민감한 시스템의 앞에 가벼운 시스템을 주고 버퍼링과 같은 전략들을 이용하여 백엔드 시스템의 부하를 줄이고 속도를 높이는 방법이다.
RESTful API에서는 반드시 이런 캐시 기능을 지원해야 한다.
GET 같은 경우엔 브라우저 상에서 캐시 기능을 지원한다. 나머지 메소드들은 캐시를 적용할 수 없지만 POST의 경우는 Expires와 Cache Control Header를 이용하여 캐싱을 구현할 수 있다.
RESTful API를 구성하는 요소간에 계층이 존재해야 한다는 의미다.
API서버는 비즈니스 로직, 클라이언트는 클라이언트 역할, 미들 서버는 로드 밸런싱, 공유 캐시 등을 제공하는 등 각자 계층 별 역할에 충실하고 각자의 역할은 다른 계층에서 알 수 없다는 특징이 존재한다.
Resource에 대한 요청을 통일되고 한정적으로 수행하는 아키텍쳐 스타일을 지원해야 한다는 의미다. 클라이언트가 플랫폼에 무관하며 특정 언어나 기술에 종속받지 않는 특징을 의미한다.
쉽게 생각해보면 HTTP 를 사용하는 모든 플랫폼은 Resource에 대한 요청을 보낼 수 있고 그러한 요청에 대한 응답을 모든 플랫폼에 제공할 수 있다는 의미다.
이러한 특징은 결합도를 낮춰주는 장점이 존재한다.
서버 클라이언트가 각자 독립적으로 업데이트가 가능해진다. 만약 특정 API가 수정이 된다고 한들 클라이언트에서는 수정 할 것이 따로 없다.
지금까지 RESTful API의 개념, 특징과 장단점에 대해 알아보았다.
다음 포스팅은 RESTful API를 디자인하는 방법에 대해 포스팅 해 보도록 하겠다.
https://meetup.toast.com/posts/92
https://aws.amazon.com/ko/what-is/restful-api/
https://www.redhat.com/ko/topics/api/what-is-a-rest-api