물리량의 단위는 과학자와 엔지니어에게 매우 중요합니다. 단위는 많은 정보를 전달하지만, 안타깝게도 크고 값비싼 오류로 이어질 수 있습니다. JMP 내에서 단위를 관리하고 이러한 오류를 줄이기 위해 추가 기능이 개발되었습니다. 이 추가 기능은 JMP 18의 새로운 Python 통합 기능을 활용하여 JMP 17에서는 구현하기 어려웠던 작업을 손쉽게 수행할 수 있도록 합니다. 본 발표에서는 이 추가 기능의 기능과 함께 Python 사용, 소스 코드 관리, 테스트, 문서화 및 빌드 시스템을 포함한 개발 과정을 소개합니다.
안녕하세요, 저는 JMP 개발자 에반 맥코클입니다. 오늘 저는 JMP 18의 새로운 파이썬 통합 기능을 활용하여 개발한 추가 기능에 대해 이야기하려고 합니다. 이 추가 기능은 물리 단위 변환을 위한 것으로, 개발 동기, 개발 과정, 사용한 기술, 그리고 JMP 18 파이썬 통합 기능에 대한 자세한 내용도 함께 설명드리겠습니다.
저는 엔지니어로서 교육을 받고 초기 경력을 쌓았습니다. 교육 과정과 초기 경력 동안 다양한 단위 체계와 단위를 많이 접하게 되었는데, 주로 미국 관습 단위와 미터법 단위였습니다. 여러분 중 많은 분들도 마찬가지일 것이고, 단위 변환 문제로 인해 막대한 비용이 드는 중대한 실수가 발생했던 사례들을 잘 알고 계실 거라고 생각합니다. 그래서 저는 항상 단위 변환을 확인하는 데 도움이 되는 도구를 사용하려고 노력했습니다.
저는 종종 Pint라는 파이썬 라이브러리를 사용해서 그런 작업을 합니다. JMP 18의 새로운 파이썬 통합 기능을 살펴보고 있었는데, JMP의 기존 기능인 열에 단위를 주석으로 추가하는 기능에 이 기능을 통합할 수 있을지 궁금했습니다. 특정 열에 단위를 지정하고, 이를 통해 단위 변환 및 유효성 검사 등을 수행할 수 있을까요?
이것이 바로 이 추가 기능을 개발하게 된 계기입니다. 이 추가 기능은 테이블을 불러오면 열에 괄호로 묶인 단위를 감지하고 단위 속성을 자동으로 할당하며 해당 단위를 검증합니다. 전체 테이블과 테이블 전체의 단위를 한눈에 볼 수 있고, 단위를 일괄적으로 변경할 수 있으며, 시스템이 사용되는 단위와 약어를 제대로 이해하는지 확인하고, 간단한 수식 열의 단위도 자동으로 결정할 수 있습니다.
이 추가 기능의 핵심은 단위 변환 기능입니다. 예를 들어 인치를 밀리미터로 변환할 수 있습니다. 기존 열을 그대로 변환하거나 새 열을 추가하여 변환할 수 있습니다. 데이터를 변환할 때 기준선, 접근 설정, 사양 한계 등과 같은 열 속성도 함께 변환됩니다.
이러한 기능 외에도 지원되는 모든 단위와 단위를 조합하는 방법을 찾아볼 수 있는 데이터베이스와 JSL API가 제공됩니다. 관심 있으시면 화면의 QR 코드를 스캔하거나 커뮤니티에서 단위 변환 추가 기능을 검색해 보세요.
이것으로 애드인 기능에 대한 설명은 마치겠습니다. 이제 애드인이 어떻게 개발되었는지 이야기해 보겠습니다. 애드인의 소스 코드 관리에는 Git과 내부 GitLab 인스턴스를 사용했습니다. 애드인 빌드 및 배포에는 빌드 애드인 JSL 파일과 매니페스트 JSL 파일로 구성된 사용자 지정 솔루션을 사용했는데, 이에 대해서는 잠시 후에 자세히 설명하겠습니다. 테스트에는 JSL Hamcrest 프레임워크를 사용했는데, 이 프레임워크는 GitHub에서 찾을 수 있습니다. 저는 이 프레임워크의 공동 개발자입니다. JMP 내부에서도 JMP 자체를 테스트하기 위해 이 프레임워크를 사용하고 있으며, 이 애드인 테스트에도 사용하고 있습니다.
문서 작성에는 주로 마크다운 파일을 사용하고, 이를 Pandoc을 이용해 HTML로 변환한 후 애드인에 삽입합니다. 그런 다음 JMP 내장 웹 브라우저를 사용하여 애드인에 표시합니다. 모든 기능은 JSL과 Python, 그리고 Python의 pint 라이브러리를 통해 구현되었습니다. 그 외에도 JMP, VS Code, Git, Pandoc, Google Material Icons 등의 도구를 사용했습니다.
최상위 레벨의 애드인 구조는 다음과 같습니다. 빌드 폴더, 문서, 소스, 테스트 폴더, 그리고 README 마크다운 파일이 있습니다. 테스트 파일은 별도로 분리되어 있습니다. 빌드 폴더에는 빌드 애드인, 매니페스트 파일, 그리고 아티팩트 하위 폴더가 있는데, 이 아티팩트 폴더에는 HTML 파일과 JMP 애드인 자체가 빌드 후 저장될 파일이 있습니다. 문서 폴더에는 주로 스크린샷 등이 있습니다. 소스 폴더에는 아이콘, 메뉴 등의 하위 폴더가 있습니다. 메뉴 폴더에는 매우 간단한 액션 JSL 파일들이 있는데, 이 파일들은 JMPcust 파일에서 시작점으로 사용됩니다. 소스 폴더에는 코드의 대부분이 포함되어 있습니다. 마지막으로 JMPcust 정의 파일과 추가 로드 JSL 파일이 있습니다.
매니페스트 파일은 기본적으로 왼쪽에 있는 구조에 포함된 모든 파일 목록을 담고 있으며, 이 파일들은 최종적으로 설치될 JMP 추가 기능 아카이브에 포함될 것입니다. 빌드 추가 기능의 JSL 스크립트는 Pandoc을 사용하여 마크다운을 HTML로 변환하고, 매니페스트 파일을 읽은 후, JSL Zip Archive API를 사용하여 모든 파일을 수집하고 빌드 아티팩트 디렉터리에 있는 JMP 추가 기능 파일에 저장합니다.
새로운 기능을 추가하고 싶을 때마다 소스 아이콘 폴더에 아이콘을 넣었습니다. 소스 메뉴 폴더에는 간단한 스텁 코드를 넣고, 나머지 코드는 소스 폴더에 작성했습니다. 이 세 파일을 모두 매니페스트에 추가하고, JMP 애드인 사용자 정의 파일을 수정하여 소스 메뉴 폴더에 있는 스텁 코드를 참조하도록 했습니다. 그런 다음 애드인을 빌드하고 해당 기능 개발을 시작한 후 테스트 파일에 테스트를 추가했습니다.
소스 메뉴의 하위 메뉴는 현재 데이터 테이블을 확인하는 등의 기본적인 유효성 검사만 수행합니다. 그런 다음 메인 소스 파일을 포함하고 GUI를 호출합니다. 이렇게 분리한 이유는 메인 소스 파일을 테스트에 쉽게 포함시켜 GUI를 호출하지 않고도 해당 기능을 테스트할 수 있도록 하기 위함입니다. 메뉴를 클릭했을 때 대화형으로 실행되는 소스 메뉴와 테스트 파일을 깔끔하게 분리한 것이며, 둘 다 소스-소스 순으로 실행됩니다.
자, 마지막으로 이 추가 기능의 상당 부분이 새로운 JMP 18 Python 통합 기능을 사용하기 때문에, 그 작동 방식에 대해 자세히 설명드리겠습니다. 기본적으로 세 부분으로 구성됩니다. 첫째, 추가 기능 로드 파일입니다. 추가 기능이 로드될 때마다 Python 패키지를 설치하려고 시도합니다. pint도 그중 하나입니다. pint를 설치하고 제대로 설치되었는지 확인하세요. 그런 다음 추가 기능과 함께 설치되는 com_jmp_unitconversion.py 파일이 있습니다. 이 파일을 정규화된 이름으로 임포트하겠습니다.
기본적으로 해당 파이썬 파일에 있는 모든 내용은 함수 정의 모음일 뿐이며, 모두 pint 라이브러리를 사용합니다. 하지만 실제 작업은 없습니다. 단순히 함수 정의만 있을 뿐입니다. 핵심 JSL 코드에서는 이러한 파이썬 호출을 정규화된 이름과 파이썬 통합 기능을 사용하여 JSL 함수로 감쌉니다. 그러면 애드인의 나머지 부분에서는 오른쪽에 있는 JSL 함수를 바로 사용할 수 있습니다. 단위 변환이 가능한가요? 피트를 킬로미터로 변환할 수 있나요? 네. 피트를 밀리리터로 변환할 수 있나요? 아니요. 일반 JSL 함수를 사용하지만, 내부적으로는 파이썬 통합 기능을 통해 파이썬 코드로 전달됩니다. 모든 설정은 애드인 로드 시 완료되며, 모든 파이썬 코드는 이 하나의 패키지 안에 깔끔하게 정리되어 있으므로 전체 파이썬 네임스페이스를 오염시키지 않습니다.
JMP 18의 새로운 파이썬 통합 기능을 활용하여 물리 단위 변환 추가 기능을 개발했습니다. 감사합니다.