최고 품질의 상품들을 지금보다 더 많은 소비자들이 여러 유통 채널에서 더욱 폭 넓고 쉽게...
1. 게임산업에 관심을 가지게 된 계기와 넷마블에 지원하게 된 동기를 구체적으로 서술하여 주십시오.
게임이 가져다준 꿈
제가 학부 생활 동안 겪은 다양한 프로젝트는 저를 자연스럽게 게임과 이어주었고, 게임 개발자의 꿈을 갖게 해주었습니다.
경복궁 현장학습 효과를 높이기 위해 경복궁에 방 탈출 게임의 오락성을 가미한 교육용 안드로이드 앱을 만든 적이 있습니다. 여기에 AR 기술을 접목하고 싶었으나 AR 분야에 대한 지식 및 기술력 부재와 시간적 한계로 이를 미루게 되었습니다. 앞선 프로젝트를 마치고 AR 기술을 사용하기 위해 유니티 엔진을 공부했고 이듬해 자유 프로젝트 과목에서 AR을 활용해 두 번의 프로젝트를 진행하게 되었습니다. 이때 지도교수님께서 저에게 소프트웨어의 게임화에 대한 이야기를 해주셨습니다. 이는 게임이 아닌 소프트웨어를 사용자가 게임처럼 플레이하도록 유도해 흥미를 느끼게 하고 몰입감을 증대시키는 기법입니다. 특히나 AR 기술은 포켓몬고와 같은 게임을 통해 대중들에게 익숙한 기술이 되었기 때문에 더욱 게임화와 연결되는 부분이었습니다.
이 두 AR 프로젝트 중 두 번째 프로젝트는 스마트폰 터치 등의 기존의 인터랙티브가 아닌 손으로 직접 AR 환경을 제어하는 사용자 경험을 제공하는 기술을 개발하는 것이었습니다. 여기에 농구공과 농구 골대를 추가하면 공을 손으로 직접 쳐서 골대에 넣는 게임으로 만들 수 있었고, 여러 래그돌 캐릭터를 추가하면 손으로 인형을 뽑는 게임을 만들 수 있었습니다. 이렇게 개발한 기술을 게임과 접목하면서 스마트폰의 발전이 모바일 게임을 흥하게 한 것처럼 이러한 새로운 기술의 발전이 새로운 게임의 등장에 미칠 영향에 대해 상상해보게 되었습니다. 또한, 이 프로젝트는 진짜 게임을 만들어보고 싶은 욕심을 갖게 했고 바로 실행으로 옮겼습니다.
최근 유행하는 여러 B급 감성 게임을 레퍼런스로 하여 게임을 기획했고, 축구에 개인전을 도입한 3D 멀티 게임을 개발했습니다. 저와 팀원, 그리고 동기들이 테스터가 되어 함께 게임을 했고 모두가 크게 웃으면서 즐길 수 있었습니다. 게임이 만들어지는 과정을 눈으로 보는 것, 그리고 직접 만든 게임을 하며 행복해하는 사람들의 얼굴을 보면서 그 어떤 프로그램을 개발했을 때보다 더 기쁘고 뿌듯한 감정을 느낄 수 있었습니다. 이를 통해 게임 개발자가 되고 싶은 꿈을 키우게 되었고, 게임계의 큰 회사인 넷마블에 대한 관심으로 이어졌습니다.
넷마블하면 떠오르는 이미지는 캐쥬얼하며 접근성이 좋다는 것입니다. 이는 제가 게임을 만들고 친구들과 함께 플레이하면서 만들고 싶어진 게임의 방향과 일치했습니다. 특히 모바일 시장에서는 더욱 이러한 부분이 중요하다고 생각했으며 이를 장악하고 있는 넷마블과 함께하기를 꿈꾸게 되었습니다. 또한, 게임 퍼블리싱 회사라는 이미지가 강한 넷마블이지만 더욱 좋은 게임을 자체적으로 개발하는데 참여하는 일원이 되어 혁신적인 기술력과 아이디어를 갖고 직접 게임을 개발하는 넷마블의 이미지를 키우고 싶습니다.
2. 본인이 넷마블 CEO 라면, 어떤 게임/사업을 추진하고 싶은지와 그 이유를 구체적으로 서술하여 주십시오.
혁신의 아이콘 넷마블 만들기
제가 넷마블 CEO가 된다면, 넷마블을 혁신이라는 타이틀이 따라붙는 기업으로 만들고 싶습니다. 이를 위한 첫 번째 단계로 4차 산업혁명과 함께 등장하는 새로운 플랫폼을 타겟으로 하는 게임에 관한 연구 및 개발을 진행할 것입니다. 하드웨어의 발전은 소프트웨어의 발전에 영향을 미치며 새로운 소프트웨어 시장을 만들어냈습니다. 이는 스마트폰의 등장에 따른 다양한 어플리케이션의 등장이나 네트워크 기술의 진화 등의 현상으로도 나타났습니다. 넷마블도 이런 동향에 맞추어 발전하고 있습니다. 스마트폰이 널리 보급되면서 이전보다 모바일 게임의 접근성이 좋아졌고 넷마블은 모바일 게임에 뛰어들어 큰 성공을 거두었습니다. 이는 넷마블이 모바일 게임 분야에 대한 가능성을 보고 과감한 투자를 통해 얻어낸 성과라고 생각합니다. 저는 넷마블의 행보를 이어가기 위해 미래지향적인 사고에 혁신과 새로운 기술을 더해 사업을 이끌어나가겠습니다.
이전에 진행한 AR 프로젝트를 통해 가까운 미래에는 구글 글라스와 같은 초소형 HMD가 더욱 발전하여 다양한 산업 직군이나 일상생활에 널리 쓰이게 될 것이라고 느꼈습니다. 실제로 정보통신산업진흥원에서는 스마트 디바이스 기반의 AR 서비스 및 콘텐츠가 다양한 산업 영역에 활용되어 시장을 주도할 것이라고 예상하였습니다. 저는 이러한 예측들을 통해 SF 영화에 나오는 장면처럼 사람이 평면 디스플레이가 아닌 3차원 공간에서 홀로그램으로 이루어진 인터페이스를 경험하는 날이 올 것으로 생각합니다. 이와 관련된 기술이 발전하면 이에 해당하는 플랫폼 시장이 커지면서 관련된 다양한 맞춤 서비스가 생길 것이고, 당연히 게임 산업도 함께 변화할 것입니다.
제가 넷마블의 CEO라면, 위에서 언급한 바와 같이 미래에 다가올 새로운 게임 시대의 선두주자가 넷마블이 되도록 만들기 위한 고민과 노력을 계속할 것입니다. 새로운 분야에 독보적인 입지를 갖추기 위해서는 신기술에 관한 연구가 계속해서 이루어져야 합니다. 기술이 발전함에 따라 넷마블이 제작하는 게임이 즉각적으로 반응하고 적용되도록 하기 위해 새로운 기술에 관한 연구 개발을 아낌없이 지원하겠습니다. 애플이 GUI와 마우스 개념을 도입한 매킨토시 OS, 현대 스마트폰의 원조인 아이폰 등을 공개하며 혁신이라는 타이틀을 얻은 것처럼, 새로운 게임 플랫폼의 장을 열어 앞서가는 기술력과 게임을 사용자에게 선보이며 넷마블에 따라붙게 하겠습니다.
3. 타인과 협력하는 과정에서 가장 어려웠던 일을 사례를 들어 설명하고, 어려움을 어떻게 극복하였으며 그를 통해 무엇을 느꼈는지 서술하여 주십시오.
스타일을 통일하다
저학년 때 처음으로 다른 사람과 협업 프로젝트를 하면서 어려웠던 것은 내가 짠 코드와 다른 사람이 짠 코드를 합치는 과정에서 수정할 것이 많아지고 전체적으로 코드가 지저분해지는 것이었습니다. 연산자와 피연산자 사이에 띄어쓰기가 있는 부분도 있고 없는 부분도 있다거나, 괄호를 입력할 때에도 위치가 달랐고, 변수명이나 함수명이 모두 각자의 스타일대로 지어져 통일성이 없었으며 합칠 때는 다른 사람의 코드로 인해 내가 작성한 코드를 조금씩 변경해야 하는 일도 생겼습니다.
2학년 때 객체지향프로그래밍 수업에서 JAVA를 배웠는데 클래스, 변수, 함수 등의 명명규칙이 있다는 것을 알게 되었습니다. 이 수업에서 JAVA로 프로그래밍하며 JAVA API를 참고할 때 모든 변수나 함수가 수업시간 때 배웠던 규칙대로 명명된 것을 확인할 수 있었습니다. 호기심에 명명규칙에 대해 찾아보았고 JAVA 뿐만 아니라 다른 언어도 프로그래머 사이에 약속한 규칙이 있다는 것을 알게 되었습니다. 이러한 부분을 협업할 때 도입하면 앞서 언급한 문제는 일어나지 않을 것 같았습니다.
그래서 이후에 유니티 엔진을 사용한 프로젝트를 진행하게 되었을 때 협업을 위한 깃 레포지토리를 만들기 전에 C샾의 코딩 스타일에 대해 먼저 정리했습니다. private, protected 멤버 변수는 언더바로 시작하는 카멜 케이스를 따르고 public 멤버 변수나 클래스, 구조체, 함수는 파스칼 케이스, 지역 변수는 카멜 케이스, 변수나 클래스 이름은 명사, 함수는 동사로 지으며 BSD 괄호 스타일을 사용하는 등의 내용이었습니다. 또한, 변수나 함수 이름은 반드시 이름을 보고 그 의미를 알 수 있도록 작성해야 한다는 내용도 포함했습니다. 이를 문서로 작성했고, 팀원들에게 배포하여 규칙을 지키도록 했습니다. 또한, 다른 사람의 코드를 사용할 때 내가 작성한 코드가 영향을 받지 않도록 객체지향 언어인 C샾의 장점을 이용해 코드를 클래스로 묶어 모듈화할 것을 강조했습니다. 그리고 객체의 캡슐화를 통해 다른 사람의 코드를 잘못 건드리는 일이 없도록 했습니다.
처음에는 같이 프로젝트를 진행하는 동기들이 제가 너무 유난을 떤다는 듯이 얘기하였습니다. 그러나 프로젝트를 진행하면서 이러한 노력이 이전보다 훨씬 효율적인 협업을 만들도록 도와준다는 것을 느꼈습니다. 팀원이 작성한 코드를 가져다가 사용하기 쉬웠을 뿐만 아니라 전체적으로 코드의 가독성을 높여주어 다른 사람이 짠 코드를 읽을 때도 더욱 쉬웠습니다. 그리고 높은 가독성은 코드의 유지보수에도 좋은 영향을 끼쳤습니다. 이후로는 팀원들이 먼저 저에게 코딩스타일 가이드 제정을 맡기게 되었고, 변수나 함수의 이름을 지을 때 저에게 물어보기도 하면서 규칙을 따르려는 모습을 보여주었고 이는 곧 협업의 효율성과 직결되어 좋은 프로젝트 결과물을 만들어 낼 수 있었습니다.
4. 수강했던 전공 과목을 나열하고, 그 중 가장 관심있게 수강한 과목과 그 이유를 작성하여 주십시오. (전산/컴퓨터공학 관련 과목 작성)
객체 지향 프로그래밍
프로그래밍기초및실습, 프로그래밍응용및실습, 리눅스시스템관리, 확률및통계, 이산수학, 창의적공학설계, 객체지향프로그래밍및실습, 선형대수, 자료구조, 컴퓨터구조, 네트워크프로그래밍, 데이터베이스, 소프트웨어프로젝트, 시스템프로그래밍, 인공지능, 운영체제, 정보검색과웹, 컴퓨터그래픽스, 캡스톤디자인프로젝트1,2, 컴퓨터비전 과목을 수강하였고 현재는 UI,UX설계및실습 과목을 수강하고 있습니다.
이 중 가장 관심 있게 수강한 과목은 객체지향프로그래밍및실습 과목이었습니다. 이 과목은 JAVA 언어를 통해 객체 지향 프로그래밍의 기본에 대해 학습하고 실습 및 프로젝트를 경험하며 실전을 통해 객체 지향 프로그래밍을 배우는 수업이었습니다.
저는 이 수업 이전까지 다룰 줄 아는 언어는 C언어 하나였으며 C가 절차 지향적인 언어라는 것도 몰랐고 그런 개념 자체를 알지 못했습니다. 그러나 이론 수업을 통해 객체 지향과 절차 지향의 차이점을 알게 되었고 객체 지향 프로그래밍이 가진 특징인 상속, 캡슐화, 다형성, 추상화 등의 특징에 대해 이해하게 되었습니다. 마인드맵 어플리케이션을 직접 개발하는 프로젝트를 통해 객체 지향 프로그래밍이 가져다주는 이점을 직접 느낄 수 있었습니다.
첫 번째로 느낀 장점은 상속을 통해 이미 만들어진 객체를 확장할 수 있으므로 이미 짜여진 코드를 쉽게 재사용할 수 있다는 것이었습니다. 마인드맵을 구현하기 위해서는 그림으로 표현되는 노드가 필요했고, 이는 JAVA의 Swing에서 제공하는 JLabel 클래스를 사용하여 구현할 수 있었습니다. 이 노드에는 JLabel이 가진 속성 외에도 마인드맵의 특징인 트리 구조를 만들기 위한 추가적인 정보가 필요했습니다. 상속이라는 개념이 없었다면 트리 구조를 위한 정보를 저장하기 위한 구조체를 따로 만들어서 JLabel과 함께 처리해야 했지만 JAVA는 상속이 가능했기 때문에 JLabel 클래스를 상속해 트리 level, 부모, 자식 등의 트리 구조로써 필요한 정보와 선택된 노드인지 여부, 자식이나 부모 노드가 연결된 지점을 저장하는 배열 등 마인드맵 노드로써 필요한 정보를 담은 하나의 클래스를 정의할 수 있었습니다. 그뿐만 아니라 ActionListener 인터페이스를 상속받아 특정 이벤트에 대한 구현을 하거나, MouseAdapter, MouseMotionListener 등을 상속받아 마우스의 움직임에 따른 이벤트 발생을 구현할 수 있었습니다. 인터페이스가 있었기에 이벤트 처리 자체의 핵심적인 부분만 구현할 수 있었습니다.
두 번째로 유지보수가 훨씬 쉽다는 것을 알게 되었습니다. 마인드맵 프로그램은 패널이 크게 3개 있었고 각각 JPanel을 상속받은 클래스로 구현되었습니다. 즉, 서로 다른 클래스로 구현되었습니다. 따라서 각각의 패널마다 필드 변수, 메소드 등을 가지고 있었으며 다른 패널에 영향을 미칠 때, 현재 패널에서 다른 패널의 메소드를 호출하는 방식으로 구현되었습니다. 따라서 어떤 기능에 문제가 발생하면 해당 기능을 구현하는 메소드나 클래스 하나만 수정하면 되었기 때문에 더욱 쉽게 코드를 보수할 수 있었습니다.
이외에도 클래스 변수 및 메소드 명명규칙, GUI 프로그래밍의 기본 등을 배웠으며 자료구조나 알고리즘 외에 개발자가 쌓아야 하는 기초지식을 얻을 수 있었습니다. 이런 부분이 저에게 매우 재미있게 다가왔기 때문에 끝까지 관심을 갖고 열심히 수강할 수 있었습니다. 이 과목은 이후에 프로젝트를 진행하거나 과제를 하며 프로그래밍을 할 때, 클래스단위로 모듈화하거나 상속을 통해 코드 양을 줄이는 등의 노력을 하는 코딩 습관을 갖게 해주었습니다.
5. 클라이언트 프로그래머가 되기 위해 학습한 내용, 주제들을 구체적으로 서술하여 주십시오.
소켓 통신과 멀티 스레드
멀티 게임에 통신은 필수적이며 게임의 특성상 계속해서 통신이 이루어져야 하기에 소켓이 필요했습니다. 유니티 C샾으로 소켓 통신을 구현하는 것은 문서를 보고 따라 하면 쉬웠으나 보내는 데이터에 따라 고민해야 할 문제가 생겼습니다.
먼저 이미지 같은 큰 데이터 전송 시의 문제였습니다. 카메라로부터 입력된 영상을 JPG로 변환하여 서버로 전송했을 때 데이터가 망가졌습니다. 원인을 분석해 보니 한번 데이터 전송 시 1KB만 전송되었고 JPG는 이보다 크기가 커 데이터가 온전히 전송되지 않는 것이었습니다. 이를 해결하기 위해 JPG를 1KB씩 분할하여 전송해야 했으나 매 프레임 JPG의 크기가 달라 분할된 데이터를 전송하는 횟수와 데이터를 담는 배열의 크기가 일정하지 않았습니다. 이는 서버에서 데이터를 읽을 때 잘못된 범위를 읽는 문제를 야기할 수 있어 서버에 JPG를 바로 전송하지 않고 그 크기만 먼저 보냈습니다. 서버에서 4바이트만 읽어 이 데이터의 크기를 알아낸 후에, 그에 따라 버퍼를 준비하여 데이터를 안전하게 읽을 수 있었습니다. 또 분할된 데이터 중 일부가 손실되는 문제가 발생해 서버에서 매번 수신할 때 클라이언트에게 받은 분할 데이터에 따른 Ack를 전송해 손실되는 데이터가 없도록 했습니다.
또 C샾이 아닌 다른 언어로 개발된 서버에 객체를 보낼 때였습니다. 마샬링, 직렬화 등의 방법이 있었지만, JAVA 서버와 통신할 때 원하는 대로 전송되지 않았습니다. C샾과 JAVA 모두 가상 머신에서 돌아가는 언어라 포인터로 직접 접근해서 데이터를 읽기에도 한계가 있었고, 인터넷에서 찾은 직렬화 방법을 사용해도 서버에서 스트림 예외가 발생했습니다. 저는 JSON으로 문제를 해결했고 JAVA 서버와의 통신에 대비해 JSON으로 객체를 변환하여 전송할 수 있도록 통신 코드 전체를 모듈화했습니다. JAVA와 C샾의 변수 명명 규칙이 달라 이에 따른 처리도 해주었습니다.
앞선 소켓 통신 구현 시 동기식으로 구현해서 서버에서 데이터를 처리하고 클라이언트에게 다시 데이터를 주기 전까지 모든 실행 흐름이 block 되어 있었습니다. 따라서 저는 통신에 대해 스레드를 생성했습니다. 그리고 큐를 만들어 서버로부터 데이터를 수신했을 때 큐에 데이터를 넣고, 메인 스레드에서 매 프레임 큐를 검사해 데이터가 있으면 꺼내 처리하였습니다. 큐에 데이터를 넣고 빼는 작업은 임계 영역으로 만들어 경쟁 상태 발생을 막았습니다.
실시간 동기화
네트워크 지연으로 발생한 문제로 멀티 게임에서 가장 중요하고 어려운 부분이었으며 이를 해결하고자 락스텝, 서버 시뮬레이션 등 여러 동기화 방식을 공부했습니다. 후자의 방식은 서버에서 물리 연산이 가능해야 했고 두 방식 모두 사용자의 입력을 전송해야 했습니다. 그러나 서버의 사양이 낮았으며 캐릭터의 절대 좌표를 서버에 전송하고 서버에서는 다른 플레이어에게 이를 브로드캐스팅 하는 방식으로 이미 구현해 앞에서 언급한 두 방식은 불가능했습니다. 많은 시행착오 끝에 분신 객체라는 개념을 도입했습니다. 사용자의 입력을 통해 로컬에서는 렌더링 하지 않아 보이지 않는 분신 객체를 움직이고 서버에서는 이 객체의 좌표를 처리하도록 구현했습니다. 서버와 클라이언트의 부하를 줄이기 위해 위치 정보를 모아뒀다가 일정 시간 간격으로 전송하고 그에 따라 클라이언트 측에서 부드러운 움직임을 위한 보간을 하는 등의 작업을 추가하였습니다. 또한, 물리적 충돌이나 래그돌로 Physic이 전환되는 등의 이벤트에 의해 분신 객체가 캐릭터 객체로 돌아오도록 구현해 버그를 해결하였습니다.