본문으로 건너뛰기

해고 회고

· 약 9분

근속 2년 차 회고를 작성하던 중에 구조조정 통보를 받아 어떻게 회고를 완성해야 하나 고민했지만, 퇴사 과정에서 느낀 많은 것들을 기억하기 위해 해고 회고를 별도로 작성했다. 조금은 아이러니한 상황이지만 나름의 해프닝으로 재밌게 받아들이려 한다. 해고 회고. 제목도 꽤 마음에 든다.

최근 스타트업 뿐만 아니라 대기업에서도 심심치 않게 구조조정 이야기가 들려왔다. 그럼에도 나는 자사 서비스의 대부분을 담당하고 있었기 때문에 나와는 거리가 먼 얘기라고 생각하고 있었다. 3일 전, 회사에서 모든 사람들을 모아 불가피하게 구조조정을 실시한다고 할 때까지만 해도 나는 아니라고 생각했다. 하지만 당장 매출을 낼 수 없는 자사 서비스는 중단하고 새로운 수익모델과 과제에 집중한다는 이야기를 들었을 때, 그제서야 내가 구조조정 대상자라는 것을 알았다.

그리고 대부분의 직원들은 그날 출근까지만 해도 생각지 못한 퇴사를 해야만 했다. 모두가 입모아 했던 말은 '그동안 너무 안일했다'. 사실 모두가 알고 있었던 듯하다. 회사의 수익모델은 흐릿해져 가고 있었고, 준비중이었던 과제는 명확한 진행사항을 아는 주니어가 없을 정도로 쉬쉬하는 분위기였다. 당장 사인을 하고 퇴사를 해야 한다는 말에 나는 어떻게든 다른 방법을 찾으려 했지만, 이내 단념하고 권고사직을 받아들이기로 했다.


해고 통보를 받은 날, 커피 타임만 연거푸 4번을 가졌다. 함께 회사를 떠나는 사람들과 커피를 마시며 불만과 걱정을 이야기하고, 회사에 남는 사람들과는 그동안 고생했다는 이야기를 했다. 이야기를 마치고 자리에 돌아오면 또다른 사람들이 커피를 마시러 가자고 했다. 그리고 나는 퇴사를 조율하려는 과정에서 당일이 아닌 다음날 권고사직서에 서명을 해야 했는데, 그 다음 날 역시 짧은 시간 동안 수많은 커피를 마셨다.

사실 이 회고에서 적고 싶은 것은 앞으로의 걱정이나 회사에 대한 비난이 아니다. 이틀간 수없이 이뤄진 커피 타임과 식사자리에서 들었던 이야기를 기억하고 싶었다. 퇴사를 명분으로 그동안 낯간지러워하지 못했던 이야기를 주고받았는데, 이것이 나의 퇴사에 대한 기억을 꽤나 아름답게 꾸며주었다.


입사 초기에 뺀질거리던 녀석이, 이제는 제 몫을 하는 사람이 되었다. 어디 가든 잘할 사람이니 걱정하지 않는다. 친해지고 싶은 일잘러였는데, 앞으로 못 보게 되어 아쉽다. 함께 일하는 동안 즐거웠다. 그동안 많은 도움을 주셔서 감사하다. ...

울컥할 정도로 너무나 좋은 말들을 많이 들을 수 있었는데, 무엇보다 내가 회사생활을 꽤 나쁘지 않게 했구나 라는 생각이 들었던 것은 사람들의 아쉬움이 가득 담긴 눈빛이었다.


그리고 이번 퇴사과정에서 들었던 좋은 말들로 인해 새로운 발견을 하기도 했다. 나는 사실 남들의 언행과 행실을 관찰하는 다소 관음적인 취미가 있는데, 그중에서도 능력 있는 사람들을 관찰하며 그 능력의 원천을 탐구하려는 버릇이 있다. 그리고 나는 어떤 능력을 갖고 있을까를 항상 궁금해하며, 나 스스로의 능력을 정의하곤 했었다. 하지만 이번 퇴사 덕분에 사람들이 나를 바라보는 평가를 한꺼번에 들을 수 있었는데, 수많은 평가가 모이는 한 지점에서 이것이 내가 가진 특별한 능력이구나 싶었다.

차분하면서도 적극적으로 의견을 내는 사람, 부드러운 리더십을 가진 사람, 항상 이해하기 쉽게 알려주는 사람, 텍스트에도 따뜻함이 묻어나는 사람.

나는 목소리가 엄청 낮은 편이라, 어렸을 적부터 무엇을 말하든 진중해 보인다는 이야기를 들었다. 가벼운 말을 해도 모두가 진지하게 받아들이는 터라, 어쩔 수 없이 가벼운 언사를 삼가는 사람이 되었다. 또, 나는 누군가를 돕는 것을 좋아했다. 무리지어서 어딘가로 향할 때에는 항상 맨 뒤에 서서 소외된 사람의 옆으로 향했다. 그리고 아무도 소외된 사람이 없을 때에는 하늘이나 거리를 보며 여유를 즐기곤 했다.

내심 기대했던 나의 능력은 개발과 관련된 것이었으면 했다. 남들보다 더 잘하기 위해 꾸준히 개발을 공부하고 노력했는데, 결국 더 도드라지는 능력은 내 성향과 태생에 관한 것이라니. 이 역시 아이러니하지만 동시에 나답기도 하다.


