회고/WIL

[ WIL ] 4-2 스타트업 취업 1주차, 독서, FastAPI 마이그레이션 이슈, 공부

KEEMSY 2024. 4. 14. 22:10

4월 2주차가 정신 없이 지나갔다. 이번 주에는 첫 출근도 있었지만, 수요일 쉬는날(총선)이 있어서 그런지 더 빠르게 한주가 지나갔다. 입사한지 고작 1주일 밖에 되지 않았지만 무엇때문인지 이곳의 공간이 익숙하고 좋다. 
 

팀에 합류하고, 팀원들과 다함께 우리의 연남 공간에서 사진을 찍었다. 가운데가 난데, 몰골은 초췌해도 정말 행복해보이는 모습이다.

 
이번 한주동안은 팀 내 빠른 적응을 목표로 하였다. "우리 팀 그리고 다른 팀원의 루틴은 어떻게 구성되는지", "현재 개발 우선순위는 무엇인지", "내가 당장 기여할 수 있는 부분""앞으로 해야할 것은 무엇인지", 그리고 "이를 위해 나는 무엇이 부족한지" 등 빠른 적응을 위한 목표와 노력을 했다.
 

내용 구성
- 스타트업 입사 1주차: 적응
- FastAPI 공부: alembic 마이그레이션 문제

스타트업 입사 1주차: 적응

나는 첫 출근 전날(24.04.07.일) 4월 1주차 동안 정리한 내용을 다시 상기해보았다. 

  • 팀원들과 친해지기 + 팀원들의 역할 확인하기
  • 사용하는 툴에 적응하기
  • 개발환경 + 개발 진행 준비하기

나는 이것을 자체 프리온보딩 이라고 생각을 했는데, 생각보다 실제 출근을 했을 때 큰 도움이 되었다. 출근을 하고서, 무엇을 해야할지 몰라 멍하니 시간을 보내는 일이 거의 없었던 것 같다. 하지만 목표한 것을 모두 달성한 것은 아니다..
 
입사 첫주차, 내가 가장 중요하게 생각한 부분은 가능한 빨리 개발 업무에 투입이 되는 것이었다. 내가 입사를 했을 때에는 이미 2분기 KPI를 설정하고 이를 달성하기 위한 빠른 움직임을 준비하고 있었는데, 나도 이에 기여를 하고 싶었기 때문이다. 하지만 개발 업무에 투입이 되기에는 내가 모르는 부분들이 많았다.
 
 

개발: 로컬 프로젝트 세팅 및 개발 컨벤션 및 프로젝트에 대한 이해

개발 업무에 투입이 되기 위해서는 가장먼저 1)로컬 개발 환경 세팅을 해야했고(당연한 부분 1) 2.개발 컨벤션(약속)을 정의해야했다. 그 다음에서야 3.프로젝트를 이해, 분석 그리고 업무 투입이 가능하다.
 

로컬 개발 환경 세팅

익숙한OS(MAC)Docker를 활용한 컨테이너 환경을 구축하는 것이었기 때문에 손쉽게 세팅할 수 있었다. 그리고 빠른 개발 환경 세팅 덕분에 개발 컨벤션과 프로젝트에 대한 분석을 좀 더 빠르게 진행할 수 있었다.
 

개발 컨벤션 정의

개발 컨벤션같은경우, 기존 1인 체계로 개발되던 특성 상, 개발 컨벤션이 일관된 특성을 갖지 않았다. 하지만 이제는 동료들이 하나, 둘 생겨날 것임을 기대하기에 지금부터라도 컨벤션을 정의하고 일관성있게 개발하고자 하였다. 

  • 컨벤션을 정의한 것이 무조건적으로 지켜야한다는 것은 아니다. 컨벤션을 정의하고 적용해보면서 계속해서 개선하는 것을 목표로 했다.
  • 개발에서 중요하게 생각하는 요소를 중심으로 개발 컨벤션을 정의했다.(협업, 비즈니스 중심의 개발)

