1. 대학 졸업 후 첫 프로젝트

내가 대학 졸업후 처음 입사한 회사는 아이토닉(Itonic)이라는 곳이었다. 뭐하는 곳이냐면 3D 컨텐츠 영상을 제작할 수 있는 클로즈업(Kloseup)이라는 서비스를 운영하는 회사였다. 나는 원래는 게임개발자를 꿈꿨고 수많은 게임회사들에 이력서를 냈지만, 번번히 면접에서 탈락하고 방향을 전환하여 그럼 3D 관련 서비스를 하는 회사에서 경험을 쌓고 게임업계로 이직하자라는 생각으로 이 회사에 이력서를 냈고 합격하게 되었다. 물론 인생은 생각되로 되지는 않았지만…

아무튼 이렇게 입사한 회사에 개발자는 개발팀장님을 포함하여 3명이었고, 나와 또 동시기에 입사하게 된 1명이 더 추가되어 5명이 되었다. 나와 입사동기였던 형은 석사 출신이라 회사에서 진행하던 국가연구과제 프로젝트를 맡게 되었고, 기존의 개발팀 3명은 위에서 언급한 클로즈업 서비스를 유지/보수 및 추가기능을 개발하느라 여력이 없었다. 덕분에 개발팀에서 나에게 신경써 줄 사람도 없고 당장 맡은 일도 없는데 개발 첫날부터 야근한 건 정말 지금 생각하면 어이가 없긴 하다.

이렇게 혼자 낙동강 오리알처럼 붕 떠 있는 상황에서 나에게 명령이 하달되었다. ffmpeg이라는 라이브러리를 이용하여 이미지들을 동영상으로 변환하는 프로그램을 만들라는 것이었다. 나에게 주어진 자료는 클로즈업 소스와 ffmpeg의 샘플소스 사이트 주소. 이때야 개발경험이라곤 학교 수업과제나 소모임에서 프로젝트 했던 것과 대학교 4학년때 입사한 슬롯머신 회사에서 슬롯머신 게임만든 정도밖에 없는 비루하였던 쌩초짜 개발자였지만 일단 떨어진 명령이었기에 명령대로 개발에 착수하기 시작하였다. 다행히 기존 클로즈업 소스에 찾던 기능과 거의 같은 기능을 찾았기에 큰 문제없이 며칠내에 개발하게 되었다. 하지만 이게 장대한 프로젝트의 시작일 줄은 몰랐었다.

2. 프로젝트가 점차 모습을 드러내다.

다음으로 주어진 명령은 이미지에 텍스트를 합성하여 동영상을 생성하라는 것이었다. 역시 클로즈업에 비슷한 기능이 존재했다. 이 기능을 구현하기 위해 XImage라는 라이브러리를 동원하였고 해당 라이브러리의 기능으로 이미지에 텍스트를 합성하였고, ffmpeg으로 동영상을 생성했다.

그 다음은 동영상에 브금을 합성하라는 명령이었다. 역시나 클로즈업 소스를 참조하여 개발하였다. 하지만 여기서 처음으로 난관을 만나게 되었다. 동영상의 이미지소스의 프레임에 맞춰서 사운드소스를 밀어넣는데 둘의 프레임이 맞지않아 사운드가 늘어지는 것이었다. 결국 클로즈업 소스와 ffmpeg 관련 사이트들을 열심히 검색해서 겨우겨우 싱크를 맞추는 데 성공하였다.

여기까지 만들어 진 것이 내가 맡게 될 프로젝트의 핵심적인 기능을 가진 프로그램이었다. 물론 내가 개발한 것은 MFC를 이용한 윈도우즈 프로그램이었고, 프로젝트는 웹서비스를 기반으로 하기에 서버에 서비스형태로 적재되어야 했다. 물론 난 서비스 프로젝트를 빌드해본 적이 없기에 MFC 프로젝트 그대로 가져갔고, 이는 뒤에 나의 발목을 붙잡게 되었다.

3. DB의 구축

이제 다음으로 구현해야 될 기능은 DB에 메세지를 인풋하면 그 메세지를 읽어서 동영상을 빌드하는 기능이었다. 여기서 DB스키마를 혼자서 짜게 되었는데 학교에서 DB를 배우긴 했지만 정규화 같은 건 머릿속에서 깨끗히 잊어버린 나는 그냥 기분내키는 대로 DB를 짜기 시작하였다. 메세지가 입력되는 말풍선 영역이 동영상에는 최대 3개까지 존재하며, 각각의 영역위치와 몇번째 프레임부터 몇번째 프레임까지 말풍선이 존재하는 지의 정보가 있었다. 여기서 나는 다음과 같이 스키마를 구현했다.

동영상 Seq / 말풍선1 영역 / 말풍선2 영역 / 말풍선3 영역 / 말풍선1 프레임 / 말풍선2 프레임 / 말풍선3 프레임 /

심지어 말풍선의 영역정보와 프레임은 스트링으로 &을 기준으로 한개의 스트링으로 엮어놓은 모양새였다. 지금은 하라고 해도 거부할 확장과 차후 유지보수는 개뿔도 생각 안 한 구조이지만, 그때는 머리가 이렇게밖에 안 돌아갔다. 그래도 어쨋든 원하는 대로 돌아가게 되었고, 심지어 PC에서 여러개의 동일한 프로그램을 돌려 스트레스 테스트까지 하는 별 짓을 다하였다.

프로그램은 사용자의 메세지가 들어오는 테이블을 열심히 와칭하다가 메세지가 들어오면 해당 로우를 땡겨오고 스테이터스를 작업 중으로 바꿔주고 동영상을 생성후 스테이터스를 완료로 바꿔주는 구조였다. 그런데 여기서 또 문제가 발생하였다. 프로그램은 스테이터스가 대기중인 로우중 가장 위의 로우를 땡겨오도록 되어있는데, 여러개의 프로그램을 돌리니 와칭주기가 거의 같다보니 같은 로우를 땡겨오고 같은 동영상을 만드는 것이었다. 여기서 팀장님께 조언을 구했는데, 일단 메세지를 땡겨온 뒤 해당 메세지의 아이디와 스테이터스가 대기 중인 녀석을 작업 중으로 변환하는 쿼리를 날리고, 성공한 녀석만 작업을 하도록 하게 하라고 하셨다. 팀장님 말씀대로 했더니 다행히 같은 로우를 땡겨오는 문제는 해결되었다.