Hello I'm

Donghyeok Choi

I am a web developer who always strives to achieve bigger goals.
This is the site where I wrote my portfolio. I'd appreciate it if you could watch it with an open mind.

        

More About Me

Let me introduce myself to you, briefly.

절대 어제를 후회하지 마라 . 인생은 오늘의 나 안에 있고 내일은 스스로 만드는 것이다
L.론허바드

성장 과정

[군대 선임과의 코딩 과외 : 프로그래머가 되고 싶다는 꿈이 생기다] 저는 어렸을 때부터 목표 의식이 없이 남이 시키는 것을 하면서 살아왔습니다. 학창 시절에는 부모님과 선생님들, 대학에 와서는 선배들이 가리키는 화살표에만 따라가기 급급했습니다. 이러한 저의 태도는 입대 전인 22살 여름까지 지속되었습니다. 그러나 입대 후, 자대에서 분대장 선임을 만난 이후로 저의 태도는 180도 달라졌습니다. 이등병 때 취사병이라는 보직을 맡게 되었습니다. 취사가 끝난 후, 분대장 선임은 매일 같이 책상에 앉아 항상 공부를 했습니다. 분대장 선임은 매일 옆에서 지켜보는 저를 보면서 관심 있으면 자신에게 배워보라고 제의했습니다. 그러나 당시 새로운 것을 공부하고 싶은 욕구가 없었던 저는 분대장의 제의를 거절했습니다.

그 후, 일병이 되어 군인 학점 은행제를 이용해 ‘자료구조 및 알고리즘’ 강의를 수강했습니다. 알고리즘을 처음 접하는 저에게 해당 수업은 너무나 어려웠습니다. 이해가 가지 않는 내용을 따로 질문하지도 못하는 저에게 분대장은 다시 다가와 주었습니다. 지금까지 몰라서 따로 필기했던 내용들을 전부 알려주며, 즉석에서 IDE를 이용해 해당 알고리즘들을 구현해 주던 모습을 아직도 잊지 못합니다. 그러면서 자신이 하는 프로젝트에 대해서 가볍게 보여주는데, 그곳에서 저는 제 미래를 보았습니다. 그때부터는 관심이 아닌 진심으로 프로그래밍에 다가가게 되었습니다. 분대장도 이런 제 모습을 보며 다시 한번 제의를 해주어서 처음으로 목표 의식을 가지고 공부에 집중하게 되었습니다. 집중적으로 제가 배운 내용들은 ‘알고리즘’, ‘객체지향언어’, ‘운영체제’이었습니다. 분대장이 공부하는데 사용했던 책과 타 대학의 오픈강좌를 참고하여 미리 공부한 후, 분대장이 다시 한번 수업을 해주었습니다. 딱딱하기만 했던 이론 내용들을 실습 위주로 녹여내며 가르쳐 주었기에 지치지 않고 따라갈 수 있었습니다. 배운 내용들을 복습하면서 실행에 성공했을 때 흥분하게 되었고, 새로운 것들을 배우면서 전율하게 되었습니다.

이렇게 1년간의 수업을 받으면서 예전과 비교해서 저에게 2가지 변화가 있었습니다. 첫 번째로는 프로그래머라는 삶의 목표가 생겼습니다. 입대 전 까지만 해도 인생에 있어서 목표가 없었던 저에게 처음으로 가고자 하는 길의 화살표가 보였습니다. 두 번째로는 수동적이었던 삶의 태도가 능동적으로 바뀌었습니다. 항상 남이 시켜서, 남들이 해서 무언가를 해보았던 제가 자기 주도적으로 인생을 살아가기 시작했습니다. 그 결과 군대를 전역하고 나서도 계속해서 코딩 공부를 이어나가 마음이 맞는 친구들과 프로젝트를 진행하였습니다. 여기서 그치지 않고 공모전에도 나가서 모르는 사람들과 협업하며 1차 입상이라는 쾌거를 이루게 되었습니다. 한가지 언어에 관심을 가지고 시작한 제가 이제는 ‘프로그래밍’에 관심을 가지고 공부하고 있습니다. 입사 후에도 능동적인 삶의 태도로 무엇이든 배우기 위해 노력하고, 더 완벽한 프로그래머가 되기 위해 항상 성장하고 발전하는 사람이 되겠습니다.



