소프트웨어 컴포넌트가 제공하는 인터페이스. 다른 소프트웨어가 그 컴포넌트의 기능을 쓸 수 있게 해준다. 라이브러리든 프레임워크든 플랫폼이든 전부 API로 열린다. 프로그램 사이를 잇는 다리에 해당한다.
세 낱말의 뜻
이름을 쪼개면 뜻이 그대로 나온다. Application은 운영체제 위에서 실행되는 모든 소프트웨어, 곧 운영체제가 아닌 모든 프로그램이다. Programming은 메모리에 올라가 실행될 명령어들의 집합인 프로그램을 작성하는 행위다. Interface는 서로 다른 둘이 정보를 주고받으려고 약속한 규약이다. 합치면 응용 프로그램을 만들 때 쓰는 인터페이스가 된다.
구현과 독립적인 규약
API가 정의하는 것은 구현과 독립적인 사양뿐이다. 어떤 하드웨어인지, 어떤 언어로 짰는지와 무관하게 정보를 주고받는 규약만 정한다.
이 성질에서 나머지가 따라 나온다. 규약이 유지되는 한 구현을 바꿔도 쓰는 쪽은 그대로다. 양쪽이 서로를 몰라도 되므로 인터페이스가 클래스 사이에서 하는 일을 시스템 사이에서 하는 셈이다. 다만 열려 있다고 아무나 쓸 수 있는 것은 아니어서 API에 따라 접근 권한이 필요하다.
같은 발상이 의존관계 역전 원칙과 PSA에도 있다. 구체적인 것에 기대지 말고 약속에 기대라는 것이다.
층마다 놓인 경계
API를 특정 기술로 좁혀 생각하기 쉬운데 실제로는 층마다 다 있다. 시스템 콜은 응용 프로그램과 커널 사이, 소켓은 응용 프로그램과 TCP/IP 스택 사이, Java API는 내 코드와 표준 라이브러리 사이, REST API는 클라이언트와 원격 서버 사이, 오픈 API는 내 서비스와 다른 회사의 서비스 사이에 있다.
“API”라고 하면 대개 뒤쪽 둘을 떠올리지만 시스템 콜도 소켓도 정확히 같은 것이다. 경계를 긋고 그 너머를 규약으로만 다루는 방식이다.