퇴사를 당장 생각해본 적이 없었기 때문에, 내가 회사생활을 잘했는가? 라고 자문할 시간이 없었다. 그럼에도 과분한 평가를 내려주신 동료분들 덕에 기분 좋게 새 시작을 준비할 수 있을 것 같다. 나 역시 이처럼 훌륭한 동료들을 앞으로 만날 수 있을까 싶을 정도로 내게는 과분한 사람들이라 생각한다. 언제 있을지 모를 앞으로의 마무리를 위해서라도, 계속해서 따뜻한 사람이 되도록 노력하려 한다. 물론 나의 이상향을 향한 개발도 놓지 않고.

개발자로 취업한 지 2년 즈음이 지난 시점에서 적는 회고

· 약 20분

삐뚤어진 MZ 신입사원에서 신임받는 프로젝트 리더로

얼마 전 회식자리에서, 팀장님이 제 칭찬을 하시면서 팀장 회의에서 프로젝트 리드를 맡긴다고 했을 때, 아무도 우려를 표하지 않을만큼 신임받는 사람이라고 말해주셨습니다. 문제가 생기면 가장 먼저 의심받던 MZ 신입사원이었는데, 이제는 내가 많이 변했구나 싶은 생각이 들었습니다.

입사 초반을 돌이켜보면 함께 일했던 분들에게 죄송하다는 말씀을 드리고 싶어요. 책임감없는 태도로 불만만 가득했던 제 모습이 지금도 부끄럽습니다. 지금은 개발실력이 늘었다기 보다는, 어느샌가 사람들을 대하는 태도가 변했고 이전에 비해 성숙해진 모습이 되었다고 느껴져요. 그리고 지금, 취업한지 2년이 좀 넘은 시점에서 그동안의 회사생활에 대한 회고를 해보려고 합니다.

김퇴사(@kimtoesa) 인스타그램

제가 다니는 회사는 자체 서비스를 운영하고 있고, 40명 정도 되는 인원을 가진 작은 스타트업입니다. 입사 초기에는 개발을 잘하고 싶었어요. 개발자는 개발로써 인정을 받는다고 생각했고, 좋은 시니어 밑에서 코드리뷰를 받으면서 성장하고 싶었어요. 그렇지만 제가 입사한 곳의 팀장님은 리액트를 전혀 모르시는 시니어 개발자셨고, 팀의 관리를 위해 임명된 분이었어요. 또, 프론트엔드 팀원은 저 같은 신입 개발자로만 이루어진 신생팀이었습니다. '이런 곳은 성장할 수 없는 회사야!' 라고 생각하면서, 딱 3개월만 일하고 퇴사하자 라면서 첫 직장생활을 시작했어요.

서론이 길었네요. 지금부터는 3개월만 일하고 퇴사한다는 신입사원이 적는 2년 근속 회고입니다.


최고의 복지는 동료

그렇게 책임감 없던 제가 회사를 계속해서 다니게 된건 두가지 이유가 있었어요. 첫번째로는 이직에 성공하지 못한 것입니다. 당연한 일이겠죠. 그동안 계속 불합격만 받던 비전공 신입 개발자가 회사와 병행하면서 준비한다고 성공할 수 있을까요. 그리고 두번째는 지금도 함께하고 있고, 감사드리는 프론트팀을 포함한 동료들 덕분이었습니다. 그 당시에는 '왜 이런 회사에..?' 라고 느껴질만큼 잘한다고 생각했고, 지금도 한명한명 엄청난 능력이 있다고 생각해요. 주니어 개발자로서 함께 성장해나가면서 코드와 지식을 공유하는 경험은 너무나 즐거웠고 도움되는 일이었어요. 과연 앞으로도 이런 팀을 만날 수 있을까? 라는 생각이 들 정도로 제게는 완벽한 팀이었습니다.

특히나 프론트엔드팀은 제가 애정을 갖고 있는데요. 제가 좋아하는 영화인 엑스맨처럼, 저희 팀원들은 모두 특별한 능력을 갖고 있었어요. 기술 트렌드에 밝아 이런저런 기술을 시도해보면서 지식을 공유해주는 분도 있고, 기술 자체에 대한 관심으로 자바스크립트나 브라우저의 동작방식이나 개념을 상세하게 아시는 분도 있었죠. 어떤 분은 정말 다른 레벨의 수준으로 문서작성을 하시고, 심지어 문서 쓰는 것을 즐겼어요. 한번은 그분의 작업들을 인수인계 받게 된 적이 있는데, 문서만 봐도 프로젝트의 흐름과 진행과정을 알 수 있어서 감탄하기도 했어요. 마지막 한분은 모든 사람이 좋아하는 사람이었어요. 그분이 활짝 웃으며 커뮤니케이션하는 모습을 보고 있으면 이것도 다른 레벨이겠구나 싶었어요.


그리고 저는 항상 저희 팀원분들을 유심히 지켜보면서 그 능력들을 가지려 했어요. 팀원 분들이 멋진 히어로라면, 전 마치 원피스의 검은수염 티치 같네요. 기술 트렌드를 컨퍼런스 영상이나 특정 아티클에서 얻는 것을 보고 유명 컨퍼런스들을 챙겨보고, 오프라인 컨퍼런스에 참석해보기도 했어요. 자바스크립트를 포함한 소위 기본기에 대해 잘 알고 계신 분께는 특히 질문을 많이 드렸는데요. 개발 도중 문제가 발생할 때, 동작원리와 흐름에 의거해서 문제를 찾아내는 모습을 보면서 개인적으로 많이 배울 수 있었습니다.

