Postman Flows 사용하기

Postman Flows는 유용함에도 불구하고 관련 문서가 너무 드물다. 대부분의 사람들은 Postman의 Tests를 이용하여 처리하기 때문에 Flows는 아직 전인미답의 영역인듯 하다. 게다가 아직 Beta 버전이라 계속 개선되고 있기 때문에 그나마 있는 StackOverflow나 blog 문서들이랑도 잘 맞지 않다.
아마 이 글이 포스팅 된 (2022년 7월) 이후에도 Postman은 계속 업데이트 될 것이므로 상황은 달라질 수 있다.

Reference

주의사항

Flows 에디터 화면을 띄워놓고 몇 시간 정도 이것 저것 삽질해보다 보면 감이 온다.
문제는 WYSIWYG 에서 발생하는 에러가 거짓 양성(false positive)인 경우가 많다는 것이다. 실제로는 동작하지만 빨간 에러 메시지가 계속 표시되어 문제가 되는 것 처럼 보인다.
대표적인 경우가 JSON 처리인데, Select 블록을 이용해 response의 json을 탐색할 수 있지만 에디터에서는 Ambiguous로 표시된다. 그래서 JSON 속성을 못 읽어오는것 같지만 실행시켜보면 제대로 읽어지는 것을 알 수 있다.

JSON 속성을 못읽어 온다면 혹시 해당 속성이 배열([])속에 있는 것은 아닌지 확인해보자. 배열의 값은 /0 처럼 index를 지정해서 읽거나 Loop Over List 같은 반복문으로 읽을 수 있다.

활용

사전 준비

Flows까지 흘러들어왔다면 대부분 준비가 되어 있겠지만 Collections에 API 요청(request)이 준비되어 있어야 한다. 그리고 변수(variables)도 적절하게 준비가 되어있어야한다. SendRequest 블록에서 변수를 조작하는 경우가 많기 때문이다.

주요 블록 설명

정확한 정의는 공식 문서를 읽어보면 더 좋다. 아래는 개인적인 해석이 다소 포함됨.

  • SendRequest
    제일 기본이 되는 블록, Collections에 정의해 둔 API 요청을 실행시킨다. Variables를 input으로 받아 response를 output으로 생성하는데, input이 없어도 실행가능하다. API 요청을 실행 시킬때 필요한 environment나 variables를 설정할 수 있다. 이때 input으로 받은 값을 variable로 사용한다. Input으로 하나만 받을 수 있는데, 두개 이상 입력하면 실행이 여러번 된다(즉, 여러개를 한 번에 사용하는 것이 아님). 여러 변수를 input으로 전달하고 싶으면 durable을 만들어 전달해야한다.

  • Create Durable
    Parameter를 만들기위한 블록, Durable은 여러 블록에서 공통적으로 사용할 수 있는 데이터 맵이다. 일종의 전역변수같지만 연결된 블록에서만 사용가능하며 여러 chain 앞에 연결되어도 사용 가능하다. 앞 블록에서 받은 값을 data로 Select처럼 정제하여 보관할 수 있다.

  • Select
    앞 블록에서 받은 in input 값에서 필요한 값을 뽑아낸다. 주로 SendRequest에서 받은 response를 json 탐색하듯 데이터(Data)를 뽑아낼때 사용한다.

  • Terminal
    앞 블록에서 받은 값을 그대로 터미널에 출력하고 chain을 끝낸다. 터미널 그룹을 지정하여 출력값을 그룹으로 모아서 볼 수 있다.

  • Condtion
    앞 블록에서 받은 값을 boolean operator로 판별 후 true/false에 따라 chain을 두가지 분기로 나누어준다. Accept와 Reject 두 가지의 output이 있는데 해당 chain 흐름으로 앞 블록에서 받은 값을 그대로 넘겨준다.

  • If…Then…Else
    앞 블록에서 받은 값과 boolean 값을 input으로 받아 boolean이 true 이면 then output으로, false 이면 else output으로 그대로 넘겨준다. boolean 값은 연산자 블록으로 부터 받을 수 있다.

  • 연산자
    Boolean, String, Arithmetic 등의 연산자로 두 가지의 input을 연산 후 한 가지의 output을 생성한다. Input으로 value를 그대로 받을 수도 있고, Select 블록을 통해 정제된 데이터를 받을 수도 있다. 생성된 result output은 If…Then…Else에서 활용 가능하다.

  • Check
    Primary input을 받아 secondary input을 이용한 비교 연산이 true가 되면 primary를 그대로 넘겨준다. 앞 블록의 결과가 예상에 맞는지 확인하여 맞다면 통과시키는 식으로 활용가능하다. 위의 condition이나 if…then…else와 비슷하지만 분기가 없다는 점이 특징이다.

  • Loop Over List
    앞 블록에서 받은 list input이 배열이어야 한다. 이 배열의 데이터 개수만큼 이어지는 chain을 반복한다. Input이 애매하면 불필요한 반복이 발생하므로 약간 신경을 써줘야 한다. 입력받은 JSON이 배열이 맞는지 잘 확인할 것.

  • End Loop
    Loop Over List 등의 반복 블록으로 부터 이어진 블록들의 반복이 끝날 때 까지 데이터를 element input으로 받아 쌓아두고 반복이 끝나면 하나의 list output으로 넘겨준다. 반복의 결과를 다시 재반복에 활용할 수도 있고 터미널로 출력할 수도 있다.