타인과의 협력

[공사장에서의 경험] 저는 군대를 전역하고 나서 공사장에 일용직으로 일을 하러 다녔습니다. 꾸준히 출근을 하면서 4달이라는 경력이 쌓이게 되었습니다. 분업에 관한 체계화가 잡혀 있지 않았기 때문에 저는 혼자 일을 하는 경우가 많았습니다. 그러다 보니 맡은 임무를 시간내에 수행하지 못하는 일이 빈번하게 일어났습니다. 저뿐만 아니라 다른 노동자들도 겪고 있는 문제였습니다. 그렇기 때문에 관리 총괄 팀장님께 부탁을 해서 직접 분업 체계를 만드는 것에 대한 확인을 받아냈습니다.

그동안 진행해 왔던 나만의 동선과 업무 노하우를 기반으로 분업을 체계화하고 팀을 만들었습니다. 다른 팀원들의 피드백을 받고 분업을 하면서 얻은 시행착오의 경험들을 바탕으로 계속해서 수정해가면서 기록을 했습니다. 그 결과로 혼자서 하면 3달이 걸리는 일을 5명이서 2주만에 끝내는 분업 체계를 만들었습니다. 이를 통해 업무의 효율성이 매우 높아지면서 일부 일용직들이 갑작스럽게 빠지더라도 큰 문제가 생기지 않았습니다.

이런 경험들을 통해 분업의 중요성과 팀원들 과의 소통 그리고 이것들을 체계적으로 진행시킬 팀 리더의 중요성을 느끼게 되었습니다. 공사장을 통해 느낀 경험들은 나중에 팀 프로젝트나 스터디를 진행할 때에도 많은 도움이 되었습니다.



프로젝트 소개

[배달비 나눔 온라인 커뮤니티 '배나온'] 저는 '배나온' 프로젝트에서 팀장과 백엔드 개발을 담당했습니다. 이 프로젝트는 배달비 상승으로 인한 서민들의 금전적, 사회적 문제를 해결하기 위한 목적으로 시작되었습니다. '배나온'은 내 반경 1km 이내의 이웃들을 연결시켜서 사회적인 커뮤니티를 형성시켜주는 웹사이트로, 이웃들끼리 배달비를 나누어 지출 부담을 줄여주는 기능을 제공합니다.

팀원들이 협업 프로젝트 경험이 처음이었기 때문에, 제가 팀장으로서 먼저 개발 계획서와 기능 명세서를 작성하고 작업의 우선 순위를 제시했습니다. 또한 깃 협업 워크 플로우를 공부하고 문서화하여 작업 간 충돌을 최소화하도록 노력했습니다. 그러나 문제는 시간이었습니다. 출품작 접수까지 남은 기한은 10일이였고, 우리가 구현한 기능은 회원 관리 뿐이었습니다.

그래서 저는 매일 새벽에 프로젝트 구현 이외에 1~2시간씩의 시간을 할당하여 JWT 인증 방식, 3계층 아키텍처 배포 등 필요한 지식을 미리 공부하고 습득한 지식을 어떻게 적절히 사용할 수 있는지 혼자 테스트했습니다. 다음 날 테스트 결과를 토대로 팀원들에게 작업과 방법을 제시했습니다. 또한, 프로젝트의 완성도를 높이기 위해 백엔드 작업이 미리 완료되어 프론트엔드 팀원들이 신경 쓰지 못한 부분을 담당하여 작업 부담을 덜어주었습니다. 그리고 공부한 것들을 토대로 AWS의 여러 서비스들을 이용해 두 가지 방법으로 배포를 완료하였습니다.

['배나온'의 아키텍처] 첫 번째 배포는 ec2와 S3 그리고 RDS를 이용한 배포였습니다. 웹 서버와 웹 어플리케이션 서버를 분리하여, 높은 가용성과 확장성을 확보하고자 했습니다. 이를 위해 웹 서버로는 nginx를 선택하였고, react로 구현된 프론트엔드 어플리케이션과 연결했습니다.
웹 어플리케이션 서버로는 gunicorn을 선택하여, 장고 기반의 백엔드 어플리케이션과 연결하였습니다. 백엔드에서 사용되는 정적 파일인 media 폴더와 static 폴더는 s3 버킷에 저장하여, 백엔드와 프론트엔드 서버 간의 데이터 전송 속도를 향상시켰습니다.
데이터베이스는 RDS의 MySQL을 사용하였습니다. 이로써 안정적인 데이터베이스 운영과 관리가 가능하며, 백엔드 어플리케이션과의 연결도 원활하게 이루어졌습니다.

