APIDoc 으로 REST API 문서화 하기 #2
문서화 위치
apidoc 이나 기타 도구로 문서화를 할 때 드는 고민은 실제 소스 코드내에 주석으로 작성할 지 아니면 별도의 파일에 작성할 지 여부입니다.
정답은 없고 취향과 사용 도구에 따라 달라지겠지만 개인적으로는 프로젝트를 문서화할 때 소스와 별도로 API 문서화 파일에 작성하는 것으로 정했고 이유는 다음과 같습니다.
- apidoc 는 언어의 Annotation 기능을 활용해 method signature에 맞게 자동으로 API 문서를 생성해 주지 않습니다.
그래서 굳이 한 파일에 작성할 이점이 없습니다. - 주석 방식으로 사용하다 보니 설명이 꽤 길어지는데 긴 주석때문에 정작 소스 코드를 이해하고 작성하기 더 불편해 집니다.
소스 코드와 API 문서가 달라지면 어떻게 하냐고요?
그건 소스 코드에 직접 API 문서를 작성해도 발생할 일이며 소스 코드 리뷰등 내부 개발 문화 개선을 통해서 해결해야 한다고 생각합니다.
header/Footer 사용
API 문서에 공통으로 들어가는 헤더와 푸터를 사용하려면 apidoc.json 에 header 와 footer 항목을 추가하고 markdown 파일을 만들어 주면 됩니다.
{
"name": "my project",
"version": "1.0.0",
"description": "my project apiDoc basic example",
"title": "Custom apiDoc browser title",
"url": "https://myproject.example.com/v1",
"header": {
"title": "My own header title",
"filename": "header.md"
},
"footer": {
"title": "My own footer title",
"filename": "footer.md"
}
}
JS
header.md 와 footer.md 파일을 만들어 줍니다.
# header.md
apidoc 헤더 파일입니다.
```bash
git clone https://github.com/apidoc/apidoc && cd apidoc
npm install --prod
./bin/apidoc -i example -o /tmp/doc
$BROWSER /tmp/doc
```
CODE
# footer 파일
apidoc 에 추가할 footer 내용입니다.
```bash
ls -l
```
CODE
이제 apidoc 으로 매뉴얼을 컴파일하고 browser 로 접속하면 헤더와 푸터를 볼 수 있습니다.
API 예제
/**
* @api {post} /users/create 사용자 등록
*
* @apiDescription 새로운 사용자 정보를 등록합니다.
*
* @apiVersion 1.0.0
* @apiName product-create
* @apiGroup products
*
* @apiParam {String} name 이름
* @apiParam {String} address 주소
* @apiParam {String} [address_detail] 상세 주소
* @apiParam {Number} post_num 우편 번호
*
* @apiSampleRequest /api/v1/users/create
*
* @apiHeader {String} Authorization='Bearer KYVAFULuO7fDHjZ3oiCLgYGdTclmkGKLyiakSFqg'
*
* @apiExample {curl} Example usage:
* curl --header "Content-Type: application/json"\
* --header "Authorization: Bearer 1|KYVAFULuO7fDHjZ3oiCLgYGdTclmkGKLyiakSFqg" \
* --request POST \
* --data '{"name":"홍길동", "address": "제주도", "address_detail: "성산읍", post_num: 12345 }' \
* http://api.example.com/api/v1/users/create
*
* @apiParamExample {dn} Request-Example:
* {
* "name": "홍길동", "address": "제주도"
* }
*
* @apiSuccess {String} result ok
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "result": true
* }
*
* @apiError {String} message 결과 메시지
* @apiError {String[]} errors 상세 에러 메시지
*
* @apiErrorExample 422 IP 허용 안 됨
* HTTP/1.1 422 Unprocessable Entity
* {
* "data": {
* "message": "Unprocessable Entity",
* "errors" : [
* "이름은 필수 필드입니다."
* ]
* }
* }
*
* @apiErrorExample 422 파라미터 에러
* HTTP/1.1 422 Unprocessable Entity
* {
* "data": {
* "message": "Unprocessable Entity",
* "errors" : [
* "우편번호 형식이 아닙니다."
* ]
* }
* }
*/
JS
apiParam
optional 일 경우 [ ] 안에 파라미터 적어줍니다.
CODE