팀원분들의 이런 모습들을 보면서 나는 무슨 능력을 가지고 있을까? 하는 생각도 정말 많이했는데요. 퇴사하는 날, 여러 사람들과 여러번의 식사와 커피타임을 가지면서 제 능력이 무엇인지 알려주셨어요. 이 능력들은 퇴사 회고에 마저 적도록 하겠습니다.


시니어에 대한 존경

좋은 동료들과 회사를 다니게 되면서 크게 느낀점이 또 하나 있는데요. 바로 존경심입니다. 높은 DAU와 화려한 아키텍처, 최신 기술이 좋은 서비스 회사의 지표라고 생각했던 어린 날에는 '이 회사는 배울 것이 없는 곳이야!' 라고 생각했어요. 하지만 알고보니 저같은 MZ 신입사원을 사람구실할 수 있게 만들어줄 만큼 정말 존경스러운 사람들이 모여있는 곳이었습니다.

20년이 훌쩍 넘는 시간동안에도 꾸준히 개발을 공부하시는 시니어분들도 있었고, 마흔이 넘는 나이에도 해외 취업을 위해 영어를 공부하시는 시니어분도 계셨어요. 주니어 분들의 커리어를 위해 진지하게 고민하고 도와주는 모습이나, 감정을 조절하지 못한 채 격앙된 모습을 하는 주니어에게 부드럽게 왜 이렇게 개발이 진행되고 있는지를 알려주는 시니어분들의 모습을 보면 개발자라는 타이틀을 넘어 정말 존경스러운 사람이라고 생각되었어요.


사회 생활에서 배운 얕은 지혜

그리고 짧게나마 사회생활을 하면서 얕게나마 알게된 것도 있습니다. 싫은 사람이 생기면 내가 손해다. 그리고 사람은 누구나 입체적이다. 저는 누군가가 싫어지면 그사람의 행동 하나하나에 신경쓰게 되고, 혼자서 스트레스 받게 되는 것 같아요. 그래서 애초에 누군가를 싫어하지 않는 것이 그 사람을 싫어하는 것보다 좋은 선택임을 알았어요. 사람을 싫어하지 않는다는 것이 말이 안된다싶지만, 사람은 누구나 입체적이라고 생각하니 크게 어렵지는 않았어요. 모두가 좋아하는 사람은 없듯이, 모두가 싫어하는 사람은 없으니까요. 누군가의 단점이 보이기 시작하면, 이 사람의 단점보다 장점을 보려 노력하려고 합니다.

또, 절대 남을 비난하지 말자. 비난에 굳이 동조하지 말자 라는 것도 마음에 새겼는데요. 회사 생활을 하다보면 앞에서든 뒤에서든 남을 비난하는 모습을 종종 볼 수 있죠. 하지만 그럴 때 마다 비난하는 대상보다는 비난하는 사람이 좋지 않게 보이더라구요. 내가 누군가를 비난하면 남들도 나를 그렇게 보겠구나 라고 생각하니, 남을 비난하지 않도록 다짐하게 되었어요. 혹여나 누군가 남을 비난하는 모습을 보더라도, 그 분위기에 휩쓸려서 굳이 비난할 필요도 없는 것 같아요. 그런 상황에서는 대부분 제가 동조하지 않아도 말을 내뱉는 것만으로도 충분히 만족하는 것 같아요.


지금 생각하는 잘하는 개발이란?

개발자끼리 이야기를 하다보면 잘하는 개발은 무엇인가? 라는 주제가 자주 등장하곤 하는데요. 저는 항상 가독성 좋은 코드를 짜는 것이 잘하는 개발이라고 했었는데, 어떻게 해야 가독성 좋은 코드이냐 라고 묻는다면 자세히 답하기가 어려웠습니다. 지금 생각하는 잘하는 개발은 그것과 같은 궤를 하고 있지만, 조금 더 구체적으로 말할 수 있습니다.

회사에서 하는 개발은 지금의 동료 뿐만이 아니라, 과거와 미래의 동료 혹은 자신과 협업을 해야 할 수도 있습니다. 그리고 그 과정에서 쉽게 적응하고 개발하기 좋았던 코드들은 높은 응집도와 낮은 의존성을 가지고 있었습니다. SOLID 원칙처럼 너무 흔하고 당연한 점이지만, 직접 겪어보니 더 크게 와닿더군요. 이미 개발되어 있는 기능과 비슷한 기능을 개발할 때, 낮은 의존성을 가진 컴포넌트를 재조합 하다보면 정말 몇 배로 빠른 개발이 가능했습니다. 앞선 개발자에 대한 존경은 덤이구요. 또, 기존 기능을 수정하거나 유지보수 할 때에면 높은 응집도가 빛을 발했습니다. 어떤 문제가 생겼을 때, 해당 기능의 이름을 가진 폴더 혹은 파일을 찾으면 끝이었으니까요. 수정이 필요한 기능들은 대체로 같은 폴더에 놓여져 있기 때문에 사이드이펙트를 검증할 때에도 큰 어려움이 없었습니다.

불편한 코드를 짜는 것도 잘하는 개발이구나 라고 느끼기도 했는데요. 제가 본 잘하는 개발자분들은 협업을 위해서 일부러 불편한 코드를 짜기도 했었어요. enum이나 zod같은 기능을 사용하기도 하고, 특정 키값들을 constant로 설정하여 한 파일에서 관리하도록 하도록 강제하면서 협업을 하는 사람이 실수하지 못하도록 강제하는 것이죠. 멋있는 말로는 휴먼 에러를 줄이는 것이라고 하더군요.

또, 실무에서 말하는 잘하는 개발에는 코드 만큼이나 중요한 것이 있다고 생각하는데요. 바로 일정에 맞추는 개발입니다. 개발을 할 때마다 협업 과정에서 병목현상이 생기거나 CS(Consumer Service)를 우선적으로 처리해야 하는 일들이 빈번했는데요. 단순히 기능 개발에 필요한 기술이나 분량로는 책정할 수 없는 일정들을 겪으면서 이런 것 까지 맞출 수 있는 개발자가 진짜 잘하는 개발자가 아닐까 싶었어요.


꾸준히 공부하는 방법

2년 간 회사생활을 하면서 제가 자부하고 싶은 점이 하나 있습니다. 바로 꾸준히 공부해왔다는 점인데요. 물론 이런저런 사정으로 짧게는 일주일, 길게는 한달까지 쉴 때도 있었지만, 대체로 개발을 손에서 놓지 않았다고 생각합니다. 제가 이럴 수 있었던 건 함께 공부했기 때문이 아닐까 싶은데요. 저는 매주 일요일마다 봉천역에 있는 청년공간에서 개발 스터디를 하고 있는데요. 그냥 개발자끼리 모여서 각자 하고 싶은 개발을 하는 것입니다. 그리고 그 과정에서 꾸준히 나오는 사람들을 보면서 서로 동기부여를 받기도 하고, 네트워킹도 하다보니, 매주 일요일마다 나가는 것이 어렵지 않게 느껴졌어요.

하지만 각자 공부하다보니 어느순간 내가 재밌어하는 개발만 하게 되었고, 이직이나 회사에서 원하는 지식들과는 거리가 먼 공부를 하게 되더라구요. 때문에 신기술 사용과 같이 내가 재미를 느끼는 개발은 평일에 하고, CS 공부와 같이 필요한 공부는 주말에 하는 것으로 정하기도 했어요.

그리고 이것은 실패에서 배운 경험이기도 한데요. 저는 어떤 목표를 정할 때 너무 큰 목표를 세우는 것보다 작은 목표 여러개를 두는 것이 좋았어요. 사이드 프로젝트 같은 경우를 예를들면 사이드 프로젝트 완성! 을 목표로 세우는 것은 목표를 달성할 때 까지 오랜 시간이 걸리다보니, 보상을 받지 못하는 느낌이 들고, 흥미도 떨어지더라구요. 때문에 언제까지 특정 기능 개발! 과 같이 조금 더 짧은 기간의 구체적인 목표를 세우는 것이 동기부여에도 좋은 기능을 했어요. 작은 목표를 이뤘을 때에도 기분좋게 쉴 수 있기도 했구요.


함께 일하고 싶은 사람이 되자

2년이라는 시간동안 저는 스스로 꽤 많이 성장했다고 생각하는데요. 막상 회고를 적어보니 생각보다 훨씬 더 하고 싶은 말이 많아서 엄청 길어졌네요. 그리고 아직도 다 못다한 이야기가 많은데, 이는 퇴사회고에서 다시 다뤄볼까 합니다. 그래도 이 기나긴 회고를 한 문장으로 요약하라 한다면, "함께 일하고 싶은 사람이 되자" 로 정하고 싶어요. 결국 개발을 잘하는 사람이나, 일을 잘하는 사람, 그리고 존경받는 사람들은 결국 함께 일하고 싶은 사람이니까요. 회고라는 것은 사실 다른 사람이 보는 것보다, 미래의 내가 보라고 쓰는 글이라고 생각하는데요. 2년이 지날 무렵의 나는 이런 생각을 하고 있었는데, 3년 혹은 더 이후의 미래의 저는 어떤 생각을 하는지도 문득 궁금해지네요. 그때의 저는 더욱 함께 일하고 싶은 사람이었으면 좋겠습니다.

개인 사이드 프로젝트 0.1ver 회고

· 약 8분

혼자 사이드 프로젝트를 진행할 때 마다 이런저런 이유로 항상 끝까지 진행하기가 힘들었다. 때문에 이번 프로젝트에서는 일단 완성하자는 마음가짐으로 빠르게 프로토타입을 만들게 되었는데, 그렇게 해서 만들어진 프로토타입에 대한 회고를 공유하려 한다. 사이드 프로젝트 깃허브 링크 🔗

예상 외의 개발 기간

"일단 만들자", "프로토타입" 이라는 말과 다르게, 시작과 끝의 기간만을 놓고 보면 약 8개월이라는 시간이 걸렸다.

환경적으로 사이드 프로젝트에 소홀해질 때가 있었는데, 먼저 회사 일이 바빠질 때였다. 회사 일에 집중해야 할 때에는 평일은 물론이고, 주말에도 회사 일을 할 때에도 있었다. 그렇다고 정말 시간이 없어서냐고 묻는다면 당연히 그렇지 않다. 하지만 회사 일에 지치다보면 퇴근 후에 노트북을 쳐다보기도 싫어지게 되고, 어려운 문제를 맞닥드려 개발이 막혔다거나, 단순 노동과 같이 개발하기 싫은 부분을 개발할 때라면 더욱 하기 싫어졌다.

