씬 클라이언트 접근 방식의 작동 원리
씬 클라이언트 접근 방식은 클라이언트와 타겟 API 엔드포인트 사이에 ‘게이트웨이 엔드포인트’를 도입합니다.
-
클라이언트: 최소한의 역할만 수행합니다. 명령줄 인자를 JSON 배열로 포맷하여 게이트웨이 엔드포인트에 POST 요청을 보냅니다. 응답으로 받은 텍스트를 표준 출력에 인쇄하는 것이 전부입니다.
-
게이트웨이 엔드포인트: 클라이언트로부터 받은 JSON 인자를 파싱하고, 적절한 타겟 엔드포인트를 결정하여 요청을 보냅니다. 타겟 엔드포인트로부터 JSON 응답을 받아 파싱한 후, 클라이언트가 직접 출력할 수 있는 일반 텍스트 형식으로 포맷하여 반환합니다.
씬 클라이언트 접근 방식의 장점
-
즉각적인 배포: 새로운 API 기능이 추가될 때 게이트웨이만 업데이트하면 되므로, 사용자는 클라이언트 프로그램을 업데이트할 필요 없이 새로운 CLI 기능을 즉시 사용할 수 있습니다. 이는 웹 배포의 주요 장점을 CLI에 가져옵니다.
-
중앙 집중식 에러 처리: 대부분의 로직이 서버 측 게이트웨이에서 실행되므로, 에러 발생 시 서버에서 효율적으로 처리하고 로깅할 수 있습니다.
-
작고 이식성 높은 클라이언트: 클라이언트 로직이 매우 적어 다른 언어(예: Go)로 쉽게 포팅하여 의존성 없는 정적 실행 파일을 만들 수 있습니다. 이를 통해 다양한 OS 및 플랫폼에 대한 크로스 컴파일이 용이합니다.
-
다중 엔드포인트 요청 시 낮은 지연 시간: 게이트웨이가 타겟 엔드포인트와의 내부 요청을 처리하므로, 여러 API 호출이 필요한 복합 명령의 전체 지연 시간을 줄일 수 있습니다.
고려 사항 및 해결책
-
외부 프로그램 실행: SSH, SFTP 등 외부 프로그램 실행 시 보안을 위해 클라이언트에서 API 특정 로직을 구현하여 서버 응답의 유효성을 검증해야 합니다. 이는 순수한 씬 클라이언트 접근 방식에서 벗어나는 부분이지만, 보안을 위해 필수적입니다.
-
클라이언트 설정: 명령줄 인자 파싱이 없으므로, 환경 변수를 통해 인증 토큰 및 서버 주소 등을 설정하는 방식을 채택했습니다.
-
인자 파싱 라이브러리
rodish: 복잡한 명령(명령 후 서브커맨드, 객체 지향 스타일)을 지원하기 위해 기존 Ruby 라이브러리로는 부족하여 Jeremy Evans는rodish라는 새로운 라이브러리를 개발했습니다.rodish는Roda와 유사하게 정적/동적 파트를 분리하여 효율적인 인자 파싱을 가능하게 합니다.
웹 셸 구현
클라이언트 로직이 최소화된 덕분에, 웹 애플리케이션 내에서 CLI를 테스트할 수 있는 웹 셸(Web Shell)을 쉽게 구현할 수 있었습니다. 이는 사용자들이 CLI의 편리함을 미리 경험하고 설치를 유도하는 데 큰 도움이 됩니다.