개발/리서치 · 2021 상반기
작성자
박**
대학
영국 러셀그룹 대학
전공
경영학
GPA
3.62/4.0
TOEIC
957점
자격증
저는 서버 Backend 개발자가 되고 싶습니다. 2학년때 Java 관련 과목을 수강하면서 Java 언어에 대해 흥미를 갖기 시작했고 Java 개발자가 되기 위하여 스스로 꾸준히 Java 언어를 학습하며 지식과 경험을 쌓았습니다. 처음에는 마인드맵 GUI 프로그램을 개발하며 Java 프로젝트를 시작했고 이어서 안드로이드 어플리케이션 개발 등을 하였습니다. 여러 프로젝트와 학교에서 부여받는 다양한 과제를 하며 코딩을 해보니 눈에 보이는 부분을 만드는 것보다 보이지 않는 내부적인 부분을 개발하는 것이 저의 적성에 더 맞는 일이라고 생각하였습니다. 특히 시스템 프로그래밍이나 운영체제 과목에서 부여받는 과제를 수행하면서 효율적인 메모리 관리와 빠른 연산 속도를 위한 프로그래밍 방법에 대해 많이 고민하게 되었습니다. 또한, 사용자에게 익숙한 자료형 자체, 구조체 자체로만 변수 등을 고려하는 것이 아니라, 내부 바이트들의 구성, 비트의 패턴을 파악하여 좀 더 컴퓨터적인 측면에서 사고하는 능력을 길렀습니다. 이렇듯 보이지 않는 곳에서 프로그램을 효율적으로 동작하도록 만들려는 노력은 제가 Backend 개발자로서의 꿈을 키우는 데 영향을 주었습니다. 최근에는 열심히 쌓은 Java 실력을 Backend 서버 개발에 활용하기 위해 JSP-Servlet과 Spring 프레임워크에 대해 공부하고 있습니다. MVC라는 체계적인 디자인 패턴을 사용하여 개발하는 방식은 협업을 위해 코딩 스타일 가이드를 직접 작성하거나, 개발하는 기능을 모듈화하려는 노력을 하고 있는 저에게 매우 매력적으로 느껴졌습니다. Java Backend 개발에 대한 저의 관심과 수준이 네이버웹툰을 만나 더욱 증폭하여 수많은 사람이 이용하는 네이버웹툰 서비스를 제공하는 서버 개발자로서 완전히 채워지고 중요하게 쓰이는 개발자가 되고 싶습니다. 진행했던 개발 프로젝트 중 어려운 기술적 문제를 주도적으로 해결했던 경험을 이야기 해주세요. (학교수업, 대외활동, 경진대회 등) 작성 시에는, 정확히 어떤 문제였는지, 본인의 해결 방법과 실제 결과가 어땠는지 등 자세히 설명해주세요. 정확한 답을 찾지는 못한 경우라면 어디까지 고민해 봤는지 이야기 해주셔도 좋습니다. 멀티 플레이 3D 축구 게임을 개발한 적이 있습니다. 게임을 개발하면서 가장 어려웠던 부분은 실시간 동기화였습니다. 축구 게임이기 때문에 플레이어와 공의 위치가 실시간으로 동기화가 이루어져야 했습니다. 그러나 단순한 구현으로는 네트워크 지연으로 인해 특정 순간에 각 플레이어가 보는 화면이 달랐고 이는 게임 결과에 결정적인 영향을 미쳤습니다. 이를 해결하기 위해 멀티 플레이 게임의 동기화 방식에 관해 공부했습니다. 크게 클라이언트에서 받은 입력을 서버에서 시뮬레이션하고 클라이언트에게 시뮬레이션 결과를 전송하는 방식과 서버에서 클라이언트로부터 받은 입력을 동기화하여 클라이언트에서 시뮬레이션하는 락스텝 방식이 있었습니다. 서버에서 시뮬레이션을 실행할 물리 엔진 부족과 컴퓨팅 파워의 한계로 인해 서버 시뮬레이션 방식을 사용할 수는 없었고 비교적 구현이 간단한 락스텝 방식을 변형하여 사용하기로 했습니다. 처음에는 플레이어가 움직인 정도(상대 좌표)를 서버에 주기적으로 전송하고 서버에서는 모든 플레이어에게 해당 플레이어를 제외한 모든 플레이어의 상대 좌표 움직임을 전송하였지만, 패킷 유실 등의 이유로 시간이 지날수록 플레이어들의 위치가 어긋나 각 플레이어가 보는 화면이 완전히 달라졌습니다. 이렇게 일관성이 깨지는 것을 방지하기 위해 플레이어의 절대 좌표를 주기적으로 서버에 전송하여 최종적으로는 플레이어들의 위치가 정확하게 일치하도록 하였습니다. 이때 서버나 클라이언트의 네트워크 부하를 최소화하기 위해 서버에서 좌표를 전송하는 주기를 조금 늘렸습니다. 이로 인해 클라이언트가 서버로부터 좌표를 받을 때 플레이어가 순간이동 하는 것처럼 보였고 이를 해결하기 위해 선형 보간을 하였습니다. 코루틴을 사용하여 한 프레임에 병렬적으로 보간이 처리되도록 하였습니다. 이렇게 플레이어의 위치가 제대로 동기화되는 것처럼 보였지만 두 플레이어가 동시에 캐릭터를 이동시킬 때 A 플레이어가 보는 화면에서는 A 캐릭터가, B 플레이어가 보는 화면에서는 B 캐릭터가 더 앞서 이동하는 것처럼 보였습니다. 이는 자신의 움직임은 서버를 통하지 않고 바로 처리하기 때문에 다른 플레이어의 움직임과 동시에 입력되어도 먼저 움직이는 것처럼 보였기 때문입니다. 일반적인 실시간 동기화 방식인 서버로 움직임이 전송되는 1/2RTT 시간만큼 늦게 움직임을 처리하는 방식을 사용할 수도 없었습니다. 입력이 아닌 좌표를 전송하므로 결국 그 시간만큼 다른 플레이어가 해당 플레이어의 움직임을 늦게 받으며 지연이 늘어날 뿐이었습니다. 이러한 문제 해결을 위해 렌더링하지 않는 빈 게임 객체를 생성하여 입력이 주어지면 그 객체를 움직였고 그 객체의 좌표를 서버로 전송하여 서버로부터 그 좌표를 수신하였을 때 실제 게임 캐릭터를 그 좌표로 이동하는 방식을 사용하였습니다. 결과적으로 네트워크 상태가 좋은 환경에서는 실시간으로 정확하게 동기화가 잘 이루어지는 게임을 구현할 수 있었고 기존의 동기화 방식을 그대로 사용하지 않고 다른 방식을 고안하며 문제를 새로운 방법으로 해결할 수 있는 능력을 기를 수 있었습니다. 본인이 보유한 개발 skill의 활용 정도를 작성하고(1~4점 중 선택), 기술 습득을 위해 노력한 학습 방법을 구체적으로 작성해주세요. [활용 정도 작성 기준] 4 - 대규모 프로그램 및 시스템을 참고사항(책/인터넷)없이 개발할 수 있으며, 일반적이지 않은 난해한 부분도 일부 참고를 통해 개발할 수 있음 3 - 중간규모 프로그램 및 시스템을 개발할수 있으며, 주요 이슈 트러블슈팅을 할 수 있을 정도로 내부구조에 대해 이해하고 있음 2 - 시스템 동작 방식을 알고 있으며, 기본적인 기능을 구현할 수 있음 1 - 코드를 읽을 수 있으며, 책을 참고하여 약간의 수정작업 또는 작은 변경사항 추가를 할 수 있음 C - 3 : Linux 환경에서 OS 개발 실습 Java - 3 : 지속적인 알고리즘 학습과 Spring 프레임워크 실습 C# - 3 : 유니티 엔진을 활용한 게임 개발 C++ - 2 : MFC를 활용한 윈도우 프로그램 개발 Javascript - 1 : JSP-Servlet학습과 병행 및 Node.js로 게임 서버 구축 JSP - 1 : JSP 및 Servlet 학습 Linux - 2 : Linux 환경에서 OS 개발 실습 Android - 2 : 안드로이드 앱 개발 Unity - 3 : 게임 및 AR 컨텐츠 개발 MFC - 2 : OpenCV를 활용한 이미지 인식 프로그램과 캡처 이미지 OCR 윈도우 프로그램 개발 Node.js - 1 : 게임 서버 구축 Spring - 2 : 개인 학습 '네이버웹툰 주식회사'에서 제공하는 서비스 중 하나를 선택하여, 기술의 관점에서 어떤 장단점이 있는지를 작성해주세요. (경쟁 서비스와의 비교도 가능합니다) 다른 웹툰 서비스와 달리 네이버웹툰에서는 장르별, 작가별, 연도별 등으로 웹툰을 검색할 수 있어 사용자가 원하는 웹툰을 찾기 쉽게 UI가 구성되어 있습니다. 또한 모바일에서 관심 웹툰으로 설정한 웹툰이 PC 웹으로 바로 연동되고 모바일에서 관심 웹툰에 대한 알림을 받을 수 있다는 장점이 있습니다. 그러나 위에서 언급한 다양한 웹툰 검색 기능이 모바일 앱에서는 구현되어 있지 않은 부분도 있는 것은 아쉬운 부분입니다. 또한, 모바일 앱에서 My 메뉴에 있는 최근 본 웹툰 목록이 PC 웹에서는 표시되지 않는 점 역시 아쉽게 생각했습니다.