오늘까지(최신순)

  • 오늘은 배포를 하기로 되어 있는 날이었다. 거의 모든 작업이 다 완료된 상태였고, 마지막 남은, 지난 금요일에 해결했다고 생각한 문제가 유감스럽게도 QA 단계에서 다시 돌아왔다. 문제 현상이 뭔지는 알겠는데 원인을 모르겠고 버그를 재현하는 것조차 잘 안 되는 날이었다. 하루종일 붙잡고 있다가 결국 배포 직전에 탐탁지 않게 임시방편 식으로 해결되었다. 그래서 어쩐지 기분이 좀 찝찝하다. 이 찝찝함을 블로그 재시작으로 털어버리자
  • 지난 4월 중순, 새로운 업무분장에 따라 나는 팀을 옮기게 되었다. 이번 팀은 저번 팀에 비해 뭔가를 해결해 나가는 과정에서 내가 비교적 더 좌충우돌 하게 되는 경향이 있긴 한데 그래도(그래서?) 재미있다. 프레임워크도 Vue로 돌아오게 되었다. 완전히 새롭게 접하는 건 아니지만 예전 기억이 사실 가물가물하긴 해서, 옛 기억을 더듬어 가며 구글링을 해 가며 공식문서를 뒤져 가며 온갖 방법을 동원해서 하나씩 풀어 나가는 중이다.
  • 지난 2월부터 2개월간 몸과 마음이 많이 지쳐서 휴가를 냈었다. 길다면 긴 기간인데 감사하게도 회사에서 병가를 낼 수 있게 해주었다. 잘 만큼 자고, 쉴 만큼 쉬고, 약 잘 먹고, 밥 잘 먹고, 그 기간 중 특별하게 더 한 것은 없지만 그 덕분에 지금 다시 정상적으로 궤도에 오를 수 있었다고 생각한다.
  • 내가 잠수를 타기 전 썼던 마지막 블로그 글을 보면, 나는 재작년 10월 내가 애착을 가졌던 회사를 떠나게 되었고 다른 회사로 옮겼었다. 그리고 작년 2월에 나는 다니던 회사를 다시 떠났다. 이전 회사에서 겪었던 비슷한 문제를 그 회사도 겪고 있었기 때문이었다. 겨우 다시 마음에 드는 회사를 찾았다고 생각했는데 또 비슷한 이유로 떠나게 될 수도 있다니 황당하고 당황스러워서, 이제야말로 좀 더 안정적인 곳을 찾아봐야겠다고 생각했다. 그러던 중 이전 회사의 일부가 남아 다른 이름으로 물론 그 사이에 많은 일이 있었겠지만 여전히 서비스를 운영해 나가고 있다는 소식을 접했다. 나름대로 뒤도 돌아보지 않고 떠났다고 생각했는데, 사람 마음이라는 게 참 그렇지가 않았다. 이전 회사를 다닐 때보다 많아진 연봉을 다소 삭감하는 조건이었지만 그래도 좋았다. 옛 사랑에게 돌아가는 사람 마음이 이런 걸까 싶었다.

돌이켜 보면 내 인생은 반전으로 가득하다. 자의로든 타의로든, 아무런 전조 증상도 없이 인생을 180도 달라지게 한 수많은 터닝 포인트들을 생각해 봤을 때, 영향력의 순서를 매겨 보자면 그 0순위로 항해99를 꼽을 수 있겠다. 항해99를 수료하고 프론트엔드 개발자로서 걸음마를 시작한 지 이제 1년이 조금 지난 이 시점에, 당연하게도 항해99의 영향은 현재진행형일 수밖에.

항해99 회고는 지난번에도 한 번 올렸었다. 찾아보니 그것도 벌써 1년 전이다. 물론 과거가 바뀔 일은 없으니 항해99에서의 객관적인 경험들은 크게 다르게 적히지 않을 수도 있다. 하지만 그 이후 1년간 현업에서 느낀 점들을 토대로 조금 더 의미 있는 회고를 할 수 있지 않을까, 내 맘대로 기대해 본다. 저번에 쓴 글에서 영향 받지 않으려고 가급적 지난 회고를 읽지 않고 새로 쓰려고 하는데, 혹시라도 배치되는 내용이 있다면.. 민망할 예정..

 

- 목차 -
1. 사실, 나는 공무원이었다
2. 사실, 나는 개발자가 될 생각이 없었다
3. 사실, 나는 항해99에 참여할 생각이 없었다
4. 사실, 나는 항해99를 믿지 않았다(1)
5. 사실, 나는 항해99를 믿지 않았다(2)
6. 사실, 나는 그냥 잘 하면 다 되는 줄 알았다
7. 사실, 나는 내가 일을 한다고 생각한 적이 없다

 

 

1. 사실, 나는 공무원이었다

그것도 전공과 상관없이 누구나 시험만 잘 보면 되는 일반행정직 공무원이었다. 전공이 무엇이든, 학점이 몇 점이든, 더 나아가서는 최종 학력이 무엇이든, 시험에 합격한다는 전제 하에 누구나 가질 수 있는 직업, 그것이 나의 직업이었다. 그렇다면 내 대학교 전공? 그건 또 고고학이었다. 심지어 학과 수석으로 입학하고 학과 수석으로 졸업까지 했다. 하지만 전공 과목은 재미가 없었다. 당연히 전공을 선택할 당시에는 재밌을 줄 알았다. 고3 교실에 배달되어 온 수많은 대학교 홍보물들 중 유독 내 시선을 잡아 끈 학교였고, 흥미로워 보이는 학과였다. 기대를 안고 입학한 후 첫 전공 필수 수업에서 이건 아니라는 걸 깨달았고, 빠르게 포기했고, 나중에 하고 싶은 일이 생길 때를 대비해 학점 관리만 열심히 했다.