개발적인 문제도 있었다. 무작정 도커를 구축하려다 실패하고, 결국 도커를 공부하고 구축하면서 많은 시간이 소요되기도 했고, ec2의 메모리 문제로 단순 빌드시간에 대한 시간소모도 상당했다. 물론 소요된 시간동안 많은 것을 배우긴 했지만, 그럼에도 조금 더 빨리 끝내고 점진적으로 버전업 시키는 방식으로 했었다면 이라는 아쉬움이 남는다.


잘 모르는 기술을 GPT로 사용할 수 있을까?

적어도 나는 그렇지 못했다. 어떻게 빌드만 하면 되겠지라는 마음으로 동작원리를 이해하지 않고 gpt에게 해줘, 해줘 만을 반복해서 시도하며 왜 안되지?를 반복했다. 하지만 계속해서 오류가 발생했고, 에러메시지를 보아도 어떻게 고쳐야 할지 몰랐다. 그렇게 한참 고생을 하고 나서야 도커를 공부하고 만들어야겠다는 생각이 들었다. docker가 어떻게 사용되는지, yaml 파일은 어떻게 만들어야 하는지, Dockerfile은 어떻게 만들어야 하는지, 이미지는 무엇이고 볼륨은 무엇인지 배우고 나서야 오류를 이해하고 해결할 수 있었다. 빨리 가려다 오히려 먼길을 돌아간 경험이었다. AI가 코드를 다 짜주는 세상이라고는 하지만, 기술에 대한 이해가 있어야만 그 기술을 사용할 수 있겠구나 싶었다.


어차피 해야 할 일이라면 일찍 끝내자

만약 개발 초기로 돌아갈 수 있다면 하고 싶은 일들이 있다. tailwindCSS 삭제, migration 추가, docker image로 배포.

매몰비용의 오류 tailwindCSS

해외 개발자들이 tailwindCSS를 많이 사용하는 것을 보고, 한번 쯤 시도해보고 싶었다. 문법에 어느정도 익숙해지니 빠른 사용이 가능했지만, 세부적인 디자인이나 상속을 할당할 때에는 코드가 지저분해지고 오히려 더 오래걸리는 느낌이 들었다. 결국 css와 styled-components와 혼용해서 사용하게 되었는데, 이럴거면 tailwindCSS를 지우는게 낫지 않나 라는 생각이 들었다. 하지만 지금까지 만든 코드들이 아까웠고, 조금만 더하면 완성인데.. 라는 마음으로 지워야할 코드들을 계속해서 만들어갔다. 지금 돌이켜보면 바꿔야겠다는 생각이 들었을 때 바로 바꿨으면 개발시간이 더 단축되었을 듯 하다.

migration 및 백업 코드 구현

잘못된 코드를 restart: always로 작성해서 aws ec2 서버가 멈추는 경우가 잦았다. 그때마다 ec2를 종료하고 재생성하면서 목업데이터를 일일이 다시 작성해야만 했다. database를 백업하고 목업데이터를 복구할 수 있는 코드를 작성해놨더라면 개발시간이 훨씬 단축되었을 듯 하다.

docker image 배포

프로토타입에서는 ec2 환경에서 docker image를 빌드하고 띄우는 방식을 사용했다. 문제는 서버를 빌드할 때 간헐적으로 cpu 100%를 찍고 ec2가 멈춰버린다는 점이었다. 안그래도 prettier로 빌드하는 데에도 한참 걸리는데, 처음에는 무슨 문제인지 몰라 빌드가 될때까지 빌드하면서 시간을 낭비했다. 만약 이전으로 돌아간다면 아예 로컬에서 빌드하고 image만 올리는 방식으로 빌드시간을 단축시킬 수 있을 것 같다.


넓게 배운 지식

우여곡절이 많았지만, 서버개발과 배포까지 한번에 진행하면서 많은 걸 배웠다. 이번 회고에 적은 것 외에도 정말 많은 것을 배우고 겪고 망쳤는데, 그동안 배운 내용들을 시리즈로 조금씩 작성해볼까 한다. 그리고 이후에 조금 더 발전시킨 프로젝트로 또다른 배우고, 겪고, 망치는 내용을 공유할 예정이다 ^ㅡ^

입사 후 첫 프로젝트 리뉴얼 회고

· 약 9분

첫 회사에 입사해서 진행한 첫 프로젝트를 약 1년이 좀 넘은 후에 리뉴얼 작업을 진행하게 되었습니다. 리뉴얼 작업을 진행하면서 저도 꽤나 버전업이 되었구나 싶은 마음이 들어, 운영과정과 리뉴얼 과정에서 느꼈던 기술적인 과정과 회고를 공유하려 합니다.

기존 투표 커뮤니티 서비스

프로젝트를 한줄로 소개하자면, 투표에 참여하면 포인트를 주는 방식의 설문 커뮤니티 기능입니다. 처음 시작할 때에만 해도, 시범적 운영이었기 때문에 워드프레스 API를 사용해서 서버팀 공수를 최소화하여 진행했습니다. 기능은 다음과 같습니다.

  1. 앱 내에서 보여주는 웹뷰로 구현 및 웹앱 인터페이스 사용
  2. 투표 참여시 포인트를 지급하며, 투표 통계 표시
  3. 워드프레스 API를 사용한 댓글 및 댓글 좋아요 기능

운영 중 수정사항

부족한 개발실력으로 처음 만들었던 서비스다 보니, 이런저런 버그가 많았는데요. 때문에 운영 중 수정사항은 대체로 초기 버그해결이 주를 이뤘습니다.

간헐적으로 발생하는 흰화면 오류

