[Maya] AssetManager 리팩토링
Maya 용 인하우스 툴, AssetManager를 리팩토링했습니다. AssetManager 툴은 약 1년 전부터 여러 명이 돌아가며 개발 및 유지보수를 해왔던 툴이기 때문에 코드 구조가 점점 복잡해지고 비효율적이게 되었습니다. 10월 1주차에는 AssetManager의 코드 전반을 정리하고 리팩토링을 했습니다. 리팩토링 내용은 다음과 같습니다.
[DOTORI] Asset 등록 RestAPI 추가
DOTORI는 영화 CG 작업에 사용할 Asset들을 저장해두는 툴로, RD101에서 지난 1년간 개발해온 웹 어플리케이션입니다. DOTORI는 서버 자원에 접근하는 수단으로 Browser 뿐만 아니라 Shell Command, RestAPI 또한 지원하고 있습니다. 10월 2주차에는 Dotori에 RestAPI를 통해 Asset을 등록하는 기능을 추가했습니다.
RestAPI를 통해서 Asset을 등록한다는 것은 HTTP 프로토콜을 통해서 Binary 데이터(Asset)과 Ascii 데이터(Asset 관련 정보)를 함께 DOTORI 서버로 전송해준다는 의미입니다. 이때 사용자가 RestAPI를 통해 서버로 Asset 등록 요청을 하면 서버가 요청 데이터 중 파일은 Storage로, asset 관련 정보는 DB에 저장해주는 기능을 수행해야 합니다. 따라서 HTTP 프로토콜 헤더에 binary+ascii 데이터를 동시에 전송할 수 있게끔 content-type(데이터인코딩 방식)을 정의하고 POST 요청을 보냈을 때 해당 기능이 작동되게끔 하였습니다.
[DOTORI] 즐겨찾기 기능 추가
DOTORI에 Asset 즐겨찾기 기능을 추가했습니다. 사용자가 즐겨찾는 Asset 정보를 DB에 남겨놓고 해당 Asset은 북마크 표시를 해두는 기능입니다. 수행 과정은 다음과 같습니다.
[APPS] 통합 프로그램 개발
현재 RD101 사원들은 Bash를 통해 작업 소프트웨어(Maya, Nuke, Houdini 등 그래픽 작업 툴)를 실행하고 있습니다. 시스템팀에서 개발한 인하우스 툴들을 사용하기 위해서는 중앙서버를 가르키고 있는 환경변수가 지정되어 있어야 하기 때문입니다. 예를 들어, PYTHONPATH라는 환경변수가 '/rd101/mainstorage/td/maya' 라는 공용 서버를 가르키고 있어야 Maya 프로그램 내의 인하우스 툴이 정상 작동합니다. 따라서 각 사원들의 PC의 bash shell마다 해당 환경변수를 바라보게끔 설정해두고, Bash shell을 통해서 해당 소프트웨어를 실행하게끔 하고 있습니다. 하지만 Bash는 일반 사용자에게는 친숙하지 않고 OS 의존성이 강하기 때문에 이를 대체할 수 있는 툴, APPS를 개발하고 있습니다.
'APPS'는 Cross-platform 지원을 위해 Desktop Application이 아닌 Web Application으로 개발 진행 중입니다. 환경변수 기능 지원은 사내 프로토콜 개발과 함께 진행돼야 하기 때문에 우선 Web-Base 인하우스 툴만 모아져있고 버튼을 누르면 해당 URL로 리다이렉트 시켜주는 기능만 추가돼있는 상태입니다.
[Maya] AssetManager 버그 처리
AssetManager에서 발생하는 각종 버그들을 처리하였습니다.
Maya에 Asset을 reference 기능을 통해 불러올 때, 올바르지 않은 경로에서 불러오는 버그가 있었습니다. 또한 'Not Import Alembic' 버튼을 누르면 기능이 멈추는 등 특정 옵션 선택에 따라 어플리케이션 수행이 멈추는 경우가 있어 해당 사항들을 수정하였습니다.
[DOTORI] 즐겨찾기 기능 배포
지난 달 개발 완료하였던 DOTORI의 즐겨찾기 기능을 배포하였습니다. 이후 발생하는 버그 또한 처리하였습니다. 처리 내용은 다음과 같습니다.
[DOTORI] 즐겨찾기 기능 버그 수정
DOTORI 메인 페이지에는 어셋들을 슬라이딩하며 보여주는 기능이 있습니다. 페이지가 스위칭 될 때 불규칙적으로 즐겨찾기 아이템인지 판단을 못하고 아이콘을 채워주지 못하는 버그가 발생했습니다. 알아본 결과, js 를 이용한 ajax가 비동기식 처리라는 점을 간과하고 프로그래밍 했다는 사실을 알았고 해당 사항 수정하고 배포하였습니다.
[WORKTIME] 아티스트 업무 시간 관리 시스템 개발 환경 구축
WORKTIME은 사원들의 근무시간을 조회하는 웹서비스입니다. 현재 우리 회사에서 근무 시간을 기록하는 방법으로는 2가지가 있습니다.
Shotgun에 남기는 타임로그는 결산 시 흑자인지 적자인지 구분하는 기준(인건비)이 되기 때문에 정확히 기록하는 것이 매우 중요합니다. 이 때문에 PM 팀에서 사원 마다 타임로그를 매주 확인하고 틀리게 작성했다면 개인적으로 연락을 취해 수정해야 하는 번거로운 문제가 발생합니다.
이런 배경으로 사원틀의 출퇴근 기록을 통해 근무 시간을 타임로그와 비교하여 조회할 수 있는 툴을 만들게 되었습니다.
backend 언어는 golang, DB는 MongoDB를 사용하기로 하고 서버에 개발환경을 구축하였습니다.
[WORKTIME] 세콤 데이터 내부 서버로 매일 업데이트해주는 기능 추가
세콤 출퇴근 기록은 외부 서버에 저장되있습니다. 해당 데이터를 하루에 한 번 .txt
파일로 뽑은 후 cron 서비스를 이용해서 자동으로 내부 MongoDB 서버로 업데이트해주는 기능을 개발하였습니다. go를 통해 데이터를 쿼리해주는 명령어를 만들어두고 cron 서비스가 worktime -addsecomdata
라는 명령어를 하루에 한 번 실행하게 세팅해둠으로써 Daily Update 기능을 구현하였습니다.
[WORKTIME] 메인 페이지 개발
url 파라미터에 startdate=2020-10-01&enddate=2020-10-31
형식으로 입력하면 입력한 날짜에 해당하는 출퇴근 기록을 페이지에 테이블로 출력해주는 페이지를 개발했습니다. Table은 무료 오픈 소스라이브러리인 'DataTables'를 사용함으로써 검색 기능, 페이징 기능, 정렬 기능 등을 손쉽게 구현할 수 있었습니다.
[APPS] 로그인 기능 추가
APPS에 로그인 기능을 추가하였습니다. 사내 모든 플랫폼은 접속할 때 반드시 APPS를 거쳐가야합니다. APPS를 통해 로그인 해야 해당 플랫폼에 접속할 수 있기 때문입니다. 예를 들어, worktime.rd101.co.kr이라는 url을 통해 WORKTIME 툴에 접속했을 때 APPS에 대한 로그인 정보를 체크합니다. APPS에 대한 로그인 정보가 올바르다면 그대로 정상 접속이 되고 없거나 올바르지 않다면 apps.rd101.co.kr/user/signin'으로 리다이렉트 되어, 로그인을 하게끔 합니다. 로그인 정보에 대한 체크는 브라우저의 쿠키와 JWT Token을 이용했습니다. APPS에서 생성한 Token을 쿠키에 넣어두고, 해당 쿠키를 통해 로그인 정보를 체크하는 방식입니다.
[MAYA] AssetManager v1.0.0 배포
Maya AssetManager를 업데이트하였습니다. 지난 10월에 있었던 리팩토링 이후 발생한 버그들을 처리하였으며 사용자에게 피드백 받은 내용을 반영하여 수정하였습니다.
업데이트 내용은 다음과 같습니다.
[WORKTIME] MongoDB 연결 코드부 리팩토링
웹어플리케이션 WORKTIME(사원 근무시간 조회 툴)은 Backend로 Go언어를 사용하였고 MongoDB를 이용하여 데이터를 저장하고 있습니다. 이는 Go언어를 통해 MongoDB로 접근하는 작업이 어플리케이션 전반에 걸쳐 계속 발생한다는 것을 의미합니다.
WORKTIME의 코드를 점검하던 과정에서 MongoDB로의 연결 부분에서 불필요한 connection이 계속해서 발생한다는 사실을 알게되었고 이를 리팩토링하였습니다. 기존에는 데이터베이스로의 접근이 발생할 때마다 connection을 생성해주고, 접근이 끝나면 바로 disconnect 하는 방식이었습니다. 리팩토링 후에는 DB로 접근하는 함수가 실행될 때만 connection을 생성해주고, go언어의 defer 구문을 이용해 함수가 종료될 때마다 disconnect를 해주는 방식으로 수정하였습니다.
[WORKTIME&APPS] 디자인 수정
12월 3주차에는 담당하고 있는 웹어플리케이션의 디자인을 전체적으로 수정하였습니다. 기존에는 디자인보다는 기능에 우선 집중하였기 때문에 HTML과 기본적인 css만을 이용하여 UX를 구성했습니다. 기능 구현이 거의 완료된 시점인 3주차에 웹어플리케이션들의 UX를 전반적으로 수정하였습니다. 프론트 개발 경험은 거의 없었기 때문에 우선 html, css, javascript 기초를 공부한 후 진행했습니다.
[DOTORI] DOTORI로의 Assets 이동 작업 자동화
사내 Asset Library 툴 DOTORI가 도입되면서 기존 Asset 들을 DOTORI로 옮기는 작업이 필요해졌습니다. DOTORI가 개발되기 전에는 스토리지에 asset을 카테고리 별(Fire, Cow, desk, etc..)로 폴더를 구분하여 저장해둠으로써 관리하였습니다. 이러한 기존 Asset들을 DOTORI로 옮긴다는 것은 다음과 같은 2가지 작업이 필요하다는 것입니다.
옮겨야하는 Asset들은 무려 100,000개 가량 되었고 용량은 약 40TB였기 때문에 위 작업을 전부 수동으로 하는 것은 불가능했습니다. 따라서 기존 Asset 폴더구조에서 규칙성을 찾아 소스 이동 작업을 최대한 자동화 할 수 있는 프로그램을 개발하였습니다. python으로 개발된 이 프로그램은 실행할 때 경로를 입력해주면 해당 경로 하위의 Asset은 전부 DOTORI로 옮겨주게 함으로써 소스 이동 작업을 자동화하였습니다.
[DOTORI] DOTORI로의 Assets 이동 과정 중 발생한 버그 처리
DOTORI로 이동해야하는 Asset의 대부분은 시퀀스 형식의 Footage들이었습니다. 하지만 내부 DOTORI 서버에 Footage 타입의 어셋을 업로드 썸네일 생성을 하지 못하고 에러를 리턴하는 이슈가 발생했습니다.
Footage를 업로드할 때는 시퀀스를 이용하여 Asset의 썸네일을 자동으로 생성해줍니다. 썸네일 생성 과정은 다음과 같습니다.
1. Footage 시퀀스를 DOTORI에 업로드한다.
2. DOTORI 웹서버는 업로드된 Footage 시퀀스를 찾아 프록시 시퀀스로 변환한다.
3. 프록시 시퀀스를 썸네일 용 mov 영상으로 변환한다.
디버깅 결과, 위 과정 중 2번에서 에러가 발생한 것이었습니다. 2번 변환은 OpenImageIO라는 오픈소스 이미지 변환 툴을 이용하였는데 내부 서버에 설치된 OIIO의 버전이 너무 낮기 때문에 생긴 문제였습니다. 따라서 Github에 오픈된 OIIO 최신 버전 소스코드를 직접 다운 받아 빌드함으로써 버전을 업그레이드 한 후 서버에 적용하여 문제를 해결하였습니다.