두 번째 배포는 S3와 Lambda 그리고 RDS를 이용한 배포였습니다. 웹 서버로는 S3를 사용하여 react build 파일을 업로드하였고, 이를 통해 프론트엔드를 제공하였습니다.
웹 어플리케이션 서버로는 lambda를 선택하여, 서버리스 아키텍처를 적용하였습니다. 장고 파일들은 lambda에 업로드되어 있으며, 백엔드 어플리케이션과 연결되어 작동합니다.
그리고 데이터베이스와 백엔드에서 사용하는 정적 파일들은 첫 번째 배포 아키텍처와 같은 방법으로 구성했습니다.

이러한 두 가지 아키텍처로 웹 어플리케이션을 완성하고 배포하였을 때, 도메인 구성은 AWS의 CloudFront와 Route 53을 사용하여 구성하였습니다. 프론트엔드 도메인인 https://baenaon.com 은 Route 53에서 호스팅되었으며, 백엔드와의 통신 도메인은 https://baenaon.com/dev/api/ 로 구성하였습니다.
두 도메인을 연결하기 위해, CloudFront에서 설정한 Origin Domain에는 프론트엔드 도메인 주소를 지정하고, Viewer Protocol Policy를 HTTPS Only로 설정하였습니다. 또한, SSL 인증서를 적용하여 보안을 강화하였습니다.
이와 같이 다양한 AWS 서비스들을 활용하여, 안정적이고 확장성 있는 웹 어플리케이션을 구축할 수 있게 되었습니다.

좋은 팀워크 결과로 짧은 시간 내에 결과물을 완성할 수 있었고, 일반 부문 114팀 중 합격 16팀에 속하여 라이선스 검증 통과 후 본선에 진출했습니다. 이번 프로젝트에서는 주어진 기한 내에 최대한 많은 것을 구현하려는 목표와 함께, 팀원들과의 원활한 소통과 협업, 개인적인 노력과 역할 분담이 중요하다는 것을 배웠습니다. 또한, 프로젝트를 통해 배운 기술과 지식을 더욱 깊이 이해하고, 다음 프로젝트에서 적용해 볼 계획입니다.

[제스처 인식을 기반으로 한 Youtube 영상 제어 프로그램 ‘Vicon’] Vicon은 요리 레시피 영상을 보며 동시에 요리를 하는데 불편함을 겪는 사람들을 위해 만든 모바일 애플리케이션입니다. 특정 제스처를 통해 요리 영상을 제어할 수 있어서, 요리를 하며 영상을 제어하는데 발생하는 불편함을 완화시켰습니다. 대학교 커뮤니티 에브리타임을 통해 마음이 맞는 친구들과 함께 팀을 구성하여 프로젝트를 진행했습니다.

4명의 전공자들로 이뤄진 팀에서 저는 팀장을 맡았습니다. 사람의 제스처를 기반으로 한 유튜브 영상 제어 애플리케이션이었는데, 한 번도 사용해 본 적 없는 프레임워크를 사용해서 많은 어려움이 있었습니다. 그래서 프로젝트를 진행하면서 함께 공부하고 노력했습니다. 각자의 전공 분야에서 쌓은 지식을 공유하며 기능을 구현하는 것이 중요했기 때문에, 주기적인 회의와 코드리뷰를 통해 협업했습니다.

특히 RTMP 프로토콜을 통한 통신의 delay 문제에 많은 어려움을 겪었는데, 이를 해결하기 위해 통신이 아닌 안드로이드 스튜디오 내에 lite tensorflow api 를 이용해 구현을 하였습니다. 6초에 육박하던 delay 시간은 0.5초로 단축이 되었으며, 여러가지 시도 끝에 youtube 영상과 스마트폰 내장 카메라가 같이 동작하여 제스처를 인식하는 완성도 높은 프로그램을 만들어 냈습니다.

