3 min read

로직 앱에서 인라인 스크립트를 이용해 배열의 가장 최근 값을 받아오기

Justin Yoo

지난 포스트에서는 배열 안의 날짜 데이터를 이용해 최근 데이터를 찾는 방법을 로직 앱Select 액션Filter 액션을 조합하는 방식으로 알아 보았다. 사실 이 방법은 특정 사용자 케이스에 대해서만 적용할 수 있는 방법이기도 하고, 꼼수같은 방법이기도 해서 일반적인 경우에 적용하기엔 한계가 있다. 하지만, 인라인 자바스크립트 코드 액션을 이용하면 이 모든 것을 손쉽게 해결할 수 있다. 이번 포스트에서는 인라인 자바스크립트 코드 액션을 이용해서 배열을 정렬한 후 가장 최근값을 받아오는 로직 앱을 작성해 보기로 하자.

통합 어카운트

로직 앱에서 인라인 자바스크립트 코드 액션을 사용하기 위해서는 먼저 통합 어카운트가 있어야 한다. 통합 어카운트는 현재 무료(Free), 기본(Basic), 표준(Standard)의 세가지 가격 정책을 갖고 있는데, 이 포스트를 위해서는 무료 티어를 사용해도 상관없다.

통합 어카운트 인스턴스를 생성한 후 이를 로직 앱에 아래와 같이 연결시켜 주면 이와 관련한 준비는 끝난다.

자바스크립트 버전

로직 앱의 인라인 자바스크립트 코드 액션은 현재 node.js 8.11.1버전을 지원한다. 그리고 이 버전 자바스크립트의 빌트인 펑션들만 지원할 뿐이고, 외부 라이브러리를 이용한 추가적인 설치는 지원하지 않는다고 한다. 따라서 별도의 require() 구문 없이도 모든 기능들이 작동하게끔 해야 한다.

인라인 코드

우선 아래와 같은 자바스크립트 코드를 살펴보자. 이 코드는 로직 앱과는 상관 없는 순수한 자바스크립트 코드이다. 이 코드를 node.js 콘솔 창에서 실행시켜 보면 가장 최근의 파일인 20191104.json이 반환되는 것을 확인할 수 있다. 자바스크립트에서 객체의 배열을 정렬하려면 별도의 콜백 펑션 API를 이용해서 원하는 형태로 만들 수 있다.

"use strict";
var items = [
{
"Name": "20191101.json",
"Path": "/path/20191101.json"
},
{
"Name": "20191102.json",
"Path": "/path/20191102.json"
},
{
"Name": "20191103.json",
"Path": "/path/20191103.json"
},
{
"Name": "20191104.json",
"Path": "/path/20191104.json"
}
];
var sorted = items.sort(function (a, b) {
var dateA = a.Name.replace('.json', '');
var dateB = b.Name.replace('.json', '');
// dateA is later than dateB: dateA gets the lower index.
if (dateA > dateB) {
return -1;
}
// dateA is older than dateB: dateB gets the lower index.
if (dateA < dateB) {
return 1;
}
// dateA and dateB is the same
return 0;
});
var result = sorted[0].Path;
console.log(result);
view raw sort.js hosted with ❤ by GitHub

이 때 알아 두어야 할 부분은 이 콜백 펑션이 반환하는 값은 -1, 0, 1의 세 가지인데, -1은 배열의 두 값 aba를 낮은 인덱스로 보낸다는 의미이고, 1은 배열의 두 값 abb를 낮은 인덱스로 보낸다는 의미이다. 따라서, 이 콜백 펑션을 거쳐 배열을 정렬하게 되면 Name 속성에 할당된 값에서 .json을 떼 내고, 두 값을 비교해서 좀 더 최근 날짜를 위로 올리는 (낮은 인덱스로 보내는), 즉 내림차순으로 정리가 된다.

이와 관련해서 좀 더 자세히 알고 싶다면 이 페이지를 참조한다.

그러면 이를 실제로 로직 앱에 적용시켜 보자.

로직 앱 인라인 자바스크립트 코드 액션

먼저 아래와 같이 인라인 자바스크립트 코드 액션을 추가한다.

이렇게 액션을 추가한 후 아래 자바스크립트 코드를 추가한다. 위에 작성한 코드와 별반 다르지 않지만 두 부분이 바뀌었다.

"use strict";
// Assign the array value from the output of the previous action, `List Backups`.
var items = workflowContext.actions.List_Backups.outputs.body.value;
var sorted = items.sort(function (a, b) {
var dateA = a.Name.replace('.json', '');
var dateB = b.Name.replace('.json', '');
if (dateA > dateB) {
return -1;
}
if (dateA < dateB) {
return 1;
}
return 0;
});
var result = sorted[0].Path;
// Returns the result as output.
return result;
view raw sort-action.js hosted with ❤ by GitHub
  • items 변수에 배열값을 이전에 실행시켰던 List Backups 액션의 결과값을 통해 할당한다.
  • 마지막 줄에 보면 return 구문을 통해 이 액션의 실행 결과를 outputs으로 반환한다.

이렇게 반환된 값은 다음에 이어지는 액션들 사이에서 outputs('ACTION_NAME')?['body']를 통해 사용할 수 있다.

비교

이 액션 하나로 배열의 정렬이 한방에 정리가 됐다. 그러면 지난 포스트에서 정리했던 결과와 비교를 해 보도록 하자. 아래 그림을 보면 좀 더 확실하게 눈에 들어올 것이다.

우측의 워크플로우는 지난 포스트에서 작성한 것이다. 다른 것은 다 제껴두고라도 원하는 결과를 얻기 위해서 최소한 Select Filename from Backups 액션과 Take Latest Backup 액션 두 개를 실행시켜야 한다. 그리고 조금 더 깔끔한 결과를 원한다면 그림과 같이 추가적인 액션을 앞뒤로 배치한다.

반면에 인라인 자바스크립트 코드 액션을 이용하면 한방에 깔끔하게 결과를 받아볼 수 있다. 하지만 여기서도 문제가 하나 있는데, 이 액션을 사용하기 위해서는 반드시 통합 어카운트를 사용해야 한다. 사용한 만큼 가격을 지불하는 방식이 아니라 월별 정액제로 비용을 지불하는 방식이다. 이 비용이 한달 30일 기준 33.3만원 (기본) 혹은 111만원 (표준) 정도로 꽤 비싸기 때문에 이미 회사에서 통합 어카운트를 사용하고 있다면 문제가 없지만, 그렇지 않다면 신중히 고려를 해 봐야 할 수도 있다.


지금까지 인라인 자바스크립트 코드 액션을 통해 로직 앱 워크플로우 상에서 배열을 정렬하는 방법에 대해 알아 보았다. 굉장히 강력한 기능이긴 하지만, 앞서 언급한 바와 같이 비용에 대한 충분한 고려 후 적용시켜야 한다.