문제
회사에서 병원에 판매하는 제품 중 전광판이라는 안드로이드 애플리케이션이 있다. 이 애플리케이션은 두 가지 역할을 하는데
- 접수, 진료실, 상담실 등 순서대로 입장해야 하는 곳에 입장할 환자 표출
- 병동 병실 별 입원 환자 목록 표출
역할을 한다.
환자를 표출하는 로직은 의료진 선생님들께서 사용하시는 PC에서 병원 프로그램을 통해 환자 정보를 변경하면 앱으로 소켓 통신을 하게 되고 앱에선 받은 데이터를 화면에 보이게 된다.
이때 병원에 설치된 수많은 전광판마다 다르게 보여야 하는 정보가 있다. 대표적으로는 해당 전광판이 설치된 위치이다. 전광판을 설치할 땐 셋톱박스에 앱을 설치한 완제품 형태로 제공되고 셋톱박스는 고장 등의 이유로 수거가 되기도, 다른 위치에 재설치가 되기도 한다. 셋톱박스와 설치된 위치가 1:1 매핑이 되기 어렵다는 이야기다. 그런 이유에서인지 셋톱박스에서 설치된 위치를 관리하는 방법으로 메타데이터를 JSON으로 저장해 앱에서 불러오는 방식을 사용하고 있다. 이때 레이아웃도 해당 위치에 맞게 JSON으로 저장하여 앱에서 리플렉션으로 표시하는 방식이다.
하지만 안드로이드에서 레이아웃은 XML로 작성하기 때문에 레이아웃 에디터를 사용하려면 XML 레이아웃 파일을 만드는 게 편하다. 여기서 문제가 발생했다. XML 파일을 JSON으로 변환하는 라이브러리 실행 과정이 번거로운 문제였다.
라이브러리는 json2view라는 안드로이드 라이브러리를 사용하고 있었다. 해당 라이브러리는 JSON을 적절하게 View로 그려주는 라이브러리인데 XML을 JSON 으로 만들어주는 유틸 기능도 제공하고 있었다. 해당 기능을 사용하기 위해선 gradle 작업을 실행해 주어야 하는데 gradle 명령어는 다음과 같다.
gradlew -P xml=변경하고자_하는_XML.xml -P output=저장하고자_하는_JSON.json runScript
그러면 groovy 로 작성된 코드가 실행되어 File을 읽어 변환되는 구조였다.
문제상황은 크게 다섯 가지였다.
- 명령어가 실행이 안 돼요!
- java 버전 에러가 발생해요!
- 한 번에 하나의 XML만 변환하는 게 불편해요!
- 매번 파라미터를 입력하는 게 불편해요!
- XML을 변환하는 속도가 너무 느려요!
일단 1, 2번은..... 내가 해결해 줄 수 없었다. 저 명령어는 gradle이 설치가 되어야 하고 gradle에 이해도가 조금이라도 있어야 가능하다. 나도 gradle 은 잘 모르지만 빌드 태스크를 조금 건드려보면서 어림짐작으로 알 수 있었다. 일단 회사 개발 환경이 Windows 이기 때문에 프로젝트 내 gradlew.bat
를 명령어로 사용하니 잘 작동된 다는 것을 확인했다.
자바 버전도 개개인이 모두 다른 버전을 사용하며 대부분 1.8을 사용하는데, 간혹 11, 17 같은 버전을 사용하는 분들은 정상적으로 작동되지 않는 문제가 있었다.
이제 기술적으로 해결 가능한 세 가지 문제가 있었는데, 기존 라이브러리는 input, output 파일을 특정해 읽고 변환하고 저장하는 구조였다. 그도 그럴 것이 input은 어떻게든 경로를 지정해 읽어온다 해도 output은 코드에서 리소스 경로를 빌드 경로 외부로 지정하기 힘들었을 것이다. 경로를 선택해 해당 경로에 저장시켰으면 어땠을까 싶지만 어쨌든 파라미터를 입력해야 하는 번거로움은 남게 된다.
또한 매번 빌드 태스크를 실행하기 때문에 시간이 꽤 걸렸다.
하나의 XML 파일을 변환하는데 4~5초가 걸리는데 보통 한 병동의 작업을 하면 10~20개 병실에 대한 XML 작업을 해줘야 한다. 만약 병동이 여러곳이라면 *N 만큼 더 걸리는 것이다.
해결 방안
이런 문제들을 해결하고자 나는 jar 파일로 여러 파일을 변환할 수 있도록 개선하고자 했다. 사실 구현 자체는 큰 어려움이 없이 XML을 읽고 DocumentPaser
를 통해 객체로 변환 후 ObjectMapper
로 다시 직렬화 해주는 작업이 전부이다.
하지만 결과는 대단했다.
ObjectMapper
를 사용하기 위해 fatJar 로 빌드했음에도 빌드 속도는 평균 3초 정도로 줄였다.
또한 XML을 변환하는 작업은 (체감상) jar 실행 기준 0.1초 이내로 완료되었다. 명령어 또한 입력할 필요 없이 Windows 에서 JDK 만 설치 되었다면 더블 클릭으로 실행 되도록 구현하여 작업 편리성을 매우 높였다고 생각 한다.
애초에 jar 파일로 공유하였지만, 사용자가 매번 jar를 생성한다고 가정해도 기존 방법대로 한번 실행(4~5초) 할 시간 동안 100개가 넘는 파일을 변환할 수 있다고 생각 한다.
개인적으로는 사소하더라도 누군가에게 불편함이었던 작업을 프로그래밍으로 해결할 수 있다는게 개발의 큰 장점이라 생각한다.
소스 코드: Github