개발환경이 아닐 때 간헐적으로 흰화면만 뜨는 문제가 있었습니다. 웹앱 인터페이스를 통해 가져온 데이터로 투표를 불러와야 하는데, 웹앱 인터페이스가 실행되기 전에 투표를 불러와서 생긴 오류였습니다. 존재하지 않는 객체를 참조하여 생긴** 자바스크립트 에러로 인해 렌더링이 중단되어** 흰화면만 보여줬던 것으로, 동기적으로 실행되게 하여 해결하였습니다.

웹앱 인터페이스 비동기 에러처리

비동기 콜백으로 동작하는 웹앱 인터페이스에서 오류가 났을 때, 에러를 처리하지 못하는 문제가 있었습니다. 문제의 원인은 try catch 구문이 callback에는 적용되지 않은 것을 몰라서 생겼던 오류였습니다.

사용자 경험을 해치는 로딩속도

네트워크 환경이 좋지 않을 때, 투표 페이지를 불러오는 데 약 2초 정도의 로딩이 발생하곤 했습니다. 원인은 웹앱 인터페이스 속도로, 로딩 스피너를 넣어 해결하였습니다.


리뉴얼된 투표 커뮤니티 서비스

좋지 않았던 개발퀄리티와 별개로, 해당 프로젝트는 성공하였고 약 1년 간 운영하게 되었습니다. 그동안 점점 새로운 기능이 필요하게 되었고, 워드프레스 API의 한계로 인해 리뉴얼 작업이 필요해졌습니다.

운좋게도 입사 후 첫 프로젝트를 리뉴얼하게 되는 기회를 얻게 되었는데요. 이번 투표 커뮤니티 서비스는 서버 뿐만 아니라 프론트엔드 팀원과 함께 팀을 이뤄 진행하였습니다. 추가된 기능은 다음과 같습니다.

  • 다문항 투표 및 페이지 분할 가능
  • 정답형 투표기능 및 정답에 따른 포인트 차등지급
  • 투표 생성 시 글자 크기 및 스타일 변경 가능
  • 댓글 공감기능 세분화 및 신고 기능

이전의 과오청산을 위한 작업들

이번 리뉴얼 프로젝트에서는 기존 프로젝트 경험을 토대로 여러 개발적인 기능을 추가했습니다.

먼저 자바스크립트 오류시 흰화면을 보여주지 않도록 에러페이지를 구현했습니다. 기존에는 자바스크립트 오류가 발생했을 때, 사용자는 흰 화면을 탈출할 방법이 없어 앱을 강제종료 해야만 했습니다. 이를 해결하기 위해 에러바운더리를 사용해서 예기치 못한 오류가 발생하더라도 사용자에게 에러페이지를 보여주어 오류상황을 탈출할 수 있도록 구현했습니다.

웹앱 인터페이스 캐싱을 통해 로딩시간을 최소화했습니다. 투표 커뮤니티 서비스에서 가장 많은 시간이 소요되던 것이 웹앱 인터페이스였는데요. 리액트쿼리의 캐싱을 사용해서 웹앱 인터페이스 시간을 최소화 했습니다. 추가로, 커스텀훅을 사용해서 웹앱 인터페이스에 의존하고 있는 API를 추상화하였습니다.


그리고 리뉴얼된 개발자로서의 모습

기능 외에도 많은 부분에서 스스로 성장했다고 느낀 부분이 있었는데요. 잦은 useEffect 사용과 지저분한 상태관리를 했던 기존 프로젝트와 달리, 적절한 컴포넌트 분리와 전역상태를 통해 비교적 깔끔한 코드 구현을 하게 되었습니다.

이런 저런 오류를 겪다보니 에러처리에 대해서도 더욱 신경쓰게 되었는데요. 버그가 생기지 않도록 최대한 작업해야 겠지만, 부족한 개발실력 때문인지 그렇지 못할 때가 무조건 생기더라구요. 때문에 에러가 발생했을 때의 조치를 위한 로깅작업이나 에러페이지에 대한 개발에도 집중하게 되었습니다.

가장 큰 부분은 태도의 변화였던 것 같습니다. 당장의 문제해결에 급급했던 입사 초창기의 모습은 항상 불만이 많았습니다. 회사에도 불만이 많았고, 저 자신에게도 불만이 많았죠. 하지만 그렇게 구현했던 프로젝트를 1년간 지켜보는 모습은 썩 좋지 않았습니다. 누군가 제가 짠 코드를 볼까봐 부끄러웠고, 제가 짠 코드로 인해 발생하는 버그를 보는 것은 더 힘들었죠.

이제는 부끄럽지 않은 코드를 작성하려 노력하다 보니 조금 더 성장한 것 같아 뿌듯하네요. 미래의 제가 지금의 코드를 보면 또 아쉬울 지는 몰라도, 적어도 부끄럽지는 않을 것 같아요. 이렇게 변화된 모습을 눈으로 볼 수 있다는 것이 개발자의 가장 큰 매력 중 하나가 아닐까 싶습니다. 1년 뒤에 제가 이 포스트를 보면 어떤 기분이 들지도 궁금하네요. 1년 뒤의 제가 부끄럽지 않게 계속 성장해야겠습니다.

2022년 회고

· 약 6분

나의 2022년은 79점

벌써 2022년이 끝났다. 원하는 것을 이뤘냐고 한다면 ‘그렇다’ 지만 그래서 만족하냐고 한다면 ‘아니다’ 이다.

