길다면 길고 짧다면 짧은 6년 동안 개발직을 하면서 팀원으로써 기여하기 위해 최선을 다했다. 이제 좋은 팀원이 무엇인지는 얼추 알겠는데 올해 24년을 맞이하며 셀장이라는, 난생처음 리더의 자리를 맡게 되었다. 서버셀은 나 포함 3명 뿐이지만, 모두가 만족하는 좋은 팀을 만들고 싶었다. 관련해서 이것저것 읽고 찾아보았는데, 그중 감명 깊게 읽은 [최고의 팀은 무엇이 다른가?]에서 말하는 최고의 팀의 특징 중 몇 가지만 나열해 본다. 1. 소속감 이 팀에서 내가 의견을 자유롭게 내도 안전한지, 그리고 서로를 신뢰할 수 있는지, 함께하는 모습이 그려지는지에 따라 소속감을 느낀다.구성원들이 서로를 신뢰하고 상호존중하며, 미래를 함께 그릴 수 있는지에 대한 것이다. 2. 몰입 팀 공동의 목표를 달성하기 위해 헌신..
API 서버를 prod 환경에서 띄울 때 어떻게 하는 것이 가장 좋을까? 기본적으로 애플리케이션을 실행 시키는 방법은 다음과 같다. ( 아래는 fastapi 앱을 실행시키는 명령어이다. ) gunicorn main:app --workers 4 -k uvicorn.workers.UvicornWorker --bind unix:/tmp/gunicorn.sock 이렇게 하면 애플리케이션을 띄우고 트래픽을 받을 수 있다. 이대로 마쳐도 되지만 앱이 crash등의 이유로 죽는 상황에 대해 한 번 더 생각해 볼 수도 있다. 우리 서비스는 ECS fargate로 띄워서 서버가 죽는다면 ECS 에서 자동으로 오토스케일링되어 새로 띄운다. 하지만 죽은 서버를 띄우는데 상대적으로 시간이 걸려 딜레이가 발생한다. 요 부분을 ..
만들게 된 계기 Django에서 테스트 코드를 작성할 때 테스트용 객체를 생성해 주는 factory_boy 라이브러리를 사용해 좀 더 손쉽게 테스트코드를 작성할 수 있었다. 마찬가지로 FastAPI에서도 사용하기 위해 factory_boy의 SQLAlchemyModelFactory를 사용하고자 했으나 다음과 같은 문제가 있었다. session 동적 할당이 불가능하다. 클래스를 정의하는 시점에 Meta 클래스 내 sqlalchemy_session에 session을 정의해주어야 한다. 이 방식은 테스트코드 런타임에 session을 동적 할당하는 것이 불가능해서 session 기반의 데이터들이 테스트 전반에 영향을 미치는 문제가 있다. 아래는 sqlalchemy_session에 session을 할당하는 예시이..
신규 API 서버에서는 Oauth 방식의 SNS로그인과 JWT를 사용한 토큰 기반의 인증/인가 방식을 구현하였다. 토큰 기반의 인증 방식을 사용한 이유는 다음과 같다. 기존 API 서버에도 동일한 인증 방식을 쉽게 적용할 수 있다. 서버에서 디비 조회 없이도 검증이 가능하다. 개념 설명은 다른 포스팅에서 다루도록 하고 구현에 집중하여 살펴보겠다. 스펙 Python 3.12 FastAPI 0.103.1 구현 Access Token 사용 유저의 인가(Authorization)를 검증할 때 access token이 유효한지로 판단한다. access token에는 서비스에 필요한 유저 정보와 만료일자 등이 포함되며 해당 포스팅에서는 다음과 같은 데이터를 포함한다. { user_id: int, user_devic..
fastapi를 사용하며 공부한 pydantic에 대해 주요 내용들을 간단하게 정리해 보았다. pydantic 이란? pydantic은 데이터 검증 라이브러리로 데이터에 대한 유효성 검사와 직렬화를 제공한다. type annotation 만으로 유효성 검사를 진행하기 때문에 간결하게 구현 가능하다는 장점이 있다. model pydantic에서 스키마를 정의하는 주요 방법 중 하나는 모델을 사용하는 것이다. 모델은 pydantic.BaseModel을 사요삭하고 필드를 주석이 달린 attribute로 정의하는 단순한 클래스이다. python dataclass와 유사하지만 유효성 검사, 직렬화 및 json 스키마 생성과 관련된 특정 워크플로우를 간소화하는 중요한 차이가 있다. 다음과 같이 user model이..
코루틴(coroutine)이란? 코루틴은 co + routine의 합성어로, 직역하면 함께/협력하여 수행되는 루틴이라고 볼 수 있다. 여기서 루틴이란 실행하는 프로시저나 함수를 의미한다. 다시 말해, 코루틴은 협력하여 실행되는 함수로 설명된다. 이게 어떤 의미일까? 루틴의 종류부터 살펴보자. 메인 루틴 - 서브 루틴 함수 내에서 또 다른 함수를 호출하면, 해당 함수가 결과 값을 반환할 때까지 대기했다가 그 이후 코드들을 순차적으로 수행한다. 이때 호출한 함수가 메인 루틴, 호출된 함수가 서브 루틴에 해당한다. 코루틴 반면에 코루틴은 비동기적으로 함수 내 여러 다른 지점에서 진입하고 탈출하고 재개할 수 있는 특수한 서브루틴에 해당한다. 코루틴이 완료되지 않아도 또 다른 코루틴을 실행할 수 있다. 코루틴을 ..
우리가 기본적으로 접하는 동기, 비동기 개념은 관점에 따라 설명을 달리 할 수 있다. 여기서 살펴볼 관점은 함수의 제어권과 반환된 결과에 따른 처리이다. 관점에 따라 아래의 도표와 같이 sync/async, blocking/non-blocking으로 나누어 진다. 설명에 앞서, A 함수가 B 함수를 호출한다고 가정하자. 가령 이런 것이다. def A(): ... B() ... def B(): ... blocking/non-blocking blocking과 non-blocking을 나누는 기준은 제어권을 언제 반납하느냐 하는 것이다. 여기서 제어권이란 함수의 실행 흐름을 제어하는 것으로, 쉽게 말해 제어권이 있어야 함수 내 코드를 계속 실행할 수 있다. blocking 방식은 A 함수가 B 함수 호출 시에..
- Total
- Today
- Yesterday
- gradle
- await
- elk
- pytest
- coroutine
- supervisord
- bugfix
- async
- GitOps
- JWT
- Pydantic
- logstash
- kubectl
- OAuth
- sns로그인
- kubernetes
- kibana
- promethus
- factory_boy
- elasticsearch
- Supervisor
- fastapi
- jwt로그인
- numble
- ArgoCD
- miniproject
- grafana
- NCP
- Project
- DevOps
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |