생산성을 높이는 POSTMAN 기능 활용. 1편
Tags: tooling
Published: 2021-06-23 15:01:08


**1편, API 인증 자동화로 API 호출을 좀 더 편하게 만들기.**
2편, 콜렉션 수정내용 GIT 처럼 관리하기.
3편, API 호출 및 응답 예제를 작성해서 MOCK 서버 구축하기.
4편, 다양한 요청 포맷을 IMPORT/EXPORT.

## 1. API 인증 자동화로 API 호출을 좀 더 편하게 만들기.
API 호출 테스트를 하려면 일반적으로 인증 토큰 혹은, 인증에 필요한 값을 서버로 부터 받아 API 호출시 값을 전달하여 인증 하게 됩니다. 이러한 일반적인 API 호출 환경을 지원하기 위해, POSTMAN에서는 Authorization 기능을 제공 하고 있습니다. 

첫번째로 **Authorization 기능을 활용한 API인증 셋팅 방법**을 소개 하고, 약간은 아쉬운 듯한 Authorization 기능을 대체 할수 있도록 설정하는 방법까지 소개 하겠습니다.  
  
포스트맨은 collection이라는 API의 최상위 묶음 단위가 있고, 하위 계층으로 folder 묶음이 있고, 하위에 request가 포함되는 구조로 여러 request를 묶어서 관리 할 수 있습니다. 
![묶음 계층 예시](https://i.imgur.com/33lEF2c.png)

각 묶음단위 별로 Authorization을 설정 할 수 있는데, 인증 방식이 보통 API 전체적으로 적용되기에 collection 단위로 셋팅 하는 예를 보여드리겠습니다. 가장 간단한 API key 타입 인증의 셋팅 예시입니다.
API 제공자로부터 특정 HTTP 헤더 값에 제공한 KEY값을 넣어서 요청할 것을 가이드 받았다면, `API key` Type으로 Authorization을 셋팅 하면 됩니다. 

1. collection의 Authorization 탭으로 이동합니다
2. Type 에서 `API key`를 선택합니다.
3. 특정 헤더 값의 이름을 `key`항목에 입력 합니다. 제공받은 key값은 `value`항목에 입력합니다.
4. `Add to` 항목은 `Header`로 선택합니다.

![Authorization 예시](https://media.giphy.com/media/c8VcSm5ukFwfDOztxR/giphy.gif)

이렇게 셋팅 하면 collection내의 모든 API 요청시 셋팅한 헤더가 추가되어 요청됩니다. 

하지만! `API key` 타입의 셋팅으로는 어려운 상황이 발생하기도 합니다. 인증 값이 수시로 변경 되고 유효기간을 지니는 경우(JWT 같은)는 Authorization기능으로 셋팅하기가 힘든 경우인데요. 이 경우, 토큰을 발급 받기위해 하는 작업을 매번 반복 해야하는 불편함이 있습니다. 

이 불편함을 해소 할 수 있는 자동화 설정 방법을 소개합니다. **Pre-request script 기능을 활용한 토큰발급 자동화 방법입니다.** Pre-request script 
기능은 간단하게 설명하자면, 요청을 보내기전에 Javascript 코드를 실행 시켜주는 기능 입니다. Pre-request script 또한 Authorization기능처럼 모든 묶음 단위에 설정이 가능 합니다. 마찬가지로 collection에 셋팅하는 예시를 보여 드리겠습니다.

1. collection의 `Pre-request script` 탭으로 이동합니다.
2. 실행시킨 코드를 작성 하면, 셋팅 완료 됩니다.

![Pre-request script 예시](https://i.imgur.com/JeN2Tqh.png)

스크린샷에서 입력된 아래 Javascript 코드도 아래에 공유드립니다. 아임포트 API([API 문서](https://api.iamport.kr/))의 토큰을 얻어오는 스크립트입니다. 스크립트에서 하는 동작은 간단합니다. 토큰을 얻어오는 API를 http 요청하여 응답을 받고, 응답된 토큰 값을 실제 요청될 요청 객체에 헤더값으로 셋팅하는것이 전부입니다. 

```javascript
pm.sendRequest({
    url: 'https://api.iamport.kr/users/getToken',
    method: 'POST',
    header: {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: {
        mode: 'urlencoded',
        urlencoded: [
        {
            key: "imp_key", 
            value: "xxxxxxxxx", 
            disabled: false
        },
        {
            key: "imp_secret", 
            value: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
            disabled: false
        },
    ]
    }
}, function (err, res) {
    res_data = res.json()
    console.log(res_data)
    pm.request.headers.add({
        key: "X-ImpTokenHeader",
        value: res_data.response.access_token
    });
});
```

여기서 자세하게 알아야 할 부분은 `pm`[^pm]이라는 객체인데, 포스트맨에서 Pre-request script가 동작 하기전에 미리 준비해놓는 객체입니다. `pm`이라는 객체 내에 여러 메서드들과 멤버가 존재하는데 여기서는 `sendRequest()` 메서드와 `request` 객체를 사용했습니다. 
우선, `sendRequest()`를 사용해서 `users/getToken` API를 호출합니다. 이때, 아임포트에서 제공받은 `imp_key`값과 `imp_secret`값을 body 담아 요청 합니다. 
API 호출 응답이 오면, 응답 callback이 호출 되고, `pm.request.headers.add()`를 호출하여, 실제로 보내질 요청의 헤더에 `X-ImpTokenHeader`헤더를 추가하고 스크립트는 종료됩니다. 스크립트가 실행된 이후에, 호출하려고 했던 API가 호출 되며, 아래와 같이 인증을 통과한 정상적인 결과값을 확인 할 수 있게 됩니다.

![호출 결과](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a1vcge2vut7j1sc9irf9.png)

스크립트에 `console.log(res_data)`를 넣어두면 위 스크린샷 처럼 console 창에서 메세지를 확인 할 수 있습니다. token값이 잘 응답 되었고, 요청헤더에도 잘 추가된 것을 확인 하실 수 있습니다.

위 예시코드에서는 토큰 만료까지 토큰을 재사용 하지 않고, 무조건 요청전에 토큰을 가져오게 됩니다. `users/getToken` API결과 값 중의 `expired_at`값을 활용하여, 만료전까지 토큰을 재사용하는 코드로 개선을 할 수도 있을 것으로 보입니다. 


[^pm]: `pm`객체 에 대한 [document](https://learning.postman.com/docs/writing-scripts/script-references/postman-sandbox-api-reference/#the-pm-object)를 확인하고 사용하자.