애플 숏컷 환경의 특징
오토메이션에는 애플 숏컷 앱 사용
앞에서 제가 오토메이션 요구사항에 접근하는 방법을 소개했으니 이어서 제가 선택한 오토메이션 환경과 정보시스템 이야기를 하겠습니다. 현대에는 여러 가지 좋은 스크립팅 환경이 있음을 알고 있습니다. 코딩에 대한 관심이 높아지면서 접근하기 쉬운 환경도 늘어났고요. 하지만 제 자신이 직접 프로그래머가 아니라는 점은 이런 본격적인 개발 환경을 선택하는데 주저하게 만들었습니다. 익숙하지 않은 환경을 선택하면 로직을 만들기보다는 환경에서 일어나는 문제해결에 시간을 쓰다가 지쳐 포기한 경험이 있었습니다. 그래서 오토메이션 자체는 애플 숏컷 앱을 통해 만들기로 했습니다.
정보시스템에는 지라 사용
오토메이션을 지원할 정보시스템에는 지라를 사용합니다. 지라는 이전에도 ‘개인 할일관리 사례’와 ‘개인 할일관리에 지라 사용’을 통해 소개한 적이 있습니다. 지난 몇 년에 걸쳐 지라를 통해 할일을 관리해 왔는데 여기서 한번 더 지라의 장점을 나열하겠습니다. 꽤 플랫폼에 독립적입니다. 아이폰 할일 앱은 꽤 아름답게 동작하지만 윈도우 환경에서는 느려터진 아이클라우드 웹을 통해 사용할 수 밖에 없는 반면 지라는 웹, 윈도우 앱, 맥 앱, 아이폰 및 아이패드 앱 등 적어도 제가 사용하는 주요 플랫폼을 모두 지원할 뿐 아니라 웹이 아이클라우드 웹과는 비교할 수 없을 정도로 빠르게 동작합니다. 또한 엄청나게 유연합니다. 이 유연함은 종종 지라가 무겁고 복잡하고 불편한 도구라는 인식에 일조하기도 하지만 핵심 동작을 꽤 깊은 곳까지 수정할 수 있습니다. 또 지라 앱을 통해 애플 숏컷 환경을 지원하고 지라 오토메이션을 통해 강력한 자동화를 제공합니다. 결정적으로 이 대단한 환경이 개인 사용자에게는 무료입니다.
숏컷 그래프 작성 환경
미리부터 김 빼는 것 같지만 애플 숏컷 앱처럼 그래프에 기반해 로직을 작성하는 앱들이 항상 그렇듯 예제를 따라 할 때는 뭐든 할 수 있고 또 잘 동작하는 것처럼 보이지만 모범 사례에서 한 발짝만 밖으로 나갈래도 급격히 올라가는 난이도와 예상대로 동작하지 않는 상황을 맞이하게 될 겁니다. 마치 언리얼 블루프린트에 십 수년 간 당해 온 것처럼요. 또 한 가지 목표를 달성하기 위해 애플 숏컷 환경 뿐 아니라 여러 회사에서 만든 소프트웨어의 조각들이 기적적으로 잘 동작해야 합니다.
명시적 리턴 없음
먼저 오토메이션에는 안정적으로 동작하는 함수 개념이 없다고 보는 편이 정신 건강을 위해 좋습니다. 분명 한 숏컷에서 다른 숏컷을 호출해 그 숏컷의 실행 결과를 돌려 받을 수 있게 되어 있지만 이 과정이 명시적이지 않습니다. 명시적으로 다른 숏컷에 값을 넣어 실행할 수 있지만 명시적으로 그 숏컷으로부터 값을 돌려 받을 수는 없습니다. 이 부분은 묵시적으로 동작하는데 예상과 달리 동작하는 상황을 자주 맞이할 겁니다. 함수라기보다는 서브루틴이라고 생각하는 편이 나을 겁니다.
⬆️ 이전에 명시적 리턴이 없다고 했었는데 제가 잘못 알고 있었습니다. '애플 숏컷에 명시적 리턴 있음'에서 다시 설명했습니다.
글로벌 변수 없음
애플 숏컷 순정 상태에는 숏컷 외부에 값을 저장하고 이를 다른 숏컷에서 불러다 쓸 수 없습니다. 숏컷 안에서 선언한 변수는 숏컷 안에서만 유효합니다. 특히 조건이나 반복 안에서 선언한 변수는 그래프로 되어 있는 코드의 낮은 가독성에 따라 스코프를 파악하기 쉽지 않습니다. 처음에는 숏컷 바깥에 값을 저장하기 위해 지라, 애플 노트 앱, 넘버즈 앱 등을 사용했습니다. 숏컷 실행 중 값을 저장하거나 불러오고 싶으면 이 앱들을 불러서 사용하는 방식이었는데 동작하긴 하지만 느리고 불편했습니다. 툴박스 프로 앱을 사용하면 글로벌 변수를 편하게 사용할 수 있습니다. 다만 이 앱의 글로벌 변수는 키- 밸류 스타일로 별도로 네임스페이스를 지원하지는 않아 글로벌 변수가 많아지면 관리하기 좀 어려워집니다.
코드 가독성이 낮고 서브루틴 관리 어려움
그래프 모양으로 코드를 작성하는 환경의 특징이라고도 볼 수 있는데 일상적인 글로벌 변수를 읽어 값을 할당하는데도 노드 세 개가 필요합니다. 값 여러 개를 불러오면 순식간에 한 화면을 넘어가 코드를 읽기 상당히 나쁩니다. 중복 작업을 서브루틴으로 분리할 수는 있지만 이를 관리하기는 쉽지 않습니다. 숏컷 앱은 숏컷들을 한 단계 디렉토리 구조만으로 분리할 수 있는데 서브루틴(숏컷) 여러 개를 사용하는 숏컷을 다른 숏컷과 섞어 두면 관리하기 어려워 이를 항상 분리된 디렉토리에 따로 보관해야 합니다.
숏컷은 크게 숏컷과 오토메이션으로 나뉘는데 숏컷은 직접 실행하는 코드, 오토메이션은 조건에 따라 실행하는 코드입니다. 그런데 숏컷은 다른 숏컷을 복사해 수정한 다음 저장해 다른 기능을 만들 수 있지만 이상하게도 오토메이션은 코드를 복사할 수 없어 비슷한 기능을 가진 오토메이션을 만들기 위해 처음부터 코드를 다시 작성해야만 합니다. 그래서 항상 모든 코드는 숏컷으로만 만들고 오토메이션에서는 이 숏컷을 호출하는 식으로 동작하게 했는데 오토메이션에는 이름을 설정할 수 없어 조건에 맞아 실행될 때 오토메이션 내부 코드를 의미하는 아이콘으로만 표시되어 이 오토메이션이 뭘 하는 오토메이션인지 구분할 수가 없는 문제가 있습니다.
개발환경
불안정한 에디터 환경
숏컷 앱 자체가 안정적이지 않습니다. 저는 주로 출퇴근 지하철 안에서 아이폰을 들고 코드를 만드는 숏컷 앱의 에디터 자체가 느립니다. 한 숏컷에 노드가 20개만 돼도 편집이 느려지기 시작해 편집에 인내심이 필요합니다. 또 에디터에 버그도 많아 크래시를 자주 겪을 겁니다. 가령 Repeat
과 If
를 중첩해 사용할 일이 자주 일어나는데 이 중첩은 어느 때는 잘 동작하지만 어느 때는 각각의 종료 구문이 꼬여 크래시되기 일쑤입니다.
디버깅 어려움
디버그 환경이 열악합니다. 예상대로 동작하지 않는 문제를 해결하기 위해 로그를 찍어볼 수밖에 없습니다. 서기 2023년에도 디버깅을 위해 애플 노트 앱을 여러 로그를 쳐다보고 있어야 합니다. 또 에러 핸들링이 없습니다. 그래서 숏컷이 실행되다가 중간에 에러로 중단되면 숏컷에 의해 수정되어야 할 항목들이 끝까지 수정되도록 할 복구 방법을 준비해야 합니다. 제가 가장 자주 겪은 상황은 어떤 작업을 수행한 다음 작업을 수행했다고 글로벌 변수에 표시하는 동작에서 앞쪽의 작업은 성공했지만 뒤쪽의 변수 표시에만 실패하는 상황이었습니다. 또 동작의 성공, 실패 여부를 알 수 없을 때가 있습니다. 가령 메신저 앱을 제어해 메시지를 보낼 때 메시지가 보내졌는지 안 보내졌는지 알 수가 없습니다. 저는 그저 메신저 앱의 숏컷 기능을 호출하고 제대로 실행되었으리라 예상한 채 다음으로 진행해야만 합니다.
버전관리 기능 없음
애플 숏컷은 내부적으로는 코드를 JSON 형태로 저장하는 것 같지만 파일 자체는 바이너리 형태입니다. 또한 이를 파일 모양으로 만들기 위해서 별도로 익스포트 해야 하며 그러기 전까지는 숏컷 앱에 나열된 리스트로만 나타날 뿐입니다. 이 자체만으로는 아무런 버전 관리 기능을 제공하지 않습니다. 숏컷을 만들다 말고 저장하면 다음에 숏컷을 열었을 때 이전에 뭘 하다 저장했는지 알 방법이 없습니다. 또 중간에 에디터가 크래시되면 어디까지 저장됐고 또 어디부터 저장되지 않았는지 눈으로 직접 코드를 읽어 가며 확인해야 합니다. 전에 ‘버퍼를 오토메이션으로 대신한 사례’에서 오토메이션 전체의 스크린샷을 남겨 놓곤 했는데 변경사항에 Diff를 할 수 없어 스크린샷을 찍어 설명을 남겨 놨다가 나중에 비교할 일이 생길 때 사용하려는 의도입니다.
실행될 때 고려사항
여러 기능에 아이폰 언락 요구
여러 동작에 아이폰 언락 상태를 요구합니다. 처음 예상한 것은 완전히 신경 끄고 있어도 상황에 맞는 숏컷이 알아서 실행되리라는 것이었지만 숏컷 기능 대부분은 아이폰의 보안 시스템에 기반하고 있어 이들이 동작하려면 아이폰이 언락 되어 있어야 합니다. 가령 트위터에 메시지를 수동으로 올린다면 아이폰은 당연히 언락 상태일 겁니다. 이 당연함은 트위터에 메시지를 자동으로 올릴 때도 적용되어 실행을 불편하게 만듭니다. 특정 시각에 실행되는 숏컷에 트위터에 메시지를 올리는 부분이 있다 칩시다. 그러면 숏컷은 실행되지만 트위터에 메시지를 올리는 부분에서 멈춘 다음 노티피케이션을 보내 놓고 아이폰이 언락될 때까지 기다립니다. 그래서 숏컷이 실행되기 시작한 시점과 언락이 필요한 기능의 실행 사이에 시간 차가 많이 날 수 있습니다.
중복실행 대비
같은 숏컷의 중복 실행을 막지 않습니다. 때문에 중복 실행을 막아야 한다면 별도로 이를 확인하는 로직을 사용해야 합니다. 예상하시겠지만 단순히 글로벌 변수에만 의존해서는 아주 짧은 시간 안에 일어나는 중복 실행을 막을 수가 없어 짧은 시간에 발생한 여러 요청을 차례대로만 처리하는 외부 기능에 의존해야 합니다. 제 경우에는 중복 실행 방지에 사용하는 지라 태스크를 만들어 놓고 이 태스크의 상태를 바꿔 가며 중복 실행을 막고있습니다.
실제 세계로부터 일어나는 현상
마지막으로 실제 세계로부터 정보를 얻는 동작은 동작마다 특성이 있어 이를 파악해야 숏컷의 동작을 예상할 수 있습니다. 가령 지오펜스는 지하에서 지상으로 올라올 때는 예상 대로 동작하지만 반대로 지상에서 지하로 내려간 다음에는 반응이 느립니다. 기술적으로는 당연하지만 이를 생각하지 않으면 예상과 다른 동작을 맞이할 수 있습니다. 가령 출퇴근 메시지를 자동으로 보낸다 칩시다. 지하철 역에 도착해 지상으로 올라오면 지오펜스 안에 진입해 예상대로 동작할 겁니다. 하지만 지상에서 지하로 내려가면 탑 뷰에서 볼 때 이미 지오펜스 범위를 벗어났지만 지하에서 이동하는 이상 이 이동이 지오펜스에 바로 반영되지 않습니다. 그래서 곧이곧대로 지오펜스에만 의존하면 예상한 동작을 만들기 어려울 겁니다.
배포하기 어려움
마지막으로 배포가 어렵습니다. 특히 서브루틴을 묶어서 배포할 수 없어 이들 각각을 익스포트햐야 하고 임포트도 각각 해야 합니다. 또한 어느 서브루틴에 의존하는지 수동으로 파악해야만 합니다. 이런 문제를 해결하려다 보면 만사가 귀찮아져 결국 혼자 쓰게 됩니다. 또 다른 앱에 대한 의존성 역시 수동으로 해결해야 합니다. 가령 트위터에 메시지를 보내는 기능을 사용하는 숏컷이라면 트위터 앱이 설치되어 있어야 하는데 이를 숏컷을 임포트 할 때 미리 알 수 없습니다. 일단 실행해 보고 에러가 나면 그때부터 대응해야 합니다.
결론
지금까지 애플 숏컷 환경으로 오토메이션을 작성하며 제가 겪은 일에 기반해 같은 방법으로 오토메이션을 만들기 전에 감안할 사항을 소개했습니다. 이렇게 써 놓고 보니 못 써먹을 환경 같지만 또 나름대로 잘 동작하는 편입니다. 이 다음에는 실제 오토메이션 사례를 소개하겠습니다.