졸업이 다가올 때쯤, 공무원 시험 열풍이 불어 닥쳤다. 어느 학교나 비슷한 상황이었을 테지만 휴학한 동기나 선배들이 공시 준비를 해서 합격했다는 소식이 간간이 들려왔다. 아직 딱히 하고 싶은 일을 찾지 못해 학과 공부만 열심히 하던 나도 공무원 시험을 보기로 했고, 졸업 후 합격했다. 그리고 5년이 흘렀다.

 

 

2. 사실, 나는 개발자가 될 생각이 없었다

굳이 직접 공무원으로 일을 해 보지 않아도 어렴풋이나마 알 수 있겠지만, 업무를 통해 자아실현을 한다거나 성취감이나 만족감을 느끼기는 어려웠다. 그래도 그 당시 나는 이직에 대해서는 별 생각이 없었다. ‘개발자 취업이 붐이라더라’, ‘개발자가 돈을 많이 번다더라’ 하는 피상적인 얘기들은 들었지만, 그렇다고 마음이 동하진 않았다. 나는 개발이 뭔지 하나도 몰랐다. 그게 뭔지 알아야 취업 준비는 둘째치고 거기에 대해 관심을 갖든 말든 할 텐데, 나는 정말 그 어떤 것도 알지 못하는 상태였다.

그러니 개발, 코딩, 그와 관련된 것을 처음 시작하게 된 계기는 순전히 우연이었다. 나는 당시 나의 첫 반려동물로 고양이를 키우고 있었고, 친구들은 연락이 닿을 때마다 SNS에 고양이 사진을 올려 달라고 했다. 평소 SNS와는 거리가 멀던 인생이었지만 인스타그램 계정을 개설했고, 다른 사람들의 피드도 눈여겨 보기 시작했다. 그리고 2021년 5월의 어느 날, 가정의 달을 맞아 스파르타코딩클럽에서 HTML/CSS/JavaScript 기초에 대한 무료 강의를 제공한다는 광고를 보게 되었다.

요즘 애들은 초등학교에서 코딩을 배운다지만, 내가 기억하는 나의 초등학교 시절에는 컴퓨터실에서 선생님의 눈을 피해 피카츄 배구, 스타크래프트 같은 것들을 하며 친구들과 깔깔거리느라 바빴다. 그러니까 나는 코딩에 있어서는 초등학생보다도 무지했다. 무료고 길지도 않다는데 한 번 들어나 볼까, 하는 가벼운 생각으로 이 모든 일들이 시작되었다.

내 기억이 맞다면 그 강의는 다 합쳐 봐야 3시간 남짓이었는데, 오히려 시간이 짧아서 더욱 그랬을지도 모르겠지만, 아무튼 너무 재미있었다. 내 웹서핑 인생은 6살 때 쥬니어네이버로 시작되었지만, 웹사이트라는 것이 어떤 과정을 거쳐 만들어지는지는 그간 단 한 번을 생각해 본 적이 없었다. 그야말로 커다란 충격이었고, 나는 뭐가 있을지 모르는 이 다음이 궁금하다는 생각을 했다.

 

브라우저에 텍스트를 띄운다는 것만으로도 행복했던 시절 :)

 

3. 사실, 나는 항해99에 참여할 생각이 없었다

나는 개발자로 이직할 생각이 없었으므로 개발자 취업을 준비하는 코딩 부트캠프에 참여할 생각 또한 없었다. 앞서 언급했듯, 나는 그저 내가 수강했던 무료 강의의 다음 커리큘럼 격인 과정을 찾고 있을 뿐이었다. 무료 강의를 제공했으니 분명 그 다음에 연결되는 과정도 있을 거라고 생각해서 스파르타코딩클럽 사이트를 샅샅이 뒤져봤다. 40만원짜리 웹개발 종합반이라는 강의가 있었고, 내 상황에는 그게 가장 적합해 보였다. 커리큘럼을 살펴보니 그외에도, 조금은 더 전문적인 듯 보이는 심화 과정이나 앱을 개발하고 싶은 사람들을 위한 것과 같은 다양한 강의들이 운영되고 있었다. 그리고 아예 별도 메뉴로 항해99라는 게 따로 빠져 있었다.

지금은 모르는 사람이 많지 않지만, 항해99는 그 당시 부트캠프가 뭔지 몰랐던 내게는 매우 생소했고, 이제 막 2기로 참여할 사람들을 모집하는 중이었다. 별다른 관심이 없었기에 커리큘럼이라고 적혀 있는 말들을 봐도 이해하기가 어려웠고, 유튜브 라이브로 설명회가 열린다고 해서 ‘한번 들어보자’고만 생각했다.

 

 

결과적으로, 사전설명회를 듣고 나서 나는 항해99에 지원서를 제출했다. 베이스가 없는 비전공자여도 참여할 수 있고 개발자로서 취업할 수 있다는 게 흥미로웠다. 물론 나는 취업이 목적은 아니었지만, 수료하고 나면 일을 할 수 있다니 그만큼 체계적으로 운영된다면 나에게도 도움이 될 것 같았다. 그리고 무엇보다도 100% 온라인으로 진행되는 프로그램이었다. 당시 수도권이 아닌 지방에 살고 있었던 나로서는, 일부나마 오프라인으로 진행한다고 했다면 바로 그 점 때문에 포기를 고려할 수밖에 없었다. 어떻게 온라인으로만 진행한다는 건지 궁금하기도 했고, 공간의 제약이 없다는 것은 나에게 큰 장점이었다.

 

 

다만, 항해99에 참여하게 된다면 참가비 400만원을 내야 했다. 부트캠프를 여럿 놓고 고민하는 게 아니었기 때문에 그땐 그것도 여타 부트캠프에 비하면 저렴한 거라는 사실조차 몰랐다. 40만원짜리 웹개발 종합반을 수강하려던 당초 계획에 비하면 확실히 너무 큰 금액이었다. 그런데 항해99에 참여하려면 1차로 지원서를 제출하고, 2차로 면접까지 봐야 한다고 했다. 나는 그거야말로 내가 항해99에 참여할지 말지를 고민해 볼 시간적 여유를 가질 기회라고 생각했다. 어차피 최종적으로 합격하기 전에는 400만원을 내지 않아도 됐다. 1차에서 떨어지면 고민의 여지도 없을 테니 차라리 다행이고, 만약 면접을 봐야 한다면 그때 가서 내 마음이 어떨지 확실하게 알 수 있을 것 같았다.

지원서가 통과된 후 항해99에서 전화가 왔다. 예정에 없이 길게 이어진 통화에서 나는 사실대로 말했다. 개발자로 취업을 꼭 하고 싶어서 지원한 건 아니다, 원래는 웹개발 종합반을 들으려고 했다, 아직 아는 건 별로 없지만 코딩은 재밌더라, 그래서 더 배워보고 싶다, 등등. 그리고 꿀팁을 얻었다. 항해99는 본격적으로 시작하기 전 최대 2주의 사전 준비 기간을 주는데 그때 웹개발 종합반 강의를 제공하며, 만약 그 기간 중에 하차하게 된다면 물론 하차를 권고하는 건 아니지만 웹개발 종합반 수강료에 해당하는 금액을 제외하고는 환불이 된다고 했다. 솔깃했다. 나는 애초의 계획을 그대로 실천할 수 있으며, 혹여 그 이상으로는 더 하고 싶지 않더라도 손해 보지 않을 수 있었다. 그 전화 한 통으로 나는 항해99에 참여할 의지를 굳혔다. 그리고, 애당초 나는 면접 경험을 통해 참여 여부를 스스로 확정짓고 싶었지만, 나의 학습 의지와 대화하는 태도를 높이 평가한 항해99로부터 본의 아니게 면접 자체를 면제 당하고(?) 말았다.

그리고 코딩은, 개발은, 계속해서 재미있었고 그 다음이 계속해서 궁금했으므로 나는 결국 중도하차라는 선택지는 단 한 순간도 고려해 보지 않은 채 그대로 수료해 버리고 말았다.

 

 

4. 사실, 나는 항해99를 믿지 않았다(1)

항해99에서 귀에 못이 박히도록 강조하는 말이 있다. 함축하자면, ‘현업도 이렇다’는 말이다. 다른 코딩 부트캠프가 어떤 컨셉과 시스템으로 돌아가는지는 알 수 없으나, 항해99는 말 그대로 참여자들을 선원으로 삼아 바다를 항해하게 한다. 무작정 앞으로 나아가는 과정에서 만나는 어려움은 때에 따라서는 혼자서 해결해야 할 수도 있고, 팀원들과 함께 헤쳐 나가야 하는 것일 수도 있다. 당연히 손 들고 질문하면 언제든지 도움의 손길을 내밀어 줄 튜터들, 매니저들, 멘토들이 있다. 하지만 항해99에서 강조하는 건, 누군가의 도움에 전적으로 의지하기보다는 비록 해결책에 이르지 못할지라도 우선 스스로 생각해볼 수 있는 태도를 가지는 것이다. 결국 질문을 하게 되더라도, 그 전에 한 번 더 고민해 보고 이해해 보려고 노력하는 태도.

이건 내가 대학 입시를 준비할 때의 트렌드였던 ‘자기주도학습’ 컨셉과도 어느 정도 일치해 보였다. 그게 왜 중요한지는 고등학교 내내 인이 박이도록 들었으므로 같은 맥락에서 항해99의 요지도 이해할 수는 있었다. 하지만 언제나 당사자 입장에서는 잘 모르듯이 항해99에 참여하던 당시에는 이런 것들이 다소 무책임하게 느껴졌다. 참가비를 받고 운영하는 교육 과정인데도 스스로의 학습과 노력을 지나치게 강조한다고 생각했다. 나는 노베이스 비전공자의 대표 주자로서 관련 지식이 부족하기 때문에, 그렇지 않은 다른 사람들과 비교된다는 생각이 들 때마다 이 격차를 도대체 어떻게 극복해야 하나 싶어서 주눅이 들기도 했다.

 

 

그렇지만 항해를 수료한 지 14개월, 개발자로 커리어를 쌓기 시작한 지 13개월이 지난 지금, 항해99의 기조는 이보다 더 옳을 수 없다고 생각한다. 그때의 나는 현업을 경험해 보지 못했기 때문에 눈앞에 보이는 것들에만 치중했고, 그럴 수밖에 없었다. 오히려 시간이 지난 지금에야 항해99에서 얼마나 참여자들을 내실 있게 키워 내려고 했는지 보이는 것 같다. 코드나 개발 언어, 프레임워크 같은 것들에 대한 객관적인 지식은 구글링을 통해 얻을 수 있고, 책을 읽어도 알 수 있다. 그리고 그 방대한 것들은 접했다고 해서 머릿속에 다 넣을 수 없으므로, 어차피 필요한 순간이 오면 자신을 의심하며 다시 검색하고 다시 찾아보게 될 것이다. 누군가에게 물어볼 수 있는 환경에서라면 질문을 함으로써 손쉽게 시간을 단축할 수 있겠지만, 그마저 여의치 않은 환경에서는 결국 혼자서 찾아 나가야 한다. 하지만 나에게 무엇이 필요한지, 필요한 것은 어떻게 찾아야 하는지, 또는 크고 작은 위기에 어떤 자세로 임해야 하는지를 모른다면 개발 자체를 할 수가 없다. 급변하는 기술들 사이에서 개발자로서 살아갈 수도 없을 것이다.

