좋은 API란 무엇인가? REST API 설계 원칙과 성숙도 모델 완벽 가이드

 

1. 서론: 왜 모두가 'REST'를 외칠까?

현대 소프트웨어 아키텍처는 수많은 서비스가 서로 데이터를 주고받으며 작동합니다. 이때 서로 다른 환경(언어, 프레임워크)에서도 막힘없이 대화하기 위한 약속이 필요한데, 그중 가장 널리 쓰이는 표준이 바로 **REST(Representational State Transfer)**입니다. 하지만 단순히 HTTP를 쓴다고 해서 모두 RESTful한 것은 아닙니다. 오늘은 진정한 의미의 REST API가 무엇인지, 그리고 어떻게 설계해야 하는지 깊이 있게 알아보겠습니다.

2. REST API의 6가지 기본 원칙

REST 아키텍처를 유지하기 위해서는 다음의 제약 조건을 준수해야 합니다.

  1. Client-Server 구조: 서버와 클라이언트의 역할을 명확히 분리하여 독립적인 진화를 가능하게 합니다.

  2. Stateless (무상태성): 서버는 클라이언트의 상태를 기억하지 않습니다. 각 요청은 처리에 필요한 모든 정보를 포함해야 합니다.

  3. Cacheable (캐시 가능): HTTP의 기존 웹 표준을 그대로 활용하여 응답을 캐싱할 수 있어야 합니다.

  4. Uniform Interface (일관된 인터페이스): 리소스(URL)와 행위(HTTP Method)가 표준화되어야 합니다.

  5. Layered System (계층화 시스템): 클라이언트는 서버가 직접 연결되었는지, 중간 매개체(로드밸런서 등)를 거쳤는지 알 수 없어야 합니다.

  6. Code on Demand (선택 사항): 서버가 클라이언트에 실행 가능한 코드를 전달할 수 있습니다.

3. 핵심 설계 가이드: 리소스와 행위의 분리

가장 많은 개발자가 실수하는 부분이 URL 설계입니다.

  • Bad: GET /get_user_info/123, POST /delete_post (행위를 URL에 포함)

  • Good: GET /users/123, DELETE /posts/45 (명사 위주의 리소스와 HTTP 메서드 조합)

HTTP Method역할 (CRUD)의미
GETRead리소스 조회
POSTCreate새 리소스 생성
PUTUpdate리소스 전체 수정
PATCHUpdate리소스 일부 수정
DELETEDelete리소스 삭제

4. 리처드슨 성숙도 모델 (Richardson Maturity Model)

단순한 HTTP 통신에서 진정한 REST로 나아가는 단계를 4단계로 구분합니다.

  • Level 0: 단일 엔드포인트에서 모든 요청 처리 (예: SOAP)

  • Level 1: 개별 리소스에 대한 URL 도입

  • Level 2: HTTP 메서드(GET, POST 등)의 적절한 활용

  • Level 3: HATEOAS 도입 (응답에 다음 단계로 갈 수 있는 링크 포함)

5. 실무 경험 사례: "모두가 고통받았던 나의 첫 번째 API 설계"

[나의 개발 경험: 무분별한 POST 사용이 부른 API 지옥]

신입 시절, 저는 모든 API를 POST 메서드로 통일해서 만든 적이 있었습니다. "보안상 안전하고 데이터 전송 용량 제한도 없으니 가장 좋은 게 아닐까?"라는 안일한 생각 때문이었죠.

하지만 프로젝트가 커지자 재앙이 시작되었습니다. 모든 요청이 POST이다 보니 브라우저나 프록시 서버의 캐싱 기능을 전혀 활용할 수 없었습니다. 또한, 동료 프론트엔드 개발자들은 API 문서(Swagger)를 봐도 이 API가 데이터를 가져오는 건지, 삭제하는 건지 직관적으로 알 수 없어 매번 저에게 물어봐야 했습니다.

결국 저는 모든 엔드포인트를 리소스 중심으로 재설계하고 적절한 HTTP 메서드를 적용하는 '대수술'을 진행했습니다. 이 과정을 통해 **'표준을 지키는 것이 가장 효율적인 소통 방법'**이라는 점을 절실히 깨달았습니다.

6. 결론: RESTful은 정답이 아닌 '철학'입니다

REST API를 완벽하게 구현하는 것은 생각보다 까다롭습니다. 특히 레벨 3의 HATEOAS까지 지키는 곳은 실무에서도 드뭅니다. 중요한 것은 내 API를 사용하는 사람(혹은 기계)이 얼마나 직관적이고 편하게 소통할 수 있느냐입니다. 오늘 정리한 원칙들을 바탕으로 더 건강하고 아름다운 API를 설계해 보시길 바랍니다.

댓글

이 블로그의 인기 게시물

빵집 줄서기와 시간 복잡도의 관계

변수와 상수의 차이, 그리고 실무에서의 활용 방법

파이썬 객체지향 프로그래밍(OOP) 완전정복 | 클래스, 상속, 캡슐화까지 한 번에 이해하기