핵심 인사이트

  1. 본질: 리처드슨 성숙도 모델 (Richardson Maturity Model)의 Level 1은 REST (Representational State Transfer) 설계에서 애플리케이션 프로그래밍 인터페이스 (API, Application Programming Interface)가 다루는 대상을 행위가 아니라 리소스 (Resource) 중심으로 식별하기 시작한 단계다.
  2. 가치: orders, customers, payments처럼 자원별 URI (Uniform Resource Identifier)를 분리하면 시스템 구조가 드러나고, 이후 HTTP (HyperText Transfer Protocol) 메서드와 상태 코드 정비로 확장할 기반이 생긴다.
  3. 판단 포인트: Level 1은 REST의 출발점이지만 아직 완성형은 아니며, URI만 명사형으로 바꾸고 모든 작업을 POST로 처리하면 설계 품질은 절반만 개선된다.

Ⅰ. 개요 및 필요성

Level 1은 단일 엔드포인트에 모든 작업을 몰아넣는 Level 0에서 한 단계 올라가, 자원마다 고유한 URI를 부여하는 단계다. 여기서 중요한 변화는 API의 중심 질문이 "무슨 함수를 호출할까"에서 "어떤 자원을 다룰까"로 바뀐다는 점이다. 즉 주문, 사용자, 상품 같은 비즈니스 대상을 외부 인터페이스에 드러내기 시작한다.

이 변화가 필요한 이유는 단일 URI 구조가 시스템 의미를 숨기기 때문이다. POST /api와 요청 바디 안의 action만으로는, 외부 소비자가 어떤 자원을 조작하는지 직관적으로 이해하기 어렵다. 반면 POST /orders, POST /customers, POST /shipments처럼 나누면 API의 도메인 경계가 훨씬 선명해진다.

Level 1은 그래서 단순한 URL 정리 작업이 아니다. API를 비즈니스 자산 단위로 재구성하는 첫 단계이며, 이후 메서드 의미 분리와 상태 코드 설계를 가능하게 만드는 기초 공사다.

  • 📢 섹션 요약 비유: Level 1은 모든 민원을 건물 입구 한 곳에서 받던 방식을, 여권 창구·세무 창구·복지 창구처럼 업무 대상별 창구로 나누는 일과 같다.

Ⅱ. 아키텍처 및 핵심 원리

Level 1의 핵심 원리는 "리소스를 URI로 식별한다"는 것이다. 보통 컬렉션과 개별 항목을 구분해 /orders/orders/1001처럼 설계한다. 아직 Level 2처럼 메서드 의미를 충분히 살리지 못할 수는 있지만, 적어도 API 외형만 봐도 어떤 자원을 다루는지는 드러난다.

아래 그림은 Level 0에서 Level 1로 넘어갈 때 무엇이 달라지는지 보여준다.

┌────────────────────────────────────────────────────────────────────┐
│            Level 0 → Level 1 전환 시 의미 변화                    │
├────────────────────────────────────────────────────────────────────┤
│ [Level 0]                                                         │
│ POST /api                                                         │
│ { action: "createOrder", customerId: 7 }                         │
│ POST /api                                                         │
│ { action: "cancelOrder", orderId: 1001 }                         │
│                                                                    │
│ [Level 1]                                                         │
│ POST /orders                -> 주문 컬렉션에 생성 요청             │
│ POST /orders/1001/cancel    -> 아직 메서드는 미성숙할 수 있음      │
│ GET  /orders/1001?          -> 이상적이지만 Level 2에서 본격 정착  │
│                                                                    │
│ 핵심 변화: "행위 이름"보다 "대상 자원"이 URI에 드러남           │
└────────────────────────────────────────────────────────────────────┘

