2023년 회고
- 2023/12/31

2021년 초에 개발을 처음으로 시작한 이래로, 벌써 3년차의 해가 저물고 있다. 올 한해를 되돌아보며, 탐색을 위한 한해였다고 요약할 수 있겠지만, 조금 더 솔직하게 표현하자면 갈팡질팡했다는 말이 더 어울릴 것 같다. 퇴사, 학업, 그리고 커리어 고민으로 가득했던 24살, 2023년.

1. 퇴사

3월, 1년 2개월간의 근무를 마친 후 토스를 떠났다. 당시 졸업까지 3학기(47학점)가 남아 있었는데, 새 학기가 시작되는 3월이 다가오니 학업과 직장 중 어느 쪽을 이어갈지 고민이 많았다. 회사에서는 가끔 자퇴를 권유하시는 분들도 계셨지만, 솔직하게 대학 진학을 위해 기울였던 노력이 인생에 큰 의미를 지니고 있는 터라 졸업은 꼭 하고 싶었다. 체력만 뒷받침해준다면 학업과 직장을 병행을 하고 싶었지만, 최소 5학기는 수강을 해야하는 데다 학교의 지리적 제약으로 그것은 현실적이지 않음을 알고 있었다.

결국 퇴사를 결정하고 더 늦기 전에 관련 의사를 팀 리드, HRBP, 챕터 리드 분들과의 면담을 통해 전달드렸다. 퇴사는 처음이라... 퇴사조차 낯설고 헤매는 것이 많았다. 초보같은 나에게 배려를 많이 해준 팀원들에 대한 감사한 마음이 크다.

토스에서의 시간은 배움과 성장으로 가득했다. 이 기간 동안 내가 부족한 부분을 명확히 파악할 수 있었다. API 설계, 버전 관리, 문서화, 커뮤니케이션을 더 잘 하고 싶다. 다양한 기기에서 잘 작동하는 안정적인 코드를 작성하고 싶다. 팀원들에게 지식을 나누어 다같이 성장하는 팀을 만들고 싶다. 등등... 많은 숙제를 남겨주며 회사 생활은 마무리되었다.


2. 학업

봄학기

2023년 봄학기에는 인공지능, 데이터베이스, 데이터통신, 시스템프로그래밍을 수강했다.

인공지능

인공지능의 모든 역사를 아주 넓고 얕게 다루는 수업이었다. 초반에는 다양한 환경에서의 Search 방법에 대해 배웠고, 후반부에서는 Machine Learning, Deep Learning, Language, Vision 이렇게 거대한 주제들을 무려 한 강의에서 빠르게 끝내버리시곤 했다. 교수님이 수업을 자주 당일에 취소해버리시고 플립러닝이라면서 수업을 제대로 해주시지 않아서 애정을 갖기 어려웠다.

과제로 CNN을 이용한 Image Classifier를 구현했는데, 처음으로 Deep Learning을 구현해본 것이라 조금은 도움되었고 기억에 남는다. Github

데이터베이스

Relational Model, SQL, ER Model, Indexing, Transaction, Concurrency, Recovery 등 DB의 기초적인 내용에 대해 다루는 수업이었다. 1990년대부터 거의 비슷한 커리큘럼으로 진행해오셔서 그런지 아주 안정적이었다. 같이 수강했던 어떤 백엔드 개발자는 실무와 거리가 멀다며 수강 취소를 했지만... DB에 처음 입문하는 내가 듣기에는 실용적이고 유익했다.

특히 Relational DB Design을 배우며 테이블 설계 연습을 해본 것이 추후 백엔드 프로그래밍을 할 때 실질적으로 큰 도움이 되었다. 과제로 진행했던 SQL 파서 + DBMS 구현은 실효성에 대해 이런저런 말이 많지만 개인적으로 재밌는 과제였다. 과제 중에 이렇게 재밌는 거 구현하는 게 드문데... Berkeley DB에 어떤 자료형으로 저장할지 결정하고 Lark를 이용해 간단하게나마 grammar를 정의하는 게 재밌었다.

데이터통신

Network layer의 모든 계층에 대해 다루는 수업이다. 나에게는 네트워크 입문이라는 의미가 있다. 각 layer에서 일어나는 캡슐화 과정을 배우고, Socket(TCP)에 대한 이해가 생긴 것이 유익했다. 곧 지인들과 함께 할 컨퍼런스에서 이때 얻은 TCP 지식을 활용할 예정이라 기대가 된다.

시스템프로그래밍

CSAPP을 배우는 수업이다. 교수님 사정으로 수업이 단 한번도 진행되지 않았고(...) 녹음본으로 하는 자습만 이루어졌다. 그래서 시험공부보다 더 많은 시간을 투자했던 Lab이 더 기억에 남는데, 그 중 malloclab은 정말 힘들었다... 끊임없는 Segmentation Fault와의 싸움은 내가 C로 코딩하는 방법을 얼마나 모르는지 깨닫게 해주었다.

