📌 이 글의 핵심 포인트
"그래서 API가 뭔데?" 개발자의 첫 번째 관문


개발자로 첫발을 내딛거나, IT 프로젝트 회의에 처음 들어갔을 때를 기억하시나요? 아마 수많은 기술 용어 속에서 길을 잃는 경험을 한 번쯤 해보셨을 겁니다. "이 기능은 OO API를 연동해서 처리하고...", "API 명세서는 공유했으니 확인해주세요." 사방에서 들려오는 'API'라는 단어에 고개를 갸웃거리게 됩니다.
API는 대체 무엇일까요? Application Programming Interface의 약자인 이 단어는, 단어 그대로 '애플리케이션(프로그램)을 만들기 위한 인터페이스(접점)'를 의미합니다. 아직 와닿지 않으신다고요? 가장 쉬운 비유는 바로 '레스토랑의 메뉴판'입니다.
우리가 레스토랑에 가서 스테이크를 주문할 때, 주방에 직접 들어가서 고기를 굽고 소스를 만들지 않습니다. 우리는 그저 메뉴판(API)을 보고 웨이터에게 "립아이 스테이크 하나 주세요"라고 주문(요청)합니다. 그러면 주방(서버)에서는 정해진 레시피대로 요리를 만들어 우리에게 완성된 스테이크(결과)를 가져다줍니다.
여기서 중요한 점은, 우리는 주방에서 어떤 일이 일어나는지 전혀 알 필요가 없다는 것입니다. 셰프가 누구인지, 어떤 오븐을 쓰는지, 레시피가 무엇인지는 중요하지 않습니다. 오직 메뉴판에 약속된 대로 주문하면, 약속된 결과가 나온다는 사실만 알면 됩니다. 이것이 바로 API의 핵심입니다. 즉, API는 복잡한 내부 구현을 감추고, 외부에서 사용할 수 있는 기능과 그 사용법만을 정의해 놓은 '약속' 또는 '규칙'의 집합입니다.
이러한 '약속'이 없다면 어떻게 될까요? 카카오맵을 내 서비스에 넣고 싶을 때마다 카카오의 지도 서버 코드 전체를 분석하고 직접 연결하는 코드를 짜야 할 겁니다. 결제 기능을 붙일 때마다 PG사의 복잡한 정산 시스템을 처음부터 끝까지 파헤쳐야겠죠. 개발은 더뎌지고, 세상의 모든 서비스를 내가 직접 만들어야 하는 끔찍한 상황에 부딪히게 됩니다. API는 이런 비효율을 막고, 개발자들이 이미 만들어진 훌륭한 기능들을 쉽게 가져다 쓸 수 있게 해주는 현대 소프트웨어 개발의 근간입니다.
RESTful API, 이름부터 어려운 너의 정체는?
API의 기본 개념을 이해했다면, 다음 단계는 바로 'RESTful API'입니다. "REST API는 알겠는데, RESTful은 또 뭐야?" 라고 생각하실 수 있습니다. 'REST'라는 단어 자체도 생소한데 말이죠. 많은 개발자들이 이 지점에서 혼란을 겪지만, 핵심을 알고 나면 생각보다 간단합니다.
먼저, REST는 'REpresentational State Transfer'의 약자로, 로이 필딩이라는 컴퓨터 과학자가 그의 박사 논문에서 제안한 웹과 같은 분산 하이퍼미디어 시스템을 위한 '소프트웨어 아키텍처 스타일'입니다. 말이 어렵죠? 쉽게 말해, '웹 서비스를 잘 만들기 위한 설계 원칙들의 집합' 정도로 이해할 수 있습니다. 특정 기술이나 프로토콜이 아니라, 일종의 디자인 가이드라인, 철학에 가깝습니다.
'Representational State Transfer'라는 말을 풀어보면 그 의미가 더 명확해집니다. 웹에 존재하는 모든 것을 '자원(Resource)'이라고 정의하고 (예: 사용자 정보, 게시글, 사진 등), 각 자원에 고유한 '주소(URI)'를 부여합니다. 그리고 클라이언트가 이 주소를 통해 서버에 요청을 보내면, 서버는 해당 자원의 '상태에 대한 표현(Representation)'을 전달한다는 의미입니다. 여기서 '표현'은 보통 JSON이나 XML 같은 데이터 형식을 말합니다.
그렇다면 'RESTful'은 무엇일까요? 이는 'REST 아키텍처 스타일의 원칙을 충실하게 지키는 API'를 의미하는 형용사입니다. 즉, 레시피가 'REST'라면, 그 레시피를 잘 따라서 맛있게 만들어진 요리가 'RESTful한 요리'가 되는 셈입니다. 모든 API가 RESTful API인 것은 아닙니다. 하지만 현대 웹 개발에서는 대부분의 API가 REST 원칙을 따르려고 노력하며, 이는 웹의 가장 기본적인 통신 방식인 HTTP 프로토콜의 장점을 최대한 활용할 수 있도록 설계되었기 때문입니다.
REST를 REST답게 만드는 6가지 핵심 원칙
어떤 API가 'RESTful'하다고 말하려면, 다음의 6가지 설계 원칙(제약 조건)을 따라야 합니다. 이 원칙들은 웹의 확장성과 성능을 극대화하기 위해 고안되었습니다.
1. 클라이언트-서버 구조 (Client-Server)
클라이언트와 서버의 역할을 명확하게 분리하는 것입니다. 클라이언트는 사용자 인터페이스(UI)에 집중하고, 서버는 자원을 관리하고 비즈니스 로직을 처리하는 데 집중합니다. 이렇게 서로의 역할이 분리되면, 각자 독립적으로 발전하고 교체될 수 있어 전체 시스템의 유연성과 확장성이 높아집니다.
2. 무상태성 (Stateless)
각 요청은 서버가 해당 요청을 이해하고 처리하는 데 필요한 모든 정보를 담고 있어야 합니다. 서버는 이전 요청에 대한 어떠한 정보(상태)도 저장하지 않습니다. 모든 요청이 독립적으로 처리되기 때문에, 서버는 클라이언트의 세션 정보 등을 관리할 필요가 없어지고, 이를 통해 구현이 단순해지고 서버의 확장성이 크게 향상됩니다.
3. 캐시 가능성 (Cacheable)
클라이언트는 서버의 응답을 캐시(임시 저장)할 수 있어야 합니다. 서버는 응답 데이터가 캐시 가능한지 아닌지를 명시해야 합니다. 잘 캐시된 데이터는 클라이언트가 동일한 데이터를 다시 요청할 필요가 없게 만들어 서버와의 불필요한 통신을 줄여주고, 전체적인 성능과 사용자 경험을 향상시킵니다.
4. 계층형 시스템 (Layered System)
클라이언트는 자신이 직접 통신하는 서버가 최종 목적지인지, 아니면 중간에 보안, 로드 밸런싱 등을 담당하는 다른 서버(프록시, 게이트웨이 등)를 거치는지 알 수 없습니다. 이러한 계층 구조는 시스템의 복잡도를 낮추고 보안을 강화하며, 확장성을 높이는 데 도움을 줍니다.
5. 균일한 인터페이스 (Uniform Interface)
REST의 가장 핵심적인 원칙으로, 자원과 상호작용하는 방식을 표준화하여 시스템 전체 아키텍처를 단순화하고 분리합니다. 이는 다시 4개의 하위 원칙으로 나뉩니다.
- 자원의 식별: 모든 자원은 URI(Uniform Resource Identifier)를 통해 고유하게 식별되어야 합니다.
- 표현을 통한 자원 조작: 클라이언트는 자원의 표현(예: JSON)을 통해 해당 자원의 상태를 변경할 수 있습니다.
- 자기 서술적 메시지: 각 메시지는 스스로를 설명할 수 있어야 합니다. (예: 어떤 데이터 형식인지 나타내는 'Content-Type' 헤더)
- HATEOAS: 클라이언트는 URI만 알면, 응답에 포함된 하이퍼링크를 통해 다음에 수행할 수 있는 동작들을 알 수 있어야 합니다.
6. 주문형 코드 (Code on Demand, 선택 사항)
유일하게 선택적으로 적용되는 원칙입니다. 서버가 클라이언트에 실행 가능한 코드(예: JavaScript)를 전송하여 클라이언트의 기능을 일시적으로 확장할 수 있도록 허용하는 것을 의미합니다.
실전! RESTful API는 이렇게 사용된다 (feat. HTTP)
이론적인 원칙들을 살펴봤으니, 이제 실제 개발에서 RESTful API가 어떻게 동작하는지 구체적인 예시를 통해 알아보겠습니다. REST는 웹의 기반인 HTTP 프로토콜의 특성을 적극적으로 활용합니다.
가장 중요한 것은 '자원(Resource)', '행위(Verb)', '표현(Representation)'이라는 세 가지 요소입니다. RESTful API는 URI를 통해 '자원'을 명시하고, HTTP Method(동사)를 통해 해당 자원에 대한 '행위'를 표현합니다. 예를 들어 '사용자(users)'라는 자원이 있다고 가정해 봅시다.
자원(Resource)의 표현: URI (Uniform Resource Identifier)
URI는 특정 자원을 나타내는 주소입니다. REST에서는 동사 대신 명사를 사용하여 자원을 표현하는 것을 권장합니다.
- `/users` : 모든 사용자 목록
- `/users/123` : ID가 123인 특정 사용자
행위(Verb)의 표현: HTTP Methods
자원에 대한 구체적인 작업은 HTTP의 주요 메서드를 통해 정의됩니다. 이를 통해 우리는 자원을 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)할 수 있습니다. 이것이 바로 CRUD입니다.
- GET (조회): 자원의 정보를 가져옵니다. 서버의 상태를 변경하지 않는 '안전한' 메서드입니다.
예: `GET /users/123` - 123번 사용자의 정보를 조회합니다. - POST (생성): 새로운 자원을 생성합니다. 요청할 때마다 새로운 자원이 생성될 수 있습니다.
예: `POST /users` - 새로운 사용자를 생성합니다. (사용자 정보는 요청 본문에 담아 전송) - PUT (전체 수정): 자원의 전체 정보를 교체합니다. 특정 자원이 존재하면 업데이트하고, 없으면 새로 생성할 수도 있습니다.
예: `PUT /users/123` - 123번 사용자의 정보를 요청 본문의 내용으로 완전히 덮어씁니다. - PATCH (부분 수정): 자원의 일부 정보만 수정합니다. PUT과 달리 변경하려는 필드만 전송하여 효율적입니다.
예: `PATCH /users/123` - 123번 사용자의 이메일 주소만 변경합니다. - DELETE (삭제): 특정 자원을 삭제합니다.
예: `DELETE /users/123` - 123번 사용자의 정보를 삭제합니다.
이처럼 URI는 자원을 가리키고, 그 자원에 대한 실제 행동은 HTTP 메서드가 정의함으로써, API의 구조가 매우 명확하고 직관적으로 변합니다. `DELETE /users/delete/123`과 같은 복잡한 URI 대신 `DELETE /users/123`으로 간결하게 표현할 수 있는 것입니다. 이것이 바로 RESTful API 디자인의 아름다움입니다.
잘 만든 API 하나, 당신의 커리어를 바꾼다
지금까지 API의 기본 개념부터 RESTful API의 설계 원칙과 실제 사용법까지 알아보았습니다. "그래서 이걸 아는 게 왜 그렇게 중요하죠?"라고 물으신다면, 그 대답은 '협업'과 '확장성'이라는 현대 소프트웨어 개발의 핵심 키워드에 있습니다.
더 이상 혼자서 모든 것을 만드는 시대는 지났습니다. 하나의 거대한 서비스는 수십, 수백 개의 작은 기능 단위로 나뉘어 개발됩니다. 바로 마이크로서비스 아키텍처(MSA)입니다. 이 작은 서비스들은 서로 어떻게 소통할까요? 바로 API를 통해서입니다. 잘 설계된 RESTful API는 프론트엔드 개발자와 백엔드 개발자, 그리고 다른 서비스 개발팀 간의 명확하고 효율적인 소통을 가능하게 하는 '공용어' 역할을 합니다.
명확한 API가 있으면 프론트엔드 개발자는 백엔드 개발이 완료될 때까지 기다릴 필요 없이, 약속된 API 명세에 따라 화면 개발을 동시에 진행할 수 있습니다. 다른 팀에서 만든 인증 API, 상품 API를 가져와 내 서비스에 손쉽게 통합할 수 있습니다. 이는 개발 속도를 비약적으로 향상시키고, 각 팀이 자신의 전문 분야에만 집중할 수 있게 해줍니다.
또한, RESTful 원칙을 따르는 것은 단순히 '유행'을 좇는 것이 아닙니다. Stateless, Cacheable, Layered System과 같은 원칙들은 서비스의 트래픽이 기하급수적으로 늘어났을 때 시스템이 버틸 수 있는 힘, 즉 확장성을 보장하는 핵심 요소입니다. 당장의 기능 구현에만 급급해 REST 원칙을 무시하고 제멋대로 API를 설계한다면, 그 서비스는 미래의 성장을 감당하지 못하고 기술 부채로 발목 잡히게 될 것입니다.
결론적으로, API와 RESTful 원칙에 대한 깊이 있는 이해는 단순히 코드를 짜는 기술을 넘어, 시스템 전체를 설계하고 다른 개발자와 효과적으로 협업하는 능력을 의미합니다. 이는 당신을 '코더'에서 '엔지니어'와 '아키텍트'로 성장시키는 중요한 발판이 될 것입니다. 지금 바로 당신이 만들고 있는, 혹은 사용하고 있는 API를 REST의 관점에서 다시 한번 살펴보는 것은 어떨까요? 그 작은 습관이 당신의 커리어에 큰 변화를 가져올 것입니다.