교내 동아리 웹개발 프로젝트를 진행하면서 설계에 부족했던 부분들이 많았다는 것을 깨닫게 됐다. API 설계의 필요성을 느끼고 설계를 하던 중 REST API라는 것을 알게 됐고, 이번 글에서는 공부한 내용으로 REST API에 대해서 다뤄보고자 한다.
API(Application Programming Interface)는 소프트웨어 애플리케이션 간의 상호 작용을 위한 규칙과 도구의 집합을 의미한다. API는 두 소프트웨어 컴포넌트가 서로 통신할 수 있도록 하는 규칙, 계약 등의 역할
좀 더 쉽게 이해해보자면, 클라이언트와 서버가 있을 때 클라이언트가 요청(Request)했을 시 서버가 응답(Response)해주는 과정에서, 두 소프트웨어가 어떻게 요청과 응답을 보내면 되는지 규칙을 정한 것이다.
API의 주요 개념은 4가지로 구분할 수 있다.
추상화 | 특정 기능을 쉽게 사용할 수 있도록 한다. |
---|---|
재사용성 | 여러 애플리케이션에서 재사용할 수 있도록 설계. 코드의 중복을 줄이고 유지보수를 용이하게 한다. |
모듈화 | 소프트웨어를 모듈화하여, 각 모듈이 독립적으로 개발, 테스트, 유지보수 될 수 있도록 한다. |
표준화 | 서로 다른 언어와 플랫폼 간의 통합을 가능하게 한다. |
보안 | 인증, 권한 부여, 암호화 등의 보안 매커니즘을 통해 데이터를 보호한다. |
https://appmaster.io/api/_files/PqV7MuNwv89GrZvBd4LNNK/download/
지금까지 API에 대해서 알아보는 시간을 가졌다. 그럼 이제 은연 중에 그런 생각이 들 것이다. API는 왜 사용할까? 어떤 상황에 사용할까?
토스는 결제 상태, 결제 결과 callback, 가맹점 승인, 결제 환불, 결제 상태 확인 등의 API를 오픈소스로 깃허브에 공개해두었다.
결제가 필요한 애플리케이션의 카카오페이, 네이버페이 및 PG 사는 API를 활용해서 결제 시스템을 구축했다.
클라우드 서비스의 시장 점유율이 가장 높은 AWS는 API로 제공하는 서비스를 액세스할 수 있게 제공하고 있다.
AWS API 호출하기 (1) – 개론편 | Amazon Web Services
REST(Representational State Transfer)는 네트워크 상에서 자원을 정의하고 접근하는 방식을 정하는 아키텍처 스타일이다. HTTP 프로토콜을 기반으로 하여 클라이언트와 서버 간의 상호작용을 정의
한다
Restful API는 이러한 REST 원칙을 따르는 API를 의미한다.
REST란 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고 받는 것이다. 즉, 자원(resource)의 표현(representation)에 의한 상태 전달이다.
자원은 해당 소프트웨어가 관리하는 이미지, 데이터 등을 의미하고 자원의 표현은 예를 들어 DB의 학생 정보가 자원일 때, ‘students’를 자원의 표현으로 정하는 것이다.
REST의 구체적인 개념
HTTP URL을 통해 자원을 명시하고, HTTP 메소드를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다. CRUD란 REST API를 설계할 떄 기본적인 기능을 정의하는 것이다.
CRUD란 Restful API의 기능 설계와 비슷한 개념이다. 사용자의 컴퓨터에서 동작하는 서비스, 기능 등을 만들기 위한 기초가 되는 기능들을 설계할 때 사용한다.
CRUD
CRUD의 관점에서 봤을 때, 예시로 사용자가 로그인하는 상황이라고 가정하자. 그럼 이는 Create에 해당된다. 사용자의 정보를 확인하는 것은 Read, 사용자가 정보를 수정하는 것은 Update, 사용자가 회원탈퇴하는 것은 Delete에 해당된다.
HATEOAS(Hypermedia As the Engine of Application State)
REST API의 HATEOAS는 웹페이지의 하이퍼 링크와 같다. 서버와 클라이언트를 분리하여 Restful 웹 서비스에서 자원의 상태를 하이퍼미디어를 통해 제어하는 것을 의미한다. REST 아키텍처의 중요한 개념 중 하나이다.
개발자는 클라이언트 중단에 대해 걱정하지 않고 API를 업데이트하고 발전시킬 수 있다.
REST의 창시자인 로이 필딩(Roy Fielding)은 REST 아키텍처를 정의하기 위해 6가지 주요 원칙을 제시했다.
클라이언트- 서버 구조 | 클라이언트와 서버는 서로 독립적인 역할을 수행하며, 클라이언트는 사용자 인터페이스와 사용자 경험을 관리하고 서버는 데이터 저장 및 비즈니스 로직을 처리한다. |
---|---|
무상태성(Statelessness) | 모든 요청은 독립적이며, 서버는 클라이언트의 상태를 저장하지 않는다. 각 요청은 필요한 모든 정보를 포함해야 한다. |
캐시 가능(Cacheable) | 응답은 캐시될 수 있어야 하며, 클라이언트는 서버로부터 데이터를 다시 요청하지 않고도 응답을 재사용할 수 있어야 한다. |
통합 인터페이스(Uniform Interface) | 클라이언트와 서버 간의 상호 작용을 일관성 있게 정의하여, 시스템 전체의 인터페이스가 표준화된다. |
계층화 시스템(Layered System) | 클라이언트는 중간 계층(ex: 프록시, 게이트웨이)을 통해 서버에 접근할 수 있으며 이러한 계층은 시스템의 확장성과 보안을 향상시킨다. |
코드 온 디맨드(Code on Demand) | 서버는 클라이언트에게 코드를 전송하여 클라이언트가 이를 실행할 수 있다.(선택적) |
| 장점 | - HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.
JSON, XML 등 다양한 데이터 형식을 지원해 다양한 클라이언트와 쉽게 통신이 가능하다. | |
---|---|
단점 | - 각 요청이 독립적이기 때문에 클라이언트의 상태를 유지해야 하는 애플리케이션에서는 추가적인 구현이 필요하다. |
REST API(Restful API)는 REST 아키텍처 스타일의 설계 원칙을 준수하는 API이다. 애플리케이션을 통합하고 마이크로서비스 아키텍처의 구성 요소를 연결하는 유연하고 가벼운 방법을 제공한다.
GET | 자원 조회 |
---|---|
POST | 새로운 자원 생성 |
PUT | 기존 자원의 업데이트 |
DELETE | 자원의 삭제 |
PATCH | 자원의 부분 업데이트 |
ex) 2xx : 성공, 4xx : 클라이언트 에러, 5xx : 서버 에러
ex) ‘Content-Type’ 헤더는 요청 또는 응답의 데이터 형식을 나타낸다.
좋은 REST API는 설계와 구현에 있어서 클라이언트와 서버 간의 상호작용을 효율적으로 일관되게 만들어준다. 클라이언트와 서버 개발자 간에 소통 문제로 잘못된 상태 코드를 생성한다던가, 잘못된 요청을 하지 않도록 상호 간의 협의를 통해 설계하는 것이 중요하다.
그렇다면 좋은 REST API를 설계하기 위해선 어떻게 해야할까?
예를 들어서 유저 정보를 검색하는 기능을 API로 설계한다고 가정해보자. /peachpeach라고 URL을 정의한다면 누군가가 알아볼 수 있을까? 전혀 알아볼 수 없을 것이다.
따라서 /users와 같은 명사로서 간결하고 명확하게 표현하는 것이 좋다.
(개인의 상세정보 같은 경우에는 /user/userindex의 형태로 사용하는 것이 좋다.)
200 | 요청이 성공적으로 처리 |
---|---|
201 | 새로운 자원이 성공적으로 생성 |
204 | 요청이 성공적으로 처리되었지만 반환할 데이터가 없을 때 |
400 | 잘못된 요청일 때 |
401 | 인증이 필요할 때 |
403 | 접근 권한이 없을 때 |
404 | 자원을 찾을 수 없을 때 |
500 | 서버에서 오류가 발생했을 때 |
상황에 맞는 적절한 상태 코드로 응답하는 것이 좋다.
이는 가독성이 좋고, 쉽게 파싱할 수 있다는 장점이 있다.
등록하기 어렵지 않고, 대부분 첫 일 년엔 무료이며 유료인 경우에도 비싸지 않은 가격으로 보안을 위해서 적용하는 것이 좋다.
ex) /v1/users, /v2/users (버전1, 버전2)
각 엔드포인트, 요청 파라미터, 응답 형식, 에러 코드 등에 대한 명확한 설명을 포함한다.
또한 클라이언트가 필요한 데이터만 요청할 수 있도록 필터링과 정렬 기능을 제공하고, 적절한 캐싱 전략을 사용하여 서버 부하를 죽이고 응답 시간을 단축시켜야 한다.
API와 REST API는 설계에서 필수적인 요소로서 설계의 방향성을 잡기 위해서 중요한 파트라고 생각하게 됐다. 물론 REST API설계가 API 설계의 표준이라곤 볼 수 없다. 허나 대다수의 기업들이 따르고 있다.
결론적으로 가장 중요하다고 느끼게 된 건, 좋은 API 설계란 명시되어 있는 기본적인 규칙들을 따를 뿐만 아니라 클라이언트와 서버 간에 의사소통이 제일 중요하다고 느꼈다. 설계는 한 명만 하는 것이 아니기 때문이다.
API 설계를 굉장히 어렵게 생각했었는데, 여전히 어렵긴 하지만 쉽게 생각하면 ‘설계의 규칙’을 정하는 것이라고 생각하면 될 것 같다.
https://www.youtube.com/watch?v=fB3MB8TXNXM&t=0s
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://www.altexsoft.com/blog/what-is-api-definition-types-specifications-documentation/
https://www.elancer.co.kr/blog/view?seq=199
https://peterica.tistory.com/402
https://www.ibm.com/kr-ko/topics/rest-apis
https://www.freecodecamp.org/korean/news/rest-api-mobeom-sarye-rest-endeupointeu-seolgye-yesi/