멀티프로세싱, 뮤텍스 등 컴퓨터 과학의 코어한 기술들을 처음으로 접해서 의미있었지만, CSAPP이라는 방대한 범위를 시험 직전에 하루 이틀만 공부한 탓에 학습이 매우 얕게 이루어졌다. 시간을 내어서 다시 깊이 있게 공부를 해볼 계획이다.

가을학기

2023년 가을학기에는 인터넷보안, 창의적통합설계, 데이터사이언스를 위한 머신러닝 및 딥러닝을 수강했다.

인터넷보안

이 수업에서는 암호학, 전자 서명(인증서), 웹 보안, 블록체인과 비트코인 등 다양한 주제를 다뤘다. 특히 블록체인에 대한 이해는 이 강의에서 크게 얻어간 부분이었다. 이전에 블록체인에 대해 전혀 몰랐기에, 핵심 아이디어인 탈중앙화에 대해 처음 알게 되어 흥미로웠다. 한번쯤 구현해보고 싶다는 생각이 들었다. 웹 애플리케이션 개발에서 중요한 SSL 인증에 대해 깊이 이해하게 된 점도 유익했다.

과제에서는 OpenSSL을 사용해 SSL 인증서 Validator를 구현했다.

창의적통합설계

이 과목에서는 Llama2 LoRA Fine Tuning으로 SAT 문제를 생성하는 모델을 개발하는 프로젝트에 참여했다. LLM 애플리케이션 아키텍처 설계, Fine Tuning, Frontend 프로그래밍을 주도적으로 했다. 다른 팀원들은 회사와의 커뮤니케이션, Fine Tuning, Backend 프로그래밍, 성능 분석을 맡아주었다.

LLM이 새롭게 등장한 분야임에도 학부 수업에서 다루게 되어서 좋은 경험이었다. 하지만 팀원 모두 관련 경험이 부족했기에 데이터셋 준비, 파라미터 설정, 모델 선택 등 여러 도전 과제들에 직면해야 했다. 아직 해소되지 않은 질문들이 많은데, 앞으로 더 공부하면서 하나하나 해소하는 시간을 가져야겠다.

데이터사이언스를 위한 머신러닝 및 딥러닝

초반부에는 머신러닝, 후반부에는 딥러닝을 다루는 수업이었다. 머신러닝 부분에서는 다양한 종류의 회귀 분석을 통해 데이터를 분석하고 예측하는 방법을 집중적으로 배웠고, 딥러닝 부분에서는 이미지 및 시퀀스 데이터 처리에 관한 내용을 학습했다. 기초부터 전반적인 내용을 꼼꼼히 다룬 커리큘럼 덕분에, 이 과목은 정말 마음에 들었다. 또한, PyTorch를 본격적으로 사용해볼 수 있는 기회가 되었다.

과제로는 Linear/Logistic/Ridge/Lasso Regression 구현, kNN/CNN/RNN/Seq2Seq 구현, Vision Transformer 구현 등을 수행했다. 후술하겠지만 이 강의를 통해 새로운 커리어에 필요한 기초 지식과 자신감을 얻었기에 고마운 마음이다.


3. 아티투

토스 퇴사 이후, 파트타임으로 일할 곳이 필요했기에 친한 지인들이 하던 스타트업 '아티투'에 합류했다. 아티투는 내가 합류할 당시 나를 포함해 3명인 작은 규모의 팀이어서, 개발 분야에서는 제너럴리스트가 되어야했다.

가장 먼저 했던 일은 프론트엔드 코드 정리였다. 잘하는 프론트엔드 개발자 분이 초기 코드를 작성해주셨지만, 이후 여러 사람이 관리하면서 코드의 퀄리티가 저하되어 읽기에 매우 복잡했다. Button 컴포넌트의 경우 type이 20개 가량 있었다. 이 중에는 특정 페이지에서만 사용되는 디자인을 위해 구현된 것도 있었다. 토스에서 1년간 TDS를 개발했던 사람으로서... 계속 해왔던 일이기에 디자이너와 협력하여 버튼 디자인을 효율적으로 재정립하고, 컴포넌트를 재작성했다. 그리고 정규 표현식를 사용한 replace를 통해 마이그레이션까지 완료했다. Txt 컴포넌트의 경우, Figma 플러그인을 개발하여 코드 생성을 지원했다.

학기 중에는 시간이 부족해 기능 개발에 주력했다. 이 과정에서 프론트엔드, 백엔드, 네이티브(iOS, Android) 작업을 모두 수행했다. 특히 네이티브 작업은 ChatGPT의 도움 없이는 불가능했을 것이다. 벌써 내가 개발한 기능이 셀 수 없이 많아졌다. 중간 즈음에는 세 명의 팀원으로 시드 투자를 유치하기도 했다.