만족할만한 기업에 취업도 했고, 만족스러운 곳에서 자취를 시작했다. 이전과 비교하면 개발실력도 조금은 나아진 것 같다. 갖기 전에는 그렇게 갈망하던 것들인데, 막상 갖고 나니 좀 더 좋은 것이 갖고 싶다. 나의 2022년에 점수를 매기자면 79점이 딱 어울린다. 못한것은 아니지만 잘하지도 않은.

2022년의 굵직한 이벤트를 꼽자면 역시 취업이다. 4월 안에 취업을 목표로 달렸지만 이런저런 실패들을 맛보며 8월에서야 취업을 했다. 예상 개발 기간은 생각한 것의 3배라는데, 2배정도면 겸허히 받아드릴 수 있다. 0년차 개발자로서 취준기간을 돌이켜보면 꼭 필요한 기간이었다고 생각한다. 취준기간은 힘들었지만, 4개월만에 취업했다면 분명히 개발하는 것에 많은 어려움을 겪었을 것이다. 어디가서 꿀리기 싫어서 공부했던 자바스크립트도, 남들이 좋다니까 배웠던 타입스크립트도, 취업을 위해 시작했던 팀프로젝트도, 개발하는 것에 큰 도움이 되어주고 있다.

여기까지만 보면 79점이라는 점수가 너무 짜다고 느껴지지만, 문제는 취업 이후였다. 취업전에는 스터디를 들어서라도 개발공부를 하겠다는 열정은 왕복 4시간 30분의 출퇴근길을 거치며 사그라져갔고, 왕복 100분 거리의 자취방을 얻고서는 예전처럼 타오르지 않았다. 그나마 요즘들어 열정이 다시 타오르기 시작해서 개발공부를 하고 있지만, 불태웠다고 느낄만큼 열심히 하지는 않는다. 조금 멍청한 소리같지만, 번아웃이 느껴질만큼 불타오르고 싶다.


2023년의 출사표

혼자서 나만의 서비스 개발환경 구축하기

Nginx와 AWS를 사용해서 마음대로 쓸 수 있는 개인 서버를 만들고 싶다. 물론 프론트개발자로서 firebase 같은 기술을 사용해서 쉽게 구현할수도 있겠지만, 지금 회사의 개발환경과 동일한 환경을 혼자서 구축해서 백엔드까지 볼 수 있는 넓은 시야를 갖고싶다. 회사에서도 간단한 내부서비스는 스스로 구축하고 싶기도 하고, 모바일 청첩장과 같이 주변사람들을 위한 나만의 서비스를 구현해서 선물하고 싶다.

꾸준한 알고리즘 공부

알고리즘 공부를 시작해야만 한다. 취업준비를 할 때에도 제일 하기싫었던 공부였던 터라 결국은 해야만 한다는 것을 알면서도 취업 후에는 쳐다도 보지 않았다. 하지만 이제는 해야만 한다. 스터디를 열어서라도 꾸준한 알고리즘 공부를 시작하고 싶다.

더 많은 사람 만나기

‘집-회사-집’을 반복하다보니 만나는 사람만 만나게 되게 되더라. 프로그래머스 데브코스에서 소중한 인연들을 만났던 것 처럼, 여러 사람들을 만날 수 있는 일을 시작하고 싶다. 스터디도 좋고, 개발 동아리도 좋다. 더 좋은 사람이 되기 위해 더 좋은 사람들을 만나고 싶다.


고생했다 2022년, 고생해라 2023년

아무것도 안했는데 왜 2023년이야 싶었지만, 막상 돌이켜보니 생각보다 나쁘지 않게 살아왔던 것 같다. 꿈꾸던 기업에 취업했다거나 개발 고수가 되지는 못했지만, 적어도 2021년에 막연히 꿈꾸던 개발자의 삶을 모두 이뤄냈던 것처럼 2023년에도 지금 꿈꾸는 것들을 모두 이뤘으면 한다. 고생했다 2022년, 고생해라 2023년.

버그 해결 회고::명확한 근거와 코드의 흐름

· 약 9분

커뮤니티 기능을 개발하는 첫 프로젝트에서 댓글 수가 제대로 표기되지 않는 버그가 발생했다. 간단한 동기 비동기 문제였지만, 문제를 해결하면서 배운 점이 많아 남기는 회고

문제점

API 호출과 결과는 제대로 받아왔으나, DQ에 있는 모든 상태값이 렌더링이 되지 않은 상황. storage에 token값이 존재하지 않을 때 auth.api.ts에서 token을 불러오기 때문에 상황으로, 2가지 문제점이 존재한다.

먼저, initInvokeInterface()와 isLoading을 끝내는 getInitialData()가 비동기적으로 실행되어 initInvokeInterface()으로 토큰을 받아오기 전. getInitialData()가 먼저 실행되어 loading이 끝난 후 토큰을 불러오게 되는 것이다.

두번째 문제점은 getItem("token") === "undefined"일 때 에러를 반환하는 것이 동작하지 않는 것인데, getMyInfo()는 API가 아님에도 auth.api.ts 파일에 존재하여 혼란을 야기하고, 불필요한 API 에러처리를 받고 있는 것이다.

수정사항

getInitialData() 내부에 initInvokeInterface()을 넣고, 동기적으로 동작하게 하여 initInvokeInterface()이 끝나야만 setIsLoading(false);가 실행되도록 수정하였다.

또, getMyInfo()를 auth.api.ts가 아닌 utils 폴더의 getAuthData.ts로 분류하여 api와 혼동되지 않게 수정하였다.