이 프로젝트를 통해 협업과 문제 해결 능력을 향상시키고, 새로운 기술과 지식을 습득할 수 있었습니다. 또한, 실제 사용자를 대상으로 한 프로그램을 개발하면서 사용자의 니즈를 파악하고 그에 맞는 서비스를 제공하는 중요성을 느낄 수 있었습니다.



프로젝트를 하면서 느낀점

[제스처 인식을 기반으로 한 Youtube 영상 제어 프로그램 'Vicon'] Youtube 요리 레시피 영상을 보며 동시에 요리가 가능하게 하기 위해 ‘Vicon’ 애플리케이션을 만들었습니다. 사람의 제스처를 기반으로 한 유튜브 영상 제어 애플리케이션이었는데, 한 번도 사용해 본 적 없는 프레임워크를 사용해서 많은 어려움이 있었습니다. 맡은 업무 대부분이 안드로이드 스튜디오 내에서 작업을 해야 했기 때문에 공식 문서를 매일 같이 들어가 보며 학습했습니다. 총 6개월의 기간 동안 이런 습관을 들여 작업한 결과, 프로그램의 전체적인 디자인, 제스처 인식 결과값들을 유튜브 API와 매핑해주는 기능을 완성하게 되었습니다. 남의 코드와 결과물들을 그대로 가져다 쓰는 것이 아닌, 그것들을 학습해 내 것으로 만드는 능력은 다른 사람들과 비교해도 뛰어나다고 자신할 수 있습니다. 개발자는 현실에 안주하는 직업이 아닌, 항상 새로운 것에 도전하며 학습하는 사람이라고 생각합니다. 이러한 제 장점이 개발자의 숙명과 잘 맞는다고 생각합니다.

[배달비 나눔 온라인 커뮤니티 '배나온'] 배달비의 상승으로 인한 서민들의 금전적, 사회적 문제를 해결하기 위해 ‘배나온’ 프로젝트를 진행했습니다. 백엔드 2, 프론트 엔드 2명으로 이루어진 팀에서 저는 백엔드 개발을 담당했습니다. Jwt를 이용한 회원가입(소셜 로그인, 이메일 로그인) 및 로그인 관리, CRUD를 활용한 게시판 기능을 구현했습니다. 그리고 AWS EC2 환경에서 배포까지 완료하였습니다. 프론트 엔드와 통신하는 과정에서 서로 데이터 폼을 소통하지 않고 바꾸는 경우가 많았습니다. 그리고 다른 백엔드 팀원과 작업을 하면서 서로의 코드가 꼬이는 상황도 비일비재했습니다. 이러한 부분들을 해결하기 위해 1일 1회의, 코드 리뷰를 진행했습니다. 프론트 단과 항상 소통하며 작업을 한 덕분에 데이터 폼 불일치 오류가 발생하지 않았습니다. 그리고 코드 리뷰를 진행하면서 백엔드 팀원과의 코드 충돌 현상도 완화되었습니다. 그 결과 짧은 시간 내에 결과물을 완성할 수 있었고, 114팀 중 합격 16팀에 속하여 라이선스 검증 통과 후 본선에 진출하는 쾌거를 이루어 냈습니다. 비록 수상은 하지 못하였으나, 코드 리뷰와 소통을 통한 작업의 체계화를 배우게 되었습니다.

이러한 노력을 하면서 두 가지를 깨닫게 되었습니다. 첫 번째로는 개발자가 되기 위해 필요한 역량은 단순히 개발을 잘하는 것이 아닌 항상 배움을 목표로 하고 팀원들 간의 의사소통을 통한 협업을 중시하는 사람이 되는 것입니다. 두 번째로는 코드 리뷰에 대한 중요성입니다. 프로젝트를 하기 전 항상 혼자 작업해 오던 저에게 코드 리뷰는 한 단계 성장할 수 있는 원동력이 되었습니다. 팀원들에게 피드백을 받고, 좀 더 나은 코드를 작성하기 위해 노력하는것 자체가 개발자라는 제 캐릭터의 경험치를 쌓아가는 과정이 되었습니다