현재는 퇴사를 앞두고 SSR 지원을 위한 Next.js로의 마이그레이션과, React Native로의 마이그레이션을 진행하고 있다. 개발자의 변경이 종종 있을 것으로 예상되고, 특히 주니어 개발자의 합류 가능성이 높을 것으로 예상되어 최대한 개발의 난이도를 낮추기 위해 선택한 기술들이다. 최대한 빠르게 진행하려다보니 어렵다. 가능한 jscodeshift를 사용하지 않고 replace만으로 해결하고 싶었는데 도저히 안 될 것 같아 도입해보려 한다.


4. 외주

React Native + Webview를 이용한 앱 개발

처음으로 React Native를 사용해 앱스토어와 플레이스토어에 앱을 출시했다. 인앱결제 기능도 포함되어있었다. React Native와 Webview 조합으로 앱을 개발하는 건 정말 빠르고 편하다. 개발 과정에서 의존성을 설치하려 할 때마다 에러가 생겨서 엄청 머리 아팠지만.. --reset-cache로 대부분 해결할 수 있었다.

이 경험으로, 외주할 때 체크해야 할 것들을 몇 가지 생각했다. 시간이 오래 걸리는 구현 디테일을 요구하는 경우 추가 비용을 요구해야 하는지 여부가 애매할 때가 있었다. 최대한 개발 시작 전에 이 디테일들을 명시해두는 게 중요하다고 느꼈다. 또한 개발기간과 QA 기간, 유지보수 기간을 꼭 명시해야겠다고도 생각했다.

Next.js + Spring Boot를 이용한 웹 개발

아직 진행중인 건이지만 꽤 규모가 있는 프로젝트를 하고 있다. Spring Boot를 이용해 서버 설정과 개발을 처음 해봤는데, 확실히 프론트엔드 프로그래밍과는 많은 차이가 있었다. 아직 깊게 탐구해본 건 아니지만, React에서는 FP가 선호되는 반면 Spring에서는 OOP가 선호되어 발생하는 스타일의 차이를 느끼고 있는 것 같다. 프론트엔드에서도 테스트를 잘 쓰고 싶다. 마지막으로 테스트를 작성해봤던게 약 1년 전이었는데, 그때는 가상 DOM을 만들어서 실제 클릭을 하고 함수가 호출되었는가 같은 것을 테스트했었다. 좀 더 비즈니스 로직을 잘 테스트할 수 있는 우아한 방법을 다시 찾아봐야겠다.

프론트엔드에서는 Tiptap을 사용한 위지윅 에디터를 구현했다. 특히 Custom Extension을 만들어야 할 정도로 기능이 복잡했는데, 이걸 성공적으로 해낸 것이 성장으로 느껴졌다. Tiptap 사용법에 대해 잘 정리해서 포스팅을 꼭 해야겠다.


5. 프롬프팅 학회

2학기 동안 서울대학교 프롬프팅 학회 Checkpoint에 운영진으로 참여했다. 스타트업 대표님들의 세션을 통해 생성형 AI가 산업에 일으키고 있는 변화와 비즈니스 적용 방법을 배울 수 있었다. 운영진들이 준비한 세션에서는 LLM과 Stable Diffusion, 프롬프팅 기법 등에 대한 학습을 했다.

주요 활동으로 진행했던 팀 세미나 준비에서는 Stable Diffusion LoRA 학습으로 메이플스토리 몬스터 이미지 생성기를 만들었다. Fine Tuning과 LoRA의 원리에 대해서도 논문을 읽으며 준비했고, 학습 과정에서 Learning Rate와 데이터셋의 크기를 조정해가며 성능을 실험하는 내용을 준비했다. 학회원들의 투표로 수상하기도 해서 만족스러운 결과였고, 지금 생각해보면 이미지 증강을 위해 horizontal flip을 시도해볼 수도 있었겠다는 생각이 든다.

첫 세션에서 콕스웨이브의 대표님께서 강연을 오셨는데, 이때 프로젝트 참여자를 모집하셨다. 좋은 기회라 당연히 지원했었고, 이 인연으로 1월부터 콕스웨이브에서 인턴으로 근무하게 되었다. 지금까지 AI를 다루는 프로젝트를 하며 전문가의 피드백을 받지 못해 아쉬운 마음이 있었는데, 열심히해서 실력을 많이 쌓고 싶다.


6. 여담

10월에 FEConf 스태프로 참여했었다. 가고싶지만 티켓팅 경쟁률 때문에 못 갈 줄 알았던 FEConf에 참여하게 되어서 너무 좋았다. 토스 분들도 거의 1년 만에 다시 뵙고 얘기 나누고 뒤풀이까지 같이 가서 즐거웠다. 나한테 살 빠졌다고 많이들 해주셔서 기분 좋았다 ㅎ...

2년 내로 컨퍼런스에서 발표할 수 있도록 해야지!


2023년에 충분히 갈팡질팡하면서 탐색에 대한 갈증을 해소했으니 이제는 한 분야를 정해서 그 분야를 열심히 연마할 때이다. 졸업하고 직장에 자리를 잡게 될 내년은 또 어떤 해가 될까, 벌써 즐겁다.