저희는 100명 이상의 사용자가 이용하는 JMP 추가 기능이 여러 개 있습니다. 이러한 추가 기능을 사용하려면 JMP, Oracle ODBC 클라이언트, 그리고 사용자 지정 메뉴가 필요합니다. 처음에는 각 사용자의 PC에 개별적으로 추가 기능을 배포했는데, 이 때문에 JMP와 Oracle을 설치하고 ODBC 드라이버와 추가 기능 메뉴를 구성해야 했습니다. 매주 누군가의 하드 디스크가 고장 나거나 PC를 재설치해야 했기 때문에 유지 관리 측면에서 악몽과 같았습니다.
이러한 부담을 줄이기 위해 Citrix 서버를 사용하여 JMP와 추가 기능을 실행하기로 했습니다. 현재 Citrix에서 Microsoft 원격 데스크톱 프로토콜(RDP)로 전환하는 중입니다. 전환의 이점은 다음과 같습니다.
이 강연에서는 서버 설정, 보안, Oracle 구성, JMP 추가 기능 구성, 코드 유지 관리, 그리고 사용자가 Citrix 또는 RDP에서 파일을 저장하는 방법에 대한 자세한 내용을 제공합니다.
제 이름은 피터 므르즈입니다. 존슨앤존슨에서 근무하고 있습니다. 오늘은 서버 JMP와 그것이 제 세상을 어떻게 구했는지에 대해 이야기하려고 합니다. 화면 공유 부탁드립니다.
안녕하세요, 저는 피터 므르즈입니다. 존슨앤존슨 혁신의약국 소속입니다. 오늘은 제가 JMP 서버와 추가 기능을 활용하여 어떻게 세상을 구했는지에 대해 이야기하려고 합니다. 일반적인 고지사항이지만, 이 발표는 제 개인적인 견해이며, 존슨앤존슨의 어떤 제품에 대해서도 공식적인 보증을 의미하는 것은 아닙니다.
저희는 누구일까요? 바로 존슨앤존슨 이노베이션 메디신입니다. 저희의 목표는 개인의 삶을 변화시키고 우리 시대의 가장 중요한 미충족 의료 요구를 해결하는 혁신적인 의약품과 솔루션을 발견하고 개발하는 것입니다. 제가 속한 부서는 글로벌 의료 안전팀입니다. 저희는 강력한 의료 안전 기준을 준수하고 유익성-위험성 평가를 수행하여 환자를 보호하는 임무를 맡고 있습니다.
저희 그룹은 '방법 및 분석'이라고 하며, 목표는 안전성 신호를 감지하고 평가하는 데 있어 효율성과 분석 능력을 향상시키는 분석 도구를 개발하고 구현하는 것입니다. 간단히 말해서, 저희는 존슨앤존슨의 대부분의 의약품에 대한 안전성 데이터를 수집, 처리, 보고 및 분석합니다. 제 팀원들은 오른쪽에 계십니다. 여기 제가 보이시죠. 이 아이들은 제 손주 넷인데, 맨 아래 사진에는 갓 태어난 손녀가 있습니다.
오늘 우리가 다룰 내용은 무엇일까요? 먼저 문제점과 해결책에 대해 이야기하고, 서버 환경에 대한 자세한 설명, 보안, Oracle 구성 방법, JMP 추가 기능 구성 방법, 코드 유지 관리 팁, 그리고 사용자가 Citrix 또는 RDS에서 파일을 저장하는 방법에 대해 설명하겠습니다. 우리가 직면한 문제는 100명 이상의 사용자가 사용하는 여러 JMP 추가 기능이 JMP, Oracle 연결, 그리고 사용자 지정 메뉴를 필요로 한다는 것이었습니다. 처음에는 각 PC에 추가 기능을 개별적으로 배포했습니다. 즉, 각 PC에 JMP, Oracle, ODBC 드라이버 구성, 그리고 추가 메뉴 자체를 설치해야 했습니다. 이 방법은 작동은 했지만 유지 관리 측면에서 악몽과 같았습니다. 매주 누군가의 하드 디스크가 고장 나거나, PC를 재설치하거나, 아무것도 설치되지 않은 새 컴퓨터를 받는 등 많은 문제가 발생했기 때문입니다. 정말 많은 작업량이 필요했습니다.
저희는 JMP와 추가 기능을 실행하기 위해 Citrix 서버를 사용하기 시작했습니다. 현재 Citrix에서 Microsoft 원격 데스크톱 서비스(RDS)로 전환하는 중인데, 기본적으로는 같은 기능입니다. 장점은 설정을 한 번만 하면 된다는 점입니다. 해외 사용자와의 화면 교환만 이루어지기 때문에 성능이 매우 뛰어납니다. 데이터를 전송할 때를 제외하고는 데이터를 저장하지 않습니다.
보안 수준이 한층 강화되었습니다. 변경 사항이 발생하면 사용자별이 아닌 서버별로 한 번씩 배포됩니다. RDS로 전환하는 이유는 Citrix보다 가격이 저렴하고, Windows의 구성 요소이며, 원격 데스크톱 프로토콜(RDP)을 사용하고, 이를 위해서는 Microsoft 컴퓨터 액세스 라이선스가 필요하기 때문입니다.
여기가 저희 환경입니다. 오라클 데이터베이스가 있고, 현재 시트릭스 서버 세 대가 있는데, 곧 RDS로 전환될 예정입니다. 이 서버들은 JMP를 실행하고 있습니다. 사용자들은 웹 링크를 통해 서버에 접속하고, 서버에서 실행되는 JMP가 결과를 사용자 화면으로 전송합니다.
시트릭스는 서버 애플리케이션부터 데스크톱 가상화, 네트워킹, 서비스형 소프트웨어(SaaS) 및 클라우드 컴퓨팅 기술을 제공하는 미국의 다국적 클라우드 컴퓨팅 및 가상화 기술 기업입니다. 마이크로소프트의 원격 데스크톱 서비스(RDS)는 애플리케이션 가상화를 제공합니다. 드라이브와 프린터를 매핑할 수 있습니다. RDS는 마이크로소프트가 개발한 독자적인 프로토콜로, 사용자가 네트워크 연결을 통해 다른 컴퓨터에 연결할 수 있는 그래픽 인터페이스를 제공합니다. 사용자는 RDS에 내장된 클라이언트 소프트웨어를 사용하고, 호스트 컴퓨터는 RDS 서비스 소프트웨어를 활성화해야 합니다.
저희는 여러 대의 서버를 사용하고 있으며, 로드 밸런싱이 적용되어 있습니다. RDS 구성에 대해 간단히 설명드리자면, RDS에 대한 기술적인 설명은 이 정도가 최선입니다. 연결 포털을 통해 로드 밸런싱에 사용할 서버를 선택할 수 있습니다. RDS용 웹 프런트엔드는 별도의 서버에 설치되어 있으며, RDS 위에 구축된 구성 요소입니다. 이 프런트엔드는 사용자가 이용할 수 있는 애플리케이션 목록을 보여줍니다. 다음은 사용자가 이용할 수 있는 몇 가지 애플리케이션이며, 웹 페이지는 Microsoft IIS를 사용합니다. 이 정도면 RDS 또는 Citrix를 회사에 도입하기에 충분한 기술적인 내용이며, IT 부서와 상담하시는 것이 좋습니다.
보안을 위해 저희는 ID 관리 시스템(Identity Management System)이라는 것을 사용합니다. 사용자가 권한을 요청하면 개발, QA 또는 프로덕션 그룹에 할당됩니다. JMP는 개발, QA 또는 프로덕션 그룹에 대한 접근 권한이 있는 경우에만 실행할 수 있습니다. 또한, 애드인, 사용자, 역할 목록을 관리하는 Oracle 테이블이 있으며, 각 애드인에서 각 사용자에 대해 다양한 보안 수준을 설정할 수 있는 커넥터가 있습니다. 그리고 관리자 계정을 사용하여 서버에 원격으로 로그인하여 유지 관리를 수행합니다. 이제 Oracle 구성에 대해 이야기해 보겠습니다.
서버에 Oracle 클라이언트를 설치해야 하고, 두 개의 환경 변수가 필요합니다. 하나는 Oracle 클라이언트의 위치를 나타내는 Oracle Home이고, 다른 하나는 TNSNAMES.ORA 및 SQLNET.ORA 파일의 위치를 나타내는 TNS_ADMIN입니다. TNSNAMES.ORA 파일에는 모든 데이터베이스의 별칭이 포함되어 있으며, Oracle이 이러한 데이터베이스를 찾을 위치를 지정합니다. ODBC 연결에 사용할 Oracle 드라이버의 이름을 확인해야 합니다. 가장 쉬운 방법은 Windows 키를 누른 다음 ODBC를 선택하고 64비트 ODBC 데이터 원본을 선택하는 것입니다. 드라이버 탭을 클릭하면 Oracle 드라이버 이름(Oracle in OraClient19Home1)이 표시됩니다.
이 Oracle 드라이버 이름을 사용하여 어떻게 연결하나요? 다음은 간단한 JSL 스크립트입니다. tns_alias라는 것이 있는데, 제 데이터베이스 이름입니다. TNSNAMES.ORA 파일에 그렇게 나와 있습니다.
그다음은 커넥터 텍스트인데, DBQ는 제 TNS 별칭입니다. 여기에 제 사용자 이름과 비밀번호가 있습니다. 그다음은 드라이버 텍스트이고, 그다음은 OraClient19Home1에 있는 제 Oracle 클라이언트입니다. 이 부분을 찾기가 어려울 수 있는데, 찾는 데 유용한 팁입니다.
그다음 이 두 문자열을 결합하여 DSN 문자열을 만들고, 이를 사용하여 데이터베이스 연결을 생성한 후 변수 1 DBC에 할당합니다. 모든 과정이 완료되면 커넥터 문자열은 다음과 같습니다. 이 연결을 사용하여 SQL을 실행하려면, execute_sql 함수를 커넥터와 간단한 SQL 문과 함께 호출한 후 데이터베이스 연결을 닫으면 됩니다. JMP 추가 기능은 어떻게 구성하나요? 서버에 Jump를 설치한 다음, 해당 디렉터리에 추가 기능 폴더를 생성해야 합니다.
C:\ProgramData\SAS\JMP\addIns. 대소문자를 구분해야 합니다. 즉, P, D, I 모두 대문자여야 합니다. JMP 지원팀과 여러 번 연락한 끝에 I, P, D 모두 대문자라는 것을 알아냈습니다. 이 부분을 제대로 확인하고 나니 정상적으로 작동했습니다.
저희는 폴더 이름에 애드인 "ID"를 사용합니다. 여기 원격 서버에 있는 5개의 애드인 예시를 보실 수 있습니다. 각 폴더에는 addin.def 파일 하나만 들어 있습니다. 다음은 addin.def 파일의 예시입니다.
ID는 애드인(com.jnj.gms.pv-analyze-prism)의 별칭을 나타냅니다. 이름, 홈 위치, 그리고 최소 점프 버전이 있습니다. 여기서 홈 위치란 무엇을 의미할까요? 홈 위치는 애드인의 모든 JSL 스크립트가 저장되는 곳입니다.
여기 이 폴더가 있고, 그 안에 제 JSL 스크립트들이 모두 들어있습니다. addin.jmpcust 파일에는 애드인 메뉴가 저장되어 있습니다. 저희가 만드는 모든 애드인은 사용자 지정 메뉴를 사용합니다. 메뉴에 대해 좀 더 자세히 알아볼까요? 저희는 적절한 보안 권한이 없는 사용자는 메뉴 옵션을 실행할 수 없도록 설정했습니다.
각 메뉴 항목은 프로그램을 가리키는 전역 변수를 선언하며, 여기에는 보안 검사를 위한 실행 프로그램도 포함됩니다. 이를 확인하려면, [보기]를 클릭하고 [메뉴 및 도구 모음 사용자 지정]을 클릭한 다음, 오른쪽 상단의 [변경]을 클릭하고 [JMP 추가 기능]을 선택한 후 원하는 추가 기능을 선택하고 [확인]을 클릭합니다. 이제 해당 추가 기능의 메뉴가 활성화됩니다. 여기에서 항목을 변경할 수 있습니다. 다음은 일반적인 메뉴 항목의 예입니다. 저는 실행할 프로그램([datatable.jsl] 열기)을 가리키는 전역 변수를 사용했습니다.
이 데이터 추가 기능 홈 폴더에는 ID가 포함되어 있으므로 JMP에 따로 알려줄 필요가 없습니다. 실제 하드 디스크 위치를 지정할 필요도 없죠. JMP는 여기서 추가 기능의 ID를 가져와서 addin.dev 파일에서 디코딩합니다. 두 번째 줄은 launch_pva_menu.jsl 스크립트를 포함하라는 뜻입니다. 이 스크립트가 메뉴의 액션 부분을 담당하는 코드입니다. 이 JSL 파일을 실행하기만 하면 됩니다. 또한, 추가 기능 홈 폴더(com.jnj.gms.pv-analyze-prism)를 사용하도록 설정해야 합니다. 다음은 실행 프로그램입니다. 데이터베이스 접근 스크립트를 포함한 몇 가지 함수를 포함하고 있습니다. 그리고 유효한 PPA 사용자를 호출합니다.
이 프로그램은 Oracle 보안 테이블에서 사용자를 조회합니다. 테이블에 사용자가 제대로 등록되어 있지 않으면 오류 메시지가 표시되고 프로그램이 종료됩니다. JMP 버전에 따라 필요한 기능이 다릅니다. 아마도 addin.dev 파일에 최소 JMP 버전 요구 사항이 명시되기 전에 작성된 것 같거나, 아니면 제가 그 사실을 몰랐던 것 같습니다.
어쨌든, 그 단계를 통과하면 프로그램 이름에 뭔가 있는지 확인합니다. JMP 앱 확장자가 포함되어 있으면 애플리케이션 빌더 프로그램이므로 해당 프로그램을 엽니다. 그렇지 않으면 JSL 스크립트이므로 포함시킵니다. 코드 유지 관리를 위해 개발, QA, 운영의 세 가지 환경이 있으며, 개발용 서버 1대, QA용 서버 1대, 운영용 서버 3대를 사용합니다.
유효성 검사가 완료되면 업데이트된 파일이 관련 서버로 복사됩니다. 저는 Total Commander라는 프로그램을 사용하여 이러한 폴더를 동기화하는데, 잠시 후에 보여드리겠습니다. Citrix와 RDS는 약간 다릅니다. 실제로 파일에 액세스하는 방식은… 적어도 저희는 OneDrive라는 것을 사용합니다. 완전히 다르죠.
서버의 바탕 화면이나 문서 폴더에 JMP를 설치하면 서버 자체에 저장되는데, 이는 허용되지 않습니다. 이를 해결하기 위해 파일 환경설정 > 파일 위치를 클릭합니다. 그런 다음 데이터 파일 디렉터리와 다른 이름으로 저장 디렉터리 모두에 OneDrive 위치를 지정합니다. Citrix와 RDS의 경로는 약간 다릅니다. Citrix는 Client\C$이고, RDS는 tsclient\C입니다.
하지만 나머지는 사용자 이름, OneDrive, JNJ입니다. JNJ는 저희가 지정한 OneDrive 위치입니다. 이후부터는 파일을 열거나 저장할 때마다 기본적으로 서버에 저장하려고 시도하지 않고 OneDrive에 저장됩니다.
간단한 데모를 해 보겠습니다. 여기로 이동하세요. 여기가 RDS 로그인 화면입니다. 로그인하겠습니다. RDP 파일이 생성되어 실행됩니다. 여기에서 마우스 오른쪽 버튼을 클릭하면 "이 유형의 파일을 항상 열기" 옵션이 선택되어 있어야 합니다. 지금 연결 중입니다. 개발 인스턴스에서 JMP 서버가 실행되고 있고, 데이터를 열어볼 수 있습니다. 이제 배포를 실행해 보겠습니다.
이제 저장하겠습니다. 제 OneDrive에 저장될 거예요. 'temp'라는 폴더에 넣을게요. 좋아요. 이제 하드 드라이브에 저장됐습니다. 아직 저장 중인 것 같네요. 제 컴퓨터에 JMP가 로컬로 실행되고 있는데, 이 파일을 클릭해서 드래그하면 어떻게 되는지 볼게요. 여기 있네요. 서버에서 생성했는데, 제대로 작동하는지 확인하는 방법이 필요했어요.
알겠습니다. 또 하나 보여드리고 싶었던 건 서버 자체입니다. 지금 저는 RDS 서버에 로그인한 상태입니다. 여기에는 JMP 16과 JMP 18이 설치되어 있고, 제가 사용하는 유틸리티인 Total Commander도 실행되고 있습니다.
서버로 복사할 파일이 있을 때의 예시를 보여드리고 싶었습니다. 파일 공유 환경에서 진행인데요. D 드라이브는 이 특정 애플리케이션의 추가 기능(Add-In)이 있는 위치입니다. 여기 있는 버튼을 눌러 디렉터리를 동기화하고, 비교한 다음 날짜순으로 정렬해 보겠습니다. 업데이트할 파일이 몇 개 있는 것 같네요.
저는 하나만 해볼게요. 제가 가장 좋아하는 기능 중 하나는 여기서 마우스 오른쪽 버튼을 클릭하고 '왼쪽과 오른쪽 비교'를 선택할 수 있다는 거예요. 간단한 수정이었죠. 주석이 잘못된 위치에 있었는데, 여기 제대로 된 위치에 옮겨 놓았습니다. 동기화하려면 '동기화'를 클릭하면 됩니다. 필요한 항목을 복사하면 되고요. 끝입니다. 서버 JMP에 대해 제가 보여드리고 싶었던 건 이게 전부입니다. 이제 프레젠테이션으로 돌아가죠. 결론적으로, 서버에서 JMP를 실행하는 것은 애드인 개발에 매우 유용합니다. 한 번만 설정하면 되니까요.
해외 사용자들의 성능은 탁월합니다. 보안 수준이 한층 강화되었고, 변경 사항은 사용자별이 아닌 서버별로 한 번씩 적용됩니다. 기본적으로 JMP 서버와 추가 기능 덕분에 저희 회사가 위기를 극복할 수 있었습니다. 정말 감사합니다.