그런 의미에서 항해99는 참여자 개개인에게 1주일에 100시간을 할애해 몰입할 것을 강조한다. 처음에는 100시간을 채워야 한다는 게 부담처럼 느껴지기도 했다. 하지만 어느 순간 나도 모르게 스스로 한다는 것이 무엇인지 알았고, 공부하기에 100시간은 턱없이 모자라다는 것을 깨닫게 되었다. 아침 9시에 컴퓨터 앞에 앉아서 새벽 2, 3시까지, 때로는 해 뜨는 것을 보면서도 아직 부족하다는 생각에 피곤한 줄을 몰랐다. 개발자도 사람인데 당연히 평생 개발만 하며 밤을 샐 수는 없다. 하지만 이렇게 치열하게 보낸 99일은 개발자로 사는 삶의 밑바탕이 되기엔 더할 나위 없었다고 생각한다.

 

정규 커리큘럼의 첫 팀 프로젝트에서 그렸던 와이어프레임 :)

 

5. 사실, 나는 항해99를 믿지 않았다(2)

또 한 가지 내가 항해99를 의심했던 부분은 ‘동료 개발자들과의 커넥션’이었다. 같은 기수로서 동고동락하며 지낸 서로가 나중에 현업에서도 큰 힘이 될 거라는 것이었다. 인싸가 아닌 사람으로서, 이건 솔직히 처음부터 그냥 이해가 가지 않았다. 두 번의 개인 과제와 강의 수강 기간을 제외하고는 전부 협업해야 하는 팀 프로젝트라고는 했지만, 그렇다고 해서 내가 팀원들에게 얼마나 유대감을 가질 수 있을지 의문이었다. 하물며 같은 팀이 아니어서 접점조차 찾기 힘든 사람들에 대해서는 말할 것도 없으리라 싶었다.

그러나 앞서 말했듯이, 주에 100시간, 일요일 하루 쉰다고 해도 하루에 16시간 이상을 함께하는 사람들이라면, 비록 16시간 내내 서로 얼굴 보고 이야기를 나누는 것이 아니더라도 혼자라면 외로웠을 그 시간을 함께하는 누군가가 있다는 걸 아는 것만으로도 어느새 든든해지기 마련이었다. 처음에는 나 자신이 한없이 부족하다고 생각해 남들과 비교하면서 계속 작아지기도 했지만, 팀 프로젝트가 계속되고 팀원들과 얘기를 나누고 고민이나 노하우들을 공유하면서 서로 동기부여를 하고 시너지를 낼 수 있었다. ‘오늘은 컴퓨터 내가 더 늦게 꺼야지’ 하는 작은 오기가 생기기도 했다.

나는 원체 발이 넓은 사람이 아니라서 가까이 지낸 사람들이 많진 않지만, 항해99에서 처음 만나 지금까지도 계속 연락하며 관계를 유지해 나가는 친구들이 생겼다. 수료 이후 각자 취업하고, 일하고, 여러 가지 사건들을 겪으면서도 여전히 소식을 전하고 정보를 나누고 있다. 글을 써 내려가다 보니 두 번째에 위치하곤 있지만, 내가 항해99에서 얻은 가장 귀중한 건 다른 무엇도 아닌 이 친구들이라고 생각한다. 나의 힘들고 바빴던 시간을 함께했고, 나의 발전 과정을 직접 목격해 주었고, 그렇기에 나의 가능성을 알아주고, 한편으로는 각자 스스로 노력해서 개발자가 된, 끈기 있는 바로 그 친구들.

 

화질구지 너무 죄송합니다ㅠㅠ

 

6. 사실, 나는 그냥 잘 하면 다 되는 줄 알았다

위의 내용과 이어지면서도 한편으로는 반대되는 얘기이다. 초반에는 단편적으로, 나처럼 비전공 노베이스라서 부족한 상태로 시작하더라도 ‘꾸준하게’ ‘열심히’ 노력해서 결과적으로 어떻게든 ‘잘’ 하면 무사히 수료하고 성공적으로 취업할 수 있다고 생각했다. 내가 내 부족함을 깨닫고 학습 시간을 최대 한도로 늘려 나가고 있을 때는 더더욱 그랬다.

하지만 아무리 혼자 노력하고 잘 해 나간다고 해도, 팀 프로젝트가 주를 이루고 있는 커리큘럼 상, 또 100% 온라인이어서 참여자 현황을 쉽게 파악할 수 있는 시스템 상, 다른 사람에게 받는 영향이 클 수밖에 없었다. 내가 알고 지냈든 모르고 지냈든, 중간에 포기하고 하차하는 사람들도 있었다. 나중에라도 들어보면 그 원인은 다양했다. 친하게 지내는 사람이 하차를 결정했다는 이유로 여러 명이 같이 하차하는 경우도 있었다. 중도하차에 대한 고민은 당연히 손해를 감수하고서라도 그런 결정을 내린 스스로가 가장 깊게 했을 테지만, 그로 인해 분위기가 뒤숭숭해지는 것은 어쩔 수 없었다.