기본 활용

Flows의 주 용도는 chaining 요청인데, 차례로 요청하고 응답받고 다시 요청하는 식으로 진행하는 것이다. 앞선 요청의 응답을 활용하여 다음 요청을 진행하기 위해서는 앞서 지적한 JSON처리가 필수이다.
만약 list를 읽어온 다음, 목록의 id 값들 만큼 세부내용을 조회하고, 그 결과를 추출하는 작업을 한다고 가정하면 대략 다음과 같은 Flows가 그려진다.

flowchart LR
    A[SendRequest] --> B[Select] -- "users[]" --> C[Loop Over List] --> D[Select] -- id --> E[SendRequest] --> F[Select] --> G[End Loop] --> H[Terminal]

중간 중간 끼워진 Select 블록으로 이전 요청의 결과값에서 다음 요청을 위한 parameter 를 뽑아내야 한다. SendRequest의 ParseBody를 AUTO나 JSON으로 해두면 Select로 /(슬래쉬)연산자를 통해 속성을 탐색할 수 있다.

속성 탐색 : /in/data/users

배열 탐색 : /in/users/0/userId

조회한 속성이 list([]) 형식이라면 Loop를 수행할 수 있다. 잘못된 문법이라고 에러를 뿌려대겠지만 용기를 갖고 try and error를 해봐야 할 것이다. Select로 추출한 parameter나 static한 값을 다음 request의 변수로 적용하려면 SendRequest의 Variables에서 /variables 를 지정해주면 된다.

flowchart LR
    A[Select] --> B["SendRequest (/variables)"]
    C[String] --> D["SendRequest (/variables)"]
    E[Create Durables] --> F["SendRequest (/@durable/userid)"]

단, /variables는 하나의 변수에만 할당할 수 있다. 변수별로 다양한 값을 할당하고 싶다면 Create Durable을 만들어 /@durable/item 으로 선택하는 방법을 사용해야한다.

응용

Flows를 활용해 test를 수행할 수도 있다. Check라는 블록을 이용하면 primary 값을 secondary 와 비교하여 맞으면 primary 값을 통과 시킬 수 있다. 두 버전의 API를 호출 한 후 응답을 비교하여 동일한지 체크하는 로직에 응용가능하다.

flowchart LR
    A[SendRequest] --> B[Select] -- primary --> Check --> Terminal  
    C[SendRequest] --> D[Select] -- secondary --> Check

SendRequest의 결과에 따라 다른 다음 블록을 실행 시킬 수도 있다. Boolean 연산블록과 If…Then…Else를 활용한다. API 호출의 결과에 따라 다른 API를 호출할 때 응용 가능하다.

flowchart LR
    A[SendRequest] --> B[Select] --> Equal --> X["If…Then…Else"] -- then --> X1[SendRequest] --> X2["..."]
    C[String] --> Equal           
    X -- else --> Z1[SendRequest] --> Z2["..."]

아니면, Condition을 이용해 입력한 값이 사용자 정의 조건에 맞거나 틀렸을 때로 분기하는 것도 가능하다.

flowchart LR
    A[SendRequest] --> B[Select] --> C["Condition (/data/status == 200)"] -- accept --> D[SendRequest] --> X["..."]
    C -- reject --> Z[Terminal]

End Loop 블록을 활용하면 앞서 반복되었던 결과들을 모아 한번에 Terminal로 출력가능하다. 이를 이용하면 특정 조건을 통과한 값들의 id만 Select로 추출한 뒤 모아 Terminal에 표시하여 테스트를 성공한 것만 확인하는 것도 가능하다.

flowchart LR
    A[SendRequest] --> B[Select] --> C["Loop Over List"] --> D[SendRequest] --> E[Select] --> F["End Loop"] --> Z[Terminal]

보통 자연스럽게 앞 단계가 성공해야 다음단계가 진행되는데 특정 조건에 따라 블록을 활성화/비활성화 시키는 기능도 있으니 에디터를 잘 살펴보자. 병렬로 배치하였을 경우에는 동시에 실행되는데, 이 병렬 배치에도 순서를 주고 싶다면 블록 우측하단 점과 좌측하단 On/Off 기능을 연결하여 동작의 의존성을 둘 수 있다.

결론

  • 절차를 만들어 앞뒤 맥락에 맞게 API 호출을 수행할 수 있다.
  • 데이터를 생성하고 조회하고 업데이트하고 삭제하고… 하나씩 변수를 바꿔가며 API를 호출하기 힘들때 활용하기 좋다.
  • 테스트 코드를 작성하는 것은 보통 어려운 일이 아니다. 코딩을 전혀 몰라도 WYSIWYG으로 테스트 셋을 구축하기 용이하다.

서비스 통합 테스트를 할 때, 배포한 서비스가 잘 동작하는지 검증할 때, API를 통해서 무언가 반복 작업을 해야할 때 등, Postman은 좋은 도구이다. Postman의 script는 공유도 가능하니 테스트 자산으로 관리하기도 훌륭하다.
앞으로 무한한 가능성이 있는 Postman의 Flows를 다양하게 활용해 보자!