Technote

개발 워크플로우 입문

연재 REST API 와 헤드리스 8부 중 1부

REST API 기본 — 코어가 이미 열어 둔 것들

헤드리스를 하지 않아도 이미 쓰고 있습니다. 블록 에디터가 글을 저장하는 경로가 바로 이것이고, 응답의 형태를 알면 클라이언트 코드가 절반으로 줄어듭니다.

워드프레스는 설치한 순간부터 REST API 를 켜 두고 있습니다. 플러그인도 설정도 필요 없습니다. 브라우저에서 /wp-json/ 를 열면 이 사이트가 공개하는 네임스페이스와 라우트가 전부 JSON 으로 나옵니다. 헤드리스를 할 계획이 없어도 알아 둘 값어치가 있습니다 — 블록 에디터가 글을 저장하는 경로가 바로 이것이기 때문입니다.

이미 열려 있는 것

코어가 등록하는 주 네임스페이스는 wp/v2 입니다. 글 · 페이지 · 미디어 · 카테고리 · 태그 · 사용자 · 설정 · 검색이 여기 들어 있고, 커스텀 포스트 타입은 등록할 때 노출을 선언한 것만 합류합니다 — 그 선언이 다음 회차의 주제입니다.

GET     /wp-json/                    네임스페이스와 라우트 목록
GET     /wp-json/wp/v2/posts         발행된 글 (인증 불요)
GET     /wp-json/wp/v2/posts/12      글 하나
OPTIONS /wp-json/wp/v2/posts         이 라우트의 스키마와 허용 메서드

마지막 줄이 특히 쓸모 있습니다. OPTIONS 로 라우트를 두드리면 인자 목록 · 타입 · 필수 여부 · 기본값이 스키마로 돌아옵니다. 문서를 찾기 전에 여기부터 보는 편이 빠르고, 무엇보다 이 설치에 실제로 등록된 내용이라 문서보다 정확합니다. 플러그인이 라우트를 더했는지도 여기서 드러납니다.

읽기와 쓰기의 경계는 뚜렷합니다. 발행된 콘텐츠의 읽기는 인증이 필요 없고, 나머지는 거의 전부 인증을 요구합니다.

코어 라우트의 기본 경계 — 읽기는 열려 있고 그 밖은 권한을 본다

응답의 형태 — context · _fields · _embed

같은 리소스라도 context 에 따라 돌려주는 필드가 달라집니다. 기본값 view 는 공개 필드만, embed 는 요약 몇 개만, edit 는 원본(raw) 값까지 주는데 edit 는 권한이 있어야 합니다.

같은 리소스의 세 가지 표현 — 넓은 쪽일수록 권한을 더 요구한다

목록에서 필요한 것이 제목과 주소뿐이라면 _fields=id,title,link 로 잘라 받습니다. 응답이 작아지고 서버가 만들지 않아도 될 필드가 줄어듭니다. 반대로 _embed 를 붙이면 대표 이미지 · 작성자 · 텀이 _embedded 안에 함께 실려 와 요청 횟수가 줄어듭니다. 둘은 방향이 반대인 최적화라, 요청 하나에서 무엇을 아낄지 먼저 정하고 골라야 합니다.

페이지네이션과 오류

목록은 기본 10건이고 per_page 로 조정하되 상한이 100 입니다. 전체 개수는 본문이 아니라 응답 헤더에 옵니다.

X-WP-Total: 137
X-WP-TotalPages: 14

이 헤더를 읽지 않고 “빈 페이지가 나올 때까지” 도는 클라이언트를 자주 봅니다. 마지막 페이지 다음을 요청하면 빈 배열이 아니라 400 오류가 돌아오므로, 그 방식은 매 순회마다 오류를 한 번 만들고 끝납니다.

오류는 HTTP 상태 코드와 JSON 본문 양쪽으로 옵니다. 본문의 모양은 언제나 같습니다.

{"code":"rest_post_invalid_id","message":"올바르지 않은 글 ID 입니다.","data":{"status":404}}

code 는 기계가 분기할 문자열이고 message 는 사람이 읽을 문장입니다. 클라이언트에서 message 로 분기하지 마세요 — 사이트 로케일이 바뀌면 그 문장이 바뀝니다. 같은 이유로 우리가 만드는 라우트도 code 를 안정된 식별자로 정해 두어야 합니다.

API 를 전제로 한 개발 습관 전반은 개발 워크플로우 아카이브에 모여 있고, 남이 만든 환경 위에서 이런 계층을 건드릴 때의 실제 절차는 작업 과정에 공개돼 있습니다.

다음 회차

코어 라우트는 여기까지입니다. 다음 회차는 우리가 만든 포스트 타입과 메타를 이 목록에 합류시키는 방법 — show_in_rest 가 정확히 무엇을 하고, 메타에서는 왜 그 한 줄로 부족한지를 다룹니다.

이 주제의 다른 글

노하우 목록으로

개발 워크플로우 실무

워드프레스를 GitHub 에 올릴 때의 .gitignore

워드프레스 저장소에서 커밋해야 할 것과 절대 커밋하면 안 되는 것의 경계는 명확합니다. wp-config.php 한 파일이 저장소에 들어가는 순간 DB 비밀번호와 인증 솔트가 통째로 유출됩니다.

개발자 · 운영 · 관리자 5분 읽기

개발 워크플로우 실무

취향 논쟁을 규칙 확인으로 바꾸는 디자인 리뷰

"좀 답답해 보인다" 는 반박할 수 없고 고칠 수도 없습니다. 간격 척도 밖의 값, 팔레트 밖의 색, 기준 미달 대비, 빠진 상태 — 네 항목만 규칙으로 바꿔도 리뷰의…

디자이너 4분 읽기

₩270,000 · 신청하기