그리고 취업에 있어서는 팀 프로젝트, 특히 마지막 실전 프로젝트의 결과물이 가지는 비중이 크기 때문에 실전 프로젝트가 시작되기 전부터 일찌감치 좋은 팀을 구성하기 위한 눈치 게임이 벌어졌다. 그 과정에서 서로가 서로의 움직임을 파악하고, 소문이 돌고, 잡음이 생기고, 그런 기류 감지에 둔감한 나조차도 뭔가 이상하게 돌아가는 것 같다고 느낄 정도였다. 하지만 당시 그런 어수선함을 적절히 관리하거나 애초에 통제하거나 하는 식의 운영이 원활하게 이루어지지 않았던 점은 아쉬웠다. 마찬가지로 중도하차 이슈에 대한 사전, 사후 관리도 있었으면 좋았을 것 같다. 물론 나는 초반 기수인 2기(21.06.07~21.09.13)였으므로 지금은 훨씬 나아졌을 것이라고 생각한다. 이와 관련해서 최근 항해99 측을 통해 들은 얘기로는, 현재는 눈치를 보며 팀을 구성하는 방식은 아니라고 한다. 당시에는 많이 아쉬웠던 부분인데 이게 개선되었다니, 항해99 수료생 입장에서는 정말 다행이다.

 

 

7. 사실, 나는 내가 일을 한다고 생각한 적이 없다

나는 항해99 2기를 무사히 수료하고 결국에는 개발자가 되었지만, 그렇게 하지 않았거나 하지 못한 사람들이 나보다 뭔가가 부족해서 그랬다고는 생각하지 않는다. 그 사람들과 나는 시작점이 같았지만, 나는 개발을 재밌어 해서, 그리고 운 좋게도 이게 나의 적성에 맞았던 덕분에 여기까지 온 거라고 믿는다. 말 그대로 운이 좋았다. 혹시라도 적성에 맞지 않는다는 것을 항해99 시작 후에 알았다면, 아니면 수료한 후 첫 취업을 해서 뒤늦게 알았다면, 틀림없이 내적 갈등을 겪었을 게 분명하다. 나는 항해99에서 내 적성을 찾았기 때문에 큰 문제를 겪지 않았다.

커리어를 시작한 지 1년을 갓 넘긴 개발자로 지금도 회사에서 일을 하고 있지만, 일을 하는 순간에도 내가 일을 하는 건지 노는 건지 분간이 안 갈 때가 있다. 그만큼 업무의 매 순간이 재미있다. 퇴근 시간이 오기를 손꼽아 기다려본 적이 없는 것 같다. 애초에 일하던 중에 지금이 몇 시쯤 되었는지 궁금하지 않다. 그저 나는 하루하루 재미있는 일을 하고 있을 뿐인데 이걸 내 업무, 내 직업이라고 불러주는 게 고마울 따름이다.

그래서 나는 누군가 개발자로 취업하기를 희망하고 있다면, 그게 연봉 같은 표면적인 이유 때문만은 아니었으면 좋겠다. 개발자라는 이유로 연봉이 무조건 많은 것도 아닐 뿐더러, 말마따나 재미없는 업무를 하는데 생계 유지만을 위해 다니는 직장이라면 연봉이 많다고 한들 그게 의미가 있을 리가 없다. 개발이 대략적으로라도 어떤 일인지, 끊임없는 공부가 필요한 일인지를 알고, 그게 재미있고, 그래서 개발자 취업을 희망한다면 꼭 한 번쯤은 자신있게 그 문을 두드려 봤으면 좋겠다.

 

 

'항해99 > 08_회고' 카테고리의 다른 글

내 인생을 바꾼 부트캠프, 항해99를 돌아보며  (6) 2021.10.31

오늘 한 일

  • 2주에 한 번씩 월요일은 한 스프린트의 마지막날이 된다. 오늘이 그날이었고, 따라서 지난주 금요일에는 이번 스프린트에서 개발한 기능들이 제대로 돌아가는지 내부 테스트와 마무리 작업을 거쳤다.
  • 그러나 항상 그렇듯, 꼭 거의 마지막이 되어서야 급하게 해야 하는 작업이 생긴다거나, 그동안 풀리지 않던 것이 그제야 실마리를 내보인다거나, 또는 평소와는 다른 집중력이 발휘되어 일의 효율이 높아지기 일쑤지만 이건 내가 평소 게을러서인 것 같다. 아무튼 금요일 업무 시간이 끝나기 1~2시간 전에 여러 pr들이 올라갔고 동시다발적으로 각 피쳐 브랜치에서 dev로 머지 되었다.
  • 그리고 그렇게 잘 마무리된 줄 알았지만, 주말 내내 푹 쉬고 가볍게 시작한 월요일 아침에 지난 주까지의 작업들이 개발 서버에 잘 올라갔는지 확인하던 찰나 뭔가 이상하다는 걸 깨달았다. 별다른 특이사항은 없었던 것 같은데 해당 기능이 반영되지 않은 것이었다.
  • 급히 민에게 확인을 부탁했고, 그래서 aws elastic beanstalk 로그를 확인해 보니 헬스 체크에 문제가 있었고, 이것저것 찾아보다가 덴마에게 여쭤본 결과 아무래도 pr이 동시에 올라가 똑같은 워크플로우가 여러 개 돌다 보니 충돌이 일어난 것 같다는 결론을 주셨다.

오늘 배운 것

  • 배포할 때 깃헙 액션에서 사용하는 워크플로우 yaml 파일에 concurrency라는 설정을 넣으면, 같은 그룹으로 묶인 워크플로우는 한 번에 하나만 실행된다. 이미 같은 워크플로우, 또는 같은 그룹의 워크플로우가 실행되고 있는 경우, 실행 중인 워크플로우를 취소하고 새로운 워크플로우를 실행할 수도 있다.