이 단계에서 설계자는 보통 컬렉션 URI, 개별 리소스 URI, 하위 리소스 URI를 정의한다. 예를 들어 고객과 주문 관계를 /customers/7/orders처럼 표현할 수 있다. 이 구조는 API 문서화, 라우팅, 권한 모델링, 로그 분석에 직접 도움이 된다. 왜냐하면 요청 경로만 보아도 시스템이 어떤 도메인 객체를 만졌는지 알 수 있기 때문이다.

URI 유형예시의미
컬렉션/orders주문 자원들의 집합
단일 리소스/orders/1001특정 주문 1건
하위 리소스/customers/7/orders고객 7에 속한 주문 목록
상태 전이 URI/orders/1001/cancelLevel 1에서 자주 보이는 절충형 표현

다만 Level 1은 URI 설계만 성숙해졌을 뿐, HTTP 메서드·상태 코드·하이퍼미디어 활용은 아직 부족할 수 있다. 그래서 이 단계는 완성이라기보다, API 의미를 바디 밖으로 끌어내기 시작한 상태라고 보는 것이 맞다.

  • 📢 섹션 요약 비유: Level 1은 상자 겉면에 내용물을 적어 두는 단계와 같다. 아직 여는 방법까지 표준화된 것은 아니지만, 최소한 안에 무엇이 있는지는 밖에서 알 수 있다.

Ⅲ. 비교 및 연결

Level 1의 위치를 이해하려면 Level 0과 Level 2 사이에 놓고 봐야 한다. Level 0은 단일 URI와 액션 중심 메시지로 이루어진 RPC (Remote Procedure Call) 스타일이다. Level 1은 자원을 URI로 분리하지만, 메서드 사용은 아직 거칠 수 있다. Level 2는 여기에 GET, POST, PUT, PATCH, DELETE와 상태 코드를 일관되게 도입한다.

항목Level 0Level 1Level 2
URI 구조단일 엔드포인트자원별 분리자원별 분리
중심 사고작업 호출자원 식별자원 식별 + 표준 행위
메서드 활용POST 중심제한적 또는 혼합명확히 분리
상태 코드 활용약함약함 또는 부분적강함
설계 가독성낮음중간높음

실무적으로 Level 1이 중요한 이유는, RESTful 설계의 모든 이점이 여기서 바로 완성되지는 않더라도 자원 경계를 명확히 드러내기 때문이다. 도메인 주도 설계 (DDD, Domain-Driven Design) 관점에서도 orders, invoices, members처럼 경계가 드러나는 URI는 서비스 책임을 정리하는 데 도움이 된다. 반면 doCancelOrder, processInvoice 같은 동사 중심 URI는 내부 서비스 함수를 외부에 그대로 노출하는 경향이 강하다.

즉 Level 1은 REST의 완성형이 아니라, RPC 사고방식에서 자원 중심 사고방식으로 넘어가는 다리다. 이 다리를 건너야 이후 Level 2, Level 3 논의도 의미를 가진다.

  • 📢 섹션 요약 비유: Level 0이 모든 요청을 한 사람에게 구두로 전달하는 방식이라면, Level 1은 업무별 서류함이 생긴 상태이고, Level 2는 각 서류함마다 접수 규칙까지 붙은 상태다.

Ⅳ. 실무 적용 및 기술사 판단

실무에서는 레거시 RPC API를 바로 Level 2나 Level 3로 끌어올리기 어려운 경우가 많다. 이때 가장 현실적인 첫 단계가 Level 1이다. 우선 자원 경계를 분리해 URI 체계를 정리하면, 라우팅 규칙과 문서 구조, 권한 정책, 로그 분석 축이 단번에 선명해진다. 이후 메서드와 상태 코드는 점진적으로 정리할 수 있다.

하지만 Level 1에서 멈추면 반쪽짜리 개선에 머물 수 있다. URI는 자원형인데 모든 작업을 POST로만 받고, 실패도 전부 200 OK로 돌려주면 웹 인프라가 주는 이점을 충분히 누리지 못한다. 따라서 실무 판단은 "URI 분리만으로 끝낼 것인가"가 아니라, "Level 1을 발판으로 Level 2까지 갈 계획이 있는가"를 함께 봐야 한다.

판단 체크리스트

  1. API 경로가 명사형 자원 중심으로 설계되었는가?
  2. 컬렉션과 개별 리소스 URI가 구분되는가?
  3. 동사형 URI가 도메인 구조를 흐리지 않는가?
  4. 다음 단계로 HTTP 메서드와 상태 코드 정비 계획이 있는가?

안티패턴

  • URI만 /orders로 바꾸고 실제 의미는 여전히 action 필드에 숨겨 두는 것

  • /getOrders, /createOrder, /deleteOrder 같은 동사형 경로를 리소스 설계라고 착각하는 것

  • Level 1 상태를 REST 완성형처럼 홍보하는 것

  • 📢 섹션 요약 비유: Level 1 도입은 사무실 서류함 이름을 붙이는 것과 같다. 이름표만 붙이고 여전히 모든 일을 같은 방식으로 처리하면 정리는 되었지만 운영 혁신은 아직 덜 끝난 셈이다.


Ⅴ. 기대효과 및 결론

Level 1의 기대효과는 인터페이스 의미가 밖으로 드러난다는 점이다. API를 처음 보는 사람도 URI만 보고 어떤 자원이 있는지 짐작할 수 있고, 서비스 경계와 문서 구조도 더 안정된다. 이는 장기적으로 API 거버넌스, 버전 관리, 권한 정책 정비에 좋은 기반이 된다.

반면 한계도 명확하다. URI가 자원 중심이어도 메서드와 상태 코드가 미성숙하면 캐시, 멱등성, 표준 오류 처리 같은 웹 아키텍처 이점을 충분히 살리기 어렵다. 그래서 Level 1은 목표라기보다 REST 설계가 시작되었다는 신호로 이해해야 한다.

결론적으로 이 개념의 핵심은 "자원에게 이름을 붙여 외부에 드러낸다"는 데 있다. REST의 첫 성숙은 결국 함수 호출을 예쁘게 포장하는 것이 아니라, 시스템의 대상을 리소스 단위로 재구성하는 데서 출발한다.

  • 📢 섹션 요약 비유: Level 1은 도시 지도에 건물 이름을 적기 시작한 단계와 같다. 아직 교통법규까지 완성된 것은 아니지만, 어디가 무엇인지는 비로소 보이기 시작한다.

📌 관련 개념 맵

개념연결 포인트
리처드슨 성숙도 모델Level 1이 속한 REST 성숙도 프레임워크
URI리소스를 외부에 식별시키는 핵심 수단
컬렉션/리소스/orders/orders/1001 같은 구조의 기본 단위
HTTP 메서드Level 2에서 본격적으로 의미가 강화되는 요소
RPC 스타일 APILevel 1이 벗어나려는 출발점

📈 관련 키워드 및 발전 흐름도

Level 0
  (단일 URI + action 중심)
    │
    ▼
Level 1
  (리소스별 고유 URI)
    │
    ├─ 컬렉션/개별 리소스 구분
    ├─ 도메인 경계 노출
    └─ 문서화 · 라우팅 명확화
    ▼
Level 2
  (HTTP 메서드 · 상태 코드 정착)

이 흐름도는 API 설계가 함수 호출 중심에서 자원 중심 구조로 이동한 뒤, 다시 표준 웹 의미를 채워 넣는 순서를 보여준다.

👶 어린이를 위한 3줄 비유 설명

  1. Level 1은 모든 물건을 한 상자에 넣지 않고, 장난감 상자·책 상자처럼 이름표를 붙여 나누는 거예요.
  2. 그래서 어디에 무엇이 있는지 훨씬 쉽게 알 수 있어요.
  3. 하지만 상자를 여는 규칙까지 똑같이 정리하려면 다음 단계가 더 필요해요.