버그 해결 일지

  • 댓글 수가 제대로 표기되지 않는 버그 수정 0으로 표시되며, 댓글 작성 혹은 삭제 시 +1, -1 적용되는 중.댓글이 안보이던 버그가 이곳에서 나타나는 것으로 추정..Recoil 값으로 나타내는 것인데, setCommentsNumberInfo이 적용되지 않아 생기는 문제로 추정.
    • useEffect시 setCommentsNumberInfo이 되지 않는 것으로 추정
    • useEffect
      1. CommentsNumberInfo에 주어지는 값을 useState로 설정하고, useEffect를 사용하여 state가 바뀔 때 CommentsNumberInfo를 바꾸도록 변경하였다.=> 해결되지 않음
      2. 댓글 API 사용을 최소화하기 위해 CommentsContainer에서 사용한 댓글 API를 recoil 전역상태값으로 저장하여 DqConetents에서 댓글api 대신 전역 상태를 사용하도록 변경하였다.=> 약 5분간 계속해서 테스트했으나 현재까지 이상없음 해결되지 않음
    • initInvokeInterface 가 수행되기 전 DqContents이 먼저 렌더링되어 생기는 문제로 추정
      1. initInvokeInterface 이후 getInitialData를 호출하도록 수정. => 20분 테스트한 결과, 댓글 수를 불러오지 못하는 에러는 발생하지 않았으나 흰화면이 나타나는 버그가 17분 쯤 발생
  • 흰 화면만 나타나는 버그 수정현재까지는 아이폰에서만 발생하고 있고, 데이터 사용시 더 자주 발생하는 오류로 추정되며, POST 정보까지는 불러오지만 댓글 갯수를 불러오는 시점에서 흰화면이 생긴다.
    • 댓글 API를 호출하다가 에러가 발생하여 생기는 문제로 추정
    • DailyQeustion에서 isLoading이 끝나지 않아
      만 보여지는 것으로 추정getInitialData 실패시 재시도하고, 3번 실패시 에러페이지 띄우도록 구현 해결되지 않음isLoading의 문제인지 확인하기 위해 로딩 이미지 임시구현 및 getInitialData에 try-catch 추가=> 여전히 해결되고있지 않으며, 로딩이미지가 보여지지 않음

회고

위 개발일지는 문제를 해결하면서 혼자 작성했던 기록이다. “추정” → 테스트 → 해결안됨 이 반복되고 있는데, 여기서 추정은 논리적인 근거를 갖고 한 것이 아닌, 문제가 생기는 부분을 보고 이것이 문제일 것이다! 라고 추정한 것이다.

부끄럽게도 내겐 익숙한 문제해결방법이었고, 이것이 잘못된 것인지 몰랐다. 하지만 이 방법에는 맹점이 아주 많은데, 일단 짚이는 것을 문제라고 확정짓고 해결하기 때문에 왜 그런 일이 발생한지를 명확히 알지못하고, 문제를 찾을 수 있다고 확신할 수 없다. 그냥 이리저리 시도해보며 운좋게 문제가 해결되기를 바랄 뿐이다.


위의 경우에도 API를 호출할 때 문제가 발생하고, 네트워크가 느렸을 때 문제가 더 자주 발생한다는 점 때문에 계속해서 API에 문제가 있을거라 추측한다. 그러나 이는 API를 호출하는 과정에서 문제가 있었던 것을 알고 보면 아주 말도안되는 추측인 것이다.

파트장님은 계속해서 이러한 해결방법이 잘못되었다고 강조하셨으며 내가 쓴 코드에 명확한 근거가 있어야하고, 코드의 흐름을 보면서 근거를 찾아야 한다고 하였다. 때문에 브레이크포인트와 로그를 찍어보며 어디서 문제가 발생하는지, 그리고 문제가 발생한 원인과 흐름을 찾아 해결해야한다고 하였다. 눈에 보이는 문제가 나타나는 API 혹은 라이브러리보며 '이게 왜안돼?' 하며 짜증내는 것이 아니라 논리적, 그리고 객관적으로 문제가 생길 수 있는 곳을 찾아 해결해야 한다는 것이다.


누군가 좋은 디버깅이 무엇이냐 하면 말할만큼 누구나 말하는 좋은 디버깅이고 개발방법이지만, 나는 전혀 지키고 있지 않았다. 하지만 확신을 갖고 차분히 문제를 파악하고 해결해나가는 과정이 개발 실력이자 개발 철학이 아닐까 싶다. 그리고 파트장님은 이런 개발 방법을 내게 심어주기 위해 API, 리코일 탓이라고 헛짚는 나에게 계속해서 왜 이것이 문제라고 생각하는지 명확한 근거를 가지고 자신을 설득시켜보라고 했던 것이다.

그리고 문제가 해결되었을 때, 다시 한번 자신의 코드에 명확한 근거를 가지고 개발하는 것이 중요하다는 것과, 쉽게 읽을 수 있는 플로우를 가진 개발을 할 수 있도록 노력해야 한다고 하셨다. 내가 하루아침에 완벽한 흐름을 갖는 코드를 짜고 디버깅을 할수는 없겠지만 그렇게 할 수 있도록 계속해서 노력하려한다. 많은 기술을 알고 쓰는 것보다 이런 개발철학을 확고히 한 사람이 잘하는 개발자가 아닐까? 그리고 이런 개발철학을 남에게 알려줄 수 있는 사람이면 더더욱.