concurrency:
	group: ${{ github.ref }} # 또는 github.base_ref, github.head_ref를 넣기도 한다.
    	cancel-in-progress: true
  • 공식문서에 나와 있는, concurrency 설정에 대한 자세한 설명.
 

Workflow syntax for GitHub Actions - GitHub Docs

About YAML syntax for workflows Workflow files use YAML syntax, and must have either a .yml or .yaml file extension. If you're new to YAML and want to learn more, see "Learn YAML in Y minutes." You must store workflow files in the .github/workflows directo

docs.github.com

  • concurrency 이외에도, 효율적이고 경제적인 github CI workflow 설정에 대해 정리한 블로그 글이다.
 

Home

yceffort

yceffort.kr

 

  • 많은 일이 있었다.
  • 사랑하려고 노력한 적은 없었지만 사랑할 수밖에 없는 회사였다. 직장 생활 경험이 없는 것도, 짧은 것도 아니었는데 진심으로 사람을 사랑하듯 회사를 사랑하게 될 줄은 몰랐다. 일을 하는 하루하루가 행복했고, 주말은 평일을 기다리는 시간에 불과했다.
  • 그런 회사가 없어졌다. 이제 좀 업무에 익숙해지고, 생활 패턴도 그에 맞게 바꿔 나가고 있던 와중에 하루 아침에 마음이 공허해졌다. 내가 곧 백수가 될 예정이므로 구직을 다시 해야 한다는 것은 오히려 아무것도 아니었다. 그건 번거롭긴 해도 그냥 하면 되는 일이었다. 심지어 나 혼자만 해야 하는 일도 아니었다. 그저 유일한 문제는, 이 회사가 없어진다는 것이었다.
  • 책상을 정리하기 위해 간만에 출근한 사무실에서 누군가 그랬다. 세상에 완벽한 회사란 있을 수 없으니 이 회사도 없어지는 거라고. 그 말에 공감했다. 이런 얘기는 영화나 드라마에 나와도 비현실적이라고 손가락질 당할 소재였다. 하지만 현실은 위대했다.
  • 고용 계약 종료를 한 달 앞둔 시점부터 이직 준비를 시작했다. 사람들과 아무리 회사에 대해 섭섭한 점, 아쉬운 점을 끝없이 늘어 놓으며 마음을 털어 버리려고 애써도 혼자가 되면 어김없이 밑바닥까지 가라앉았다. 닥쳐올 현실에 채찍질 당하면서 이력서를 쓰고 면접을 봐도 그때뿐이었고 자꾸 힘이 들었다. 어떤 새로운 회사에 가도 회복할 수 없을까 봐 걱정도 됐다.
  • 한편으로는 내가 선택할 수 있는 범위 내에서 최대한 비슷한 분위기, 비슷한 문화를 가진 회사에 가고 싶어서 수많은 구인 공고를 보며 일말의 유사성을 찾겠다고 기를 썼다. 사실 그렇게 한다고 해도 유의미한 성과가 있을지는 미지수였다. 들어가서 근무해 보는 당사자가 되기 전에는 알 수 없는 것들이니까.
  • 아등바등 바쁘게 한 달을 보낸 덕에 운 좋게도 업무일 기준 계약 종료 다음날 바로 새 회사에 출근하게 되었다. 내 나름대로 고르고 골라서 지원한 회사였고 면접에서도 느낌과 인상이 좋았지만, 혹시나 내 기대치를 충족하지 못하더라도 이제는 어쩔 수 없다고 생각했다. 하지만 출근 첫날 바로 알았다. 설마 나를 여기 오게 하려고 코드브릭이 없어진 걸까.
  • 입사 9일차, 하지만 공교로운 공휴일 탓에 뭐했다고 벌써 3주차, 현재 온보딩 중인 뉴비다. 회사 자체나 구성원들, 시스템, 문화, 코드에 이르기까지 배울 것들이 넘쳐나서 정신없이 지내고 있다. 블로그에 코드브릭이 없어졌다고 아무렇지 않게 쓸 수 있게 될 날이 이렇게 금방 올 줄은 몰랐다. 회사는 회사로 잊어야 하나 보다.

지금까지 한 일

  • 지난달 말이 SSO 릴리즈였기 때문에 지난달에는 기능을 개발하고 에러를 잡는 데 거의 모든 시간을 썼다. 애초에 로그인에 관련된 것들을 다루는 프로젝트였던 만큼 스코프가 아주 크지 않았기 때문에, 내가 괜히 이유 없이 혼자 걱정하고 안절부절 못한 것과는 별개로 업무적으로 부담이 크진 않았다.
  • 프로젝트 성격상 시한부(...) 팀이었던 게 어느 정도 명확했던 만큼, 이후에 팀 배정은 어떻게 되며 이 프로젝트는 어떻게 되는지에 대해 얘기가 슬슬 나오기 시작했다.
  • 그러다 릴리즈를 열흘 정도 앞둔 시기에, 케이트님의 퇴사로 프론트엔드가 빠지게 되는 스토어싱크 팀에 가면 적당할 것 같다는 결론이 나왔다. 그리고 스토어싱크는 8월 말에 릴리즈 예정... 릴리즈 전문?
  • 그렇게 해서 SSO 릴리즈 주간에 살짝살짝 인수인계를 받으며 스토어싱크 쪽 업무에 발을 담그게 되었고, 이번주부터는 본격적으로 팀을 옮겨서 일을 시작하는 중이다.
  • 개인적으로 뷰티파이를 좋아하지 않아서 SSO가 Vue 3인 게 참 마음에 들었었는데, 스토어싱크로 와 보니 여긴 Vue 2라서 뷰티파이를 쓰고 있다. 간만에 보는 Vue 2+뷰티파이 조합의 코드라 눈에 잘 익지 않았는데, 엊그제는 세훈님과 6시간짜리 페어 프로그래밍 덕에 프로젝트 디렉토리 구조를 좀 익힐 수 있었다. 어제는 세훈님이 주신 태스크를 혼자서 삽질해 보면서 연습하는 시간을 가졌고, 오늘 드디어 pr을 날릴 수 있었다. 근데 여기는 리뷰를 영어로 달아주시네요 엉엉 세훈님 말씀처럼 릴리즈 이후에라도 조만간 전체적으로 리팩토링을 할 수밖에 없는 상황이라 일단은 동작하는 코드를 만드는 데 우선순위를 뒀다.
  • 지금까지 코드 읽는 것만으로도 삐걱대느라 시간이 걸렸지만 앞으로는 조금 더 속도가 붙지 않을까, 희망회로를 돌려본다.