컨벤션의 경우, 아직 완성되지 않았지만, 최소한의 컨벤션은 정의가 되었다.(브랜치 작명, 커밋 룰, 개발 원칙 등) 개발을 진행하는데 있어 최소한의 원칙은 정해졌다. 하지만 브랜치전략, 리뷰 원칙 등 아직 세부적인 사항은 정해지지 않았는데 아마도 다가오는 4월 3주차에는 해당 내용을 정의하고 앞으로 예정된 개발업무들이 진행될 듯하다.
 

프로젝트에 대한 이해와 개발 진행

개발프로젝트에 대한 설명을 진행하면서, 함께 짝프로그래밍을 진행하는것은 어떻겠냐는 제안을 받았다. 프로젝트 구조에 대해서 일일히 설명하는 일이 생각보다 비효율적이었기 때문이다. 나또한 이에 공감했기에, 이보다는 실제 개발을 진행하면서 프로젝트를 더 분명하고 쉽게 설명할 수 있을 것이라는 기대를 안고서 짝 프로그래밍을 진행했다.
 
사실 짝 프로그래밍을 나와 동료분도 해본 적이없었다. 그래서 이게 사실 짝 프로그래밍이 맞는지는 모르겠다. 그러나 "특정 feature 하나를 잡고, 약속한 컨벤션을 기반으로, 또 기존의 코드 베이스의 구조를 바탕으로 개발을 진행하면서 모르는 내용은 물어보고 함께 개발했다."라는 의미에서는 다른 짝 프로그래밍과 유사하지 않았을까? 그리고 이 덕에 나는 내가 예상한 시기보다 더 빨리 코드를 작성하고 또 프로젝트를 좀 더 효율적으로 분석할 수 있었다. 
 
하지만 빠른 코드 작성이 엄청나게 좋고 효율적인가? 에 대한 질문에는 아직 잘 모르겠다. 내가 FastAPI에 익숙하지 않아서 그런 것인지, 아직 이 코드가 최선인가? 에 대한 의문이 자꾸만 생긴다. 당장의 개발에 있어 중요한 부분(의존성의 방향, 컨벤션)에 대한 뿐만아니라, 코드 수준에 대한 솔직한 불안감이 생긴다. 특히 테스트 코드를 작성하지 않고 Swagger를 통한 현재 기능 개발와 관련해서 가장 큰 불안감이 존재한다. 단순히 테스트 환경을 구축하고 내가 작성한다해서 되는 문제가 아니기에, 이와 관련해서 동료분과 이야기를 나눠봐야 할 듯싶다.

 

 

1주일간 진행하면서..

1주일간 출근을하면서 나는 매우 만족했다. 개발을 할 수있어 좋았고, 프로덕트에 빠르게 참여할 수 있어 좋았다. 그리고 무엇보다도 해당 과정을 겪으면서 내가 지금 부족한 부분, 문제인 부분을 인지하게 되었다. 

 

정답은 없지만, 보다 더 좋은 의사결정에 대한 관심을 갖고서 책을 구매했다.

 

나는 지난 1주일을 돌아보면서, 가장 오랜 시간을 소비하게 되는 부분이 바로 "생각"이라는 것을 알게되었다. 생각을 길게하는것이 나쁘다라는 것 보다는 효율적으로 하지못하고 있다는 느낌이 들었다. 

  • 흔히 말하는 삽질의 순간들이 떠올랐다. 했다가 마무리(커밋)을 할 때, 잘못됨을 파악하고 다시 개선하는 과정이 몇몇 존재했다.

 

그래서 이를 개선하기 위해 새로운 책을 구매했다. "탁월한 생각을 훈련하면, 실수를 반복하지 않고, 더 좋은 의사결정을 함으로써 더 생산성 있는 결과물을 만들어 낼 수 있지 않을까?" 기대를 해본다. 출근길에 볼생각에 설렌다.


FastAPI 공부: alembic 마이그레이션 문제

예상보다 빠른 개발 업무를 진행하면서 빠른 시일내에 보완해야하는부분은 FastAPI에 대하여 익숙해지는 것이었다. 웹개발에서 큰 틀은 같지만, 해당 요소를 각각의 다른 영역의 프레임워크에서는 어떻게 개발하는지를 아는 것이 중요했다. 입사 이전 점프투 FastAPI를 진행했지만, 역시 이것만으로는 부족함이 많았다. 그래서 일단 좀 더 깊은 공부를 진행해보고자 하였다.
 
그러나 FastAPI프로젝트를 진행하면서, 예상하지 못한 문제에 직면했다. sqlAlchemy와 alembic을 활용한 마이그레이션 파일을 자동으로 생성할 때, 마이그레이션 파일이 비워져있는 문제였다.

해당 문제는 약 3일동안(퇴근 후 공부 기준) 나를 괴롭혔다. 물론 이를 해결하게 위해 수 많은 자료와 공식문서를 찾아보면서 또 많이 성장하기도 했다.

당시 상황 요약

목표: alembic revision —autogenerate  명령어를 실행 시, 올바른 마이그레이션 파일 자동 생성

문제상황: alembic revision —autogenerate  명령어를 실행하면 파일은 생성되나, upgrade(), downgrade() 함수가 비어있는 상황
- 생성된 migration.py 내 직접 마이그레이션 파일을 작성 후 alembic upgrade head 명령어를 실행하면 정상적으로 마이그레이션이 진행 됨

확인 사항
- env.py 파일 확인
  - target_metadata = Base.metadata 의 참조는 선한한 Base 객체(정상적인(from sqlalchemy.ext.declarative import declarative_base)를 참조하고 있음
- alembic.ini 파일 확인
  - sqlalchemy.url = mysql+pymysql://root:test@localhost:13306/fastapi_playground 의 설정이 정상적으로 되어있음
  - 작성한 database url은 문제가 없음을 확인(연결 확인)
- models.py 파일 확인(Base 객체가 정상적으로 선언되어 있는지 확인))
  - 정상적으로(from sqlalchemy.ext.declarative import declarative_base) Base 객체를 상속하여 작성되어 있음

 

 

3일차가 되었을 때, 이젠 정말 문제의 원인을 알 수 없었다. 그래서 마지막 희망의 끈으로 오픈카톡방에 질문을 남겼고, 한분의 도움덕에 드디어 문제를 해결 할 수 있었다.

당시의 카톡 내용, 당시 나는 답변을 보고 너무 감동이었다. 아직 세상이 따뜻하구나....

 

참고한이슈: https://github.com/sqlalchemy/alembic/issues/712

 

Alembic with databses autogenerate empty migration file · Issue #712 · sqlalchemy/alembic

I'm trying to connect the alembic library to the databases and sqlalchemy libraries. As a guide, I use this example link My projects file: db.py from databases import Database from sqlalchemy impor...

github.com

이슈를 해결하기 위해 작성한 코드

 

요약한다면, env.py 가 자동생성을 실행하기 전, 작성된 models.py 를 가져오거나, Table() 명령을 실행해야 하는데, 아마도 패키지 구조로 인해 파이썬의 참조의 실행과정에서 models.py들을 읽어들이지 못한듯하다. (나는 best-practice를 따르고 있는데...의문이다...) 

그래서 문제의 원인을 명확히 파악하고 정리가 된것은 아니다. 하지만 마이그레이션에 대한 이슈를 해결하고, 다음 단계들로 나아갈 수 있었다.  다음 목표들을 모두 해결하고 나면, 다시금 돌아와 해당 문제를 딥다이브 해봐야겠다.

 

앞으로 목표
- 애플리케이션 배포 및 CI, CD 구축
- async 기반의 애플리케이션으로 리팩터링
- 테스트 코드 작성

 

728x90