오늘 한 일

  • 요 근래 나에게 할당되었던 지라 카드는, 나 혼자서만 처리할 수 있는 게 아닌 걸 제외하고는 오늘까지 어느 정도 쳐낼 수 있었다.
  • 그런데 기존 서비스에서는 회원가입할 때 비밀번호가 대소문자, 숫자, 특수문자 상관 없이 8자리 이상이면 무조건 통과되는데, sso에서는 영소문자와 숫자 8자리만 통과되게 해놓았다. 과거의 나 도대체 무슨 짓을... 이러닝 서비스 관련해서 API 문서 정리의 필요성이 대두되던 찰나 어차피 한 번은 손 봐야 하는 비밀번호 규칙을, 일단은 기존 서비스와 동일하게 맞춰 놓았다. 유효성 검사 파일을 따로 플러그인으로 빼놓는 작업을 할 때부터 비밀번호 규칙을 (딱히 존재하지 않더라도 상식적인 선에서 적당히) 염두에 두고 했을 텐데 이렇듯 엉망인 결과가 뒤늦게 나오기도 하는 거였다...어메이징 주니어 아무튼 아직은 selected for development 되지는 않은(하지만 나에게 배정된) 카드에 현황을 간단히 남겨 두었다.
  • 스스로도 당연히 그럴 리 없을 거라고 생각하지만, 혹시나 어디서 이 규칙과 관련한 걸 보고 내가 그렇게 작업을 했었던가, 싶어서 피그마부터 여기저기 뒤져보았는데 그러다 점점 달라지고 있는 디자인을 목격해 버리고 말았다. 아직 많은 부분이 바뀌지는 않았지만 역시 UI에서 벗어날 수 없는 운명인가 보다. 😂

오늘 배운 것

  • ㅋㅋ지금 보니 제목 너무 어그로인 것 같다. vue-i18n으로 번역을 하다 보면, 번역 대상인 텍스트 안에 태그나 컴포넌트를 통째로 넣어줘야 할 때가 있다. 예를 들면, 궁극적으로 번역하고 싶은 건 p 태그로 감싼 'Hi, my friend {name}'인데 이 name 부분에 단순 string이 아닌 b 태그를 넣고 싶다거나 하는 경우다.
<p>Hi, my friend {name}</p>
<b>{name}</b>
  • vue에서는 v-html directive를 사용해서 HTML 태그를 직접 불러오게 할 수도 있다. 하지만 아래 링크에도 나와 있듯이 XSS(Cross-site Scripting) 공격에 취약한 방법이다.
 

Template Syntax | Vue.js

 

vuejs.org

 

XSS - 나무위키

XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋다. 보안은 한없이 덧대도 끝이 없고, 아래 서술한 방식으로 구성해도 기

namu.wiki

  • 이럴 땐 i18n-t 컴포넌트를 사용할 수 있다.
<i18n-t keypath="HI_NAME" tag="p">
	<b>{{ t("MY_FRIEND"), {name} }}</b>
</i18n-t>
en: {
	HI_NAME: 'Hi, {0}'
    	MY_FRIEND: 'my friend {name}'
},
ko: {
	HI_NAME: '안녕, {0}',
    	MY_FRIEND: '내 친구 {name}'
}
  • 그래서 만약 name이라는 변수에 'Jane'이라는 문자열이 할당되었다면 출력 결과는 다음과 같을 것이다.
<p>
Hi, my friend <b>Jane</b>
</p>

또는

<p>
안녕, 내 친구 <b>Jane</b>
</p>
  • 자세한 내용은 아래 링크 참고
 

Component Interpolation | Vue I18n

Component Interpolation Basic Usage Sometimes, we need to localize with a locale message that was included in a HTML tag or component. For example: I accept xxx Terms of Service Agreement In the above message, if you use $t, you will probably try to compos

vue-i18n.intlify.dev

 

지금까지 한 일(기억 나는 대로)

  • 구글 로그인은 API 변경 이후로, 가장 최신 버전을 적용하면 버튼에 커스텀 디자인을 입힐 수 없다. API 하나하나 분해(ㅋㅋㅋ)해서 입혀 보려고도 해봤으나 쉽지 않았다. 그래서 커스텀 디자인을 넣을 수 있다는 라이브러리를 찾아서 그 코드를 뜯어 보았지만 내가 라이브러리 없이 했을 때 맞닥뜨리는 문제를 똑같이 만나게 되어서 라이브러리도 별 수 없구나 하는 것을 배웠다. 물론 문제가 다른 데 있을 수도 있지만
  • 구글을 가지고 이렇게나 헤맨 것치고 페이스북 로그인은 붙이기 쉬웠다. 반나절 만에 기능을 작동시킬 수 있었고, 커스텀 디자인도 물론 페이스북의 디자인 가이드를 따르긴 해야겠지만 기술적으로는 어떤 디자인이든지(심지어는 디폴트 버튼 그 회색 그것마저도...) 적용할 수 있었다. 하지만 지난 4월쯤? 페이스북은 한 번 붙이려다가 실패를 맛본 경험이 있었는데, 그건 페이스북 API가 까다로워서라기보다는 페이스북 API는 구글과 달리 테스트조차도 무조건 https 환경에서만 가능한데, 그땐 로컬호스트를 https로 돌리는 방법을 제대로 실행하지 못했기 때문이었다. 저번에 영봉님을 통해 알게 된 caddy를 이용해서 의외로 손쉽게 이 부분을 해결하고 나니 나머지 문제는 일사천리로 해결되었다.
  • 요즘은 SSO 릴리즈 일정이 잡힌 후 개발 속도를 내고 있는 주간이어서 승진님이 만들어 두신 지라 카드 작업을 하고 있다. 그 와중에 구글 로그인과 관련해서 현지 팀과 계속해서 얘기를 할 일이 생겨서 이제까지 안 쓰던 영어를 어제부터 잔뜩 쓰려니 골이 아프다. 인도네시아어 번역이 누락된 부분이라든지, 구글 로그인 버튼 자체에 언어 설정을 적용하는 것이라든지, 어쨌든 브랜치를 하나 따서 관련된 작업을 하다가 연락이 뜸한 시점에는 또 다른 카드의 작업을 하는 식으로 진행하고 있었다.
  • 그 다른 카드의 작업이 마무리되어서 push를 하기 전에 git log를 한 번 확인해 봤는데, 브랜치를 새로 안 따고 구글 브랜치에 그대로 작업한 것을 깨달았다. 터미널에서 브랜치 이름 그렇게 봐 놓고도 몰랐다니 😞
  • 그래서 이번에 정확히 어떨 때 사용하라는 건지 와 닿지 않았던 git cherry-pick을 처음 써 보게 되었다.

오늘 배운 것

# branch A에서 branch B로 옮기고 싶다면

# branch A에서 옮기고 싶은 commit의 hash를 적어둔다
git log

# 그리고 branch B로 바꾼다
git checkout [branch B]

# commit이 하나인 경우
git cherry-pick [hash]
# commit이 복수인 경우
git cherry-pick [hash0] [hash1] [hash2]
# 어느 범위의 commit을 통째로 옮기고 싶은 경우
git cherry-pick [older hash]^..[newer hash]

git commit

지금까지

  • 개막이라도 하듯 6월의 시작과 함께 많은 일들이 있었다. 내가(또는 인간이) 참 많이 나약하다는 것을 깨달았고, 더 이상 이대로는 안되겠다고 생각했고, 병원의 힘을 빌리기로 했다. 그래서 지금까지도 병원 문턱이 닳도록 드나드는 중이다. 비록 한편으로는 약의 부작용으로 또 다른 고생을 하기도 했지만, 어찌 됐든 결과적으로 그럭저럭 상황은 이전보다는 많이 나아진 듯 보인다.
  • 글을 쓸 마음의 여유가 없었는데 또 그런 것치고는 업무 시간에 알게 된, '이거 나중에 블로그에 올려야지' 하고 저장해 둔 링크들이 많다. 시간 날 때마다 조금씩 정리해봐야 할 것 같아서 오늘을 그 시작으로 할까 한다.
  • 지금껏 거의 3주간 무슨 일을 했느냐 하면, ...기억이 안 난다. 이래서 기록이 중요한 건데 말이다. 계속 뭔가 해 왔고, 하면서도 '와 세상에! 나라는 바보가 이런 멍청한 실수를 한다' 하면서 자책하듯이 웃었던 적도 꽤 많았는데 진짜 하나도 기억이 안 난다. 되짚어 가면서 소급해서 적기보다는 앞으로 게을리하지 않는 게 나을 것 같다는 건 나만의 생각(합리화).

그 언젠가 배운 것

  • 언젠가는 SSO에서 번역을 담당(?)하던 json 파일의 역할을 지완님이 i18n이라는 플러그인에 넘기셨었다. json 파일은 아무리 사용자가 설정한 언어에 따라서 다른 텍스트를 보여준다고 하더라도 그 과정 자체를 직접 만들어야 하고, 날것 그대로의 느낌이 있을 수밖에 없다. 하지만 i18n을 사용하면 그런 수고로움을 덜 수 있고, 상황에 따라 달라지는 변수를 넣어 텍스트를 바꿀 수도 있다.
  • 그런데 이때 텍스트에 특수문자를 넣고 싶다면 이것이 말 그대로 literally string이라는 것을 알려줘야 한다(literal interpolation). 예를 들면 이메일 주소에 들어가는 @라든지. 이걸 literal 처리하지 않고 사용해 보니 콘솔에 에러가 찍히면서 화면 자체가 출력되지 않는 일이 발생했다.
 

Message Format Syntax | Vue I18n

Message Format Syntax Vue I18n can use message format syntax to localize the messages to be displayed in the UI. Vue I18n messages are interpolations and messages with various feature syntax. Interpolations Vue I18n supports interpolation using placeholder

vue-i18n.intlify.dev

  • 이외에도 여러 변수를 한 번에 같이 출력하고 싶을 때에는 해당 부분을 {0}, {1} 하는 식으로 표현하는 list interpolation도 많이 사용하게 됐다.
 

Message Format Syntax | Vue I18n

Message Format Syntax Vue I18n can use message format syntax to localize the messages to be displayed in the UI. Vue I18n messages are interpolations and messages with various feature syntax. Interpolations Vue I18n supports interpolation using placeholder

vue-i18n.intlify.dev

+ Recent posts