본문 바로가기

분류 전체보기

(31)
테스트 코드에 대한 결정 outline 테스트 코드에 대한 최근 결정을 작성한다. contentshttps://nebulayoon.tistory.com/25 해당 링크에서 디자인 패턴에 대한 생각을 작성했다.작성했던 글을 읽다보니, 왜이리 변명만 작성했지? 내가 작성하려던건 이런게 아닌데 라는 생각이 들었다.그래서, 이어서 현재 나의 생각과 결정 사항을 작성해보려고 한다. 우선은 이 글의 목적에 맞게 테스크 코드에 대해서 작성해볼까 한다.https://nebulayoon.tistory.com/25 해당 글에서 repository pattern을 사용해서, in-memory repository를 구현하는 것은 비효율적이라고 했다. 이 당시에, 왜 그렇게 생각했는가?raw query를 사용하는 service는 수많은 조회를 이용해야..
[Python] Refresh Token Rotation 간헐적 비정상 동작 문제 Outline각종 공식문서들을 보며 refresh token rotation을 구현하였고, 이를 사용하던 와중, 간헐적으로 로그인이 해제되는 문제가 있었다. Content공식문서들을 보면서, refresh token rotation을 구현하기로 결정하였다.이 방식을 채택한 이유는 다음과 같다.운영 관점에서 사용자 접근 관리(강제 로그아웃)다중 로그인 관리보안(비정상 로그인 확인)SpecFastapiReactFlow```plantuml@startumlactor Userparticipant Clientparticipant Serverdatabase "Token Storage" as TokenStorageUser -> Client: 로그인 요청Client -> Server: 로그인 API 호출 (id, pas..
[Azure Function] Azure Function 배포 문제 Outline우리 회사는 클라우드로 Azure를 사용한다. Azure Function을 배포하는 방법은 정말 많다. 문제는 기존 방식대로, 새로운 서비스를 Azure Function에 올리려고 하였는데, 동작하지 않았다.로컬에서는 디버깅하거나, 함수를 실행을 시켜도, 정상적으로 동작하고 기능 상으로도 문제가 없는데, 배포만 하면 함수가 로드되지 않았다. 환경변수, 설정파일 등 많은 부분을 다시 확인했음에도 불구 하고, 동작하지 않았다.급한 대로, Azure Core tools를 이용해서 배포 하였고, 이를 정리하고자 한다. Spec문제가 발생한 Azure Function은 다음과 같다.python3.11host.jsonpython azure function v2 방식{ "version": "2.0", ..
[FastAPI] 왜 FastAPI는 동기 router도 비동기 "처럼" 보일까? Outline FastAPI는 기본적으로 동기 라우터들을 스레드풀에서 실행 시킨다.어떻게 구현했는지 tracing을 해봤다. 기본적으로 알아야 할 내용FastAPI는 Starlette를 고수준으로 추상화 한 패키지이다. ContentsOutline에서 설명한 대로, FastAPI는 Starlette를 wrapping한 고수준 추상화 패키지이다. 그래서 네트워크 처리, 웹 애플리케이션 사용을 Starlette를 이용해서 처리한다. 그래서, FastAPI를 분석한다고 하지만, 사실상 Starlette를 분석하는 것이다. FastAPI가 동기 라우터를 스레드풀에서 실행시키는 것은 공식 문서에 적혀있다.   그러다 보니 여러 궁금증 들이 생겼는데, 그 중에 가장 궁금했던건, 스레드풀에 있는 thread들의 개수..
[PostgreSQL] psycopg3 placeholder와 crosstab pivot Outline데이터를 pivot해서 보여줘야 하는 상황이 발생했는데, raw query로만 작성하기로 결정이 되었다.작성해야하는 raw query에는 다음이 사용된다.CTE를 통한 필요한 데이터 선택placeholder를 이용한 사용자 데이터 입력(psycopg3는 %()s의 모양을 가지고 있음)crosstab을 이용한 pivot 제공 Contents왜 raw query로 작성하게 되었냐 라고 물어본다면, 기존의 모든 연산 로직을 raw query로 관리하고 있고, pivot을 해야 하는데이터가 기존의 raw query를 사용해야했다.이를 애플리케이션 레벨, DB 레벨 둘 중에 어디서 pivot하느냐는 결정이 필요했는데, 기술적으로 불가능한 영역이 아니라면, raw query를 이용함으로써 재활용이 이미..
[Python] Wrapper에 대해서(@wraps) Outline데코레이터를 만들다가, @wraps는 내부적으로 어떻게 동작할까 궁금해서 글을 작성해본다. Contents기본적으로 @wraps는 기존 함수의 meta data를 살리기 위해서 사용한다.그런데, wrapper 안에서 meta data를 호출 할 때, 인자로 받은 func의 meta data를 호출하면, @wraps와 wrapper.__name__을 호출하지 않고, 기존 함수의 meta data를 사용할 수 있다. import functoolsimport timedef time_profiling(func): # @functools.wraps(func) def wrapper(*args, **kwargs): """this is wrapper""" start = ..
디자인 패턴에 대한 스타트업 주니어의 생각 Outline스타트업의 주니어 개발자로서 개발을 하다가 느낀점을 요약한다.미래에 이 글을 봤을 때, 얼마나 바뀔지를 확인해본다. Contents현재의 나는 스타트업에서 백엔드 개발의 업무를 주로 맡고 있다. 인원이 부족하기 때문에, 사실상 나 혼자 개발하고 있기 때문에, 개발팀 내부에서의 협업과는 거리가 먼 상태이다. (프론트엔드 1명, 백엔드 1명) 디자인 패턴에 대해서는, 많이 듣기도 했고, 나름 학생때부터 신경 써왔다고 생각했기 때문에, 미래의 우리팀에 합류할 팀원들을 대비하여, 코드를 정리할 필요가 있다고 느꼈다. 적어도 그 사람들이 내가 작성한 코드를 보고, 난해하다를 느끼게 하고 싶지 않았다. 회사에서 업무를 하면서 느낀점은, 적절한 이유가 없이, 새로운 기술이여서, 인기가 있어서, 경험해보고..
Developer 로서 문제정의? OutlineSoftware Engineer로서 문제를 어떻게 바라보고, 확장하고, 정의하는지 고민해본다. Contents문제정의란, 인터넷에 많은 정의가 있지만 결국은 정상적이지 않은 상황을 인지하고, 이를 객관적으로 표현하는 것이다.그리고, Developer로서 해당 문제를 해결할 수 있는 방법들을 수립하고, 방법을 선택 후 그 방법이 문제를 해결하는데 적합한지 확인해야한다. 그리고 최종적으로는 정상적인 상황으로 해결하는 것이라고 생각한다. 문제정의를 하는 방법에 대해서는 모두가 다르다고 생각한다.회사의 상황(정책, 금전적, 비즈니스 모델)과 조직의 규모 그리고 팀장의 매니징에 대한 관점에 따라서 다를 것이고, 이 문제를 어느 관점에서 해결해야하는 가에 대한 입장에 따라서도 다를 것이다. 그러나, 결..
[python fastapi] Depends에 동적으로 parameter 사용하기 Why?코드의 깔끔함을 위해서, 조금 더 재사용성이 좋고, API에 명시적으로 권한을 보고 싶어서 진행. 본문fastapi에 Depends()를 이용해서, user를 판별하고 있었고, 특정 API 마다 접근 할 수 있는 role을 부여하고 싶었다.예를 들면, admin만 접근 할 수 있는 API라던지, 로그인 한 유저라면 얼마든지 사용할 수 있는 API 라던지. 다만, 고려했던 사항은, router 내부에 코드를 추가하고 싶지 않았다. router의 Depends() 레벨에서 해결하고 싶었다. 아래는 간단하게 작성한, prototype code 이다.from fastapi import HTTPException, Depends, FastAPIfrom fastapi.security import OAuth2P..
[python] shallow copy, deep copy, pass by assignment Why?예상한 대로 메모리 할당이 되지 않는 것 같아서 테스트 진행서론swallow copy는 원본 메모리를 참조한다.deep copy는 새로운 메모리에 할당한다.재할당(초기화)는 위와 다른 얘기다(새로운 메모리).본문mutable listlistsetdictimmutable listtupleboolintfloutstrfrozenset헷갈렸던 부분python tutor라는 사이트를 발견했고, 이 사이트에서 메모리 테스트를 하다가, 예상과 다르게 동작해서 다시 찾아보게 되었다.https://pythontutor.com/visualize.html#mode=edit 공식 문서의 이론은 다음과 같다.https://docs.python.org/ko/3/library/copy.html얕은 복사는 새로운 복합 객체를..
[python] vscode dotenv.load_dotenv() os.getenv()가 최신화 되지 않는 문제 Why?vscode에서 python 개발을 할때 .env파일을 변경했음에도, os.getenv()를 진행하였을 때, 기존의 값이 적용됨. 문제 원인python 개발을 진행할 때, vscode에서 venv를 이용하여, python main.py와 같이 terminal 실행을 자주 하는데, terminal에 최신 환경변수가 적용되지 않아서 발생함. 테스트 코드import psycopgfrom fastapi import FastAPIimport dotenvimport osimport uvicorndef get_db_connection(): dotenv.load_dotenv() DB_NAME = os.getenv("DB_NAME") URL = f"postgresql://postgres:passw..
[TimescaleDB] timezone이 필요한 날짜 데이터 빠르게 select 하기 들어가기 앞서TimescaleDB는 PostgreSQL 진영의 time series 데이터를 저장하기 위한 DB이다. 시계열 데이터를 처리하기 위해 최적화된 데이터베이스로, 실시간으로 쌓이는 대규모 데이터를 처리하기 위해 만들어졌다. 이 글을 작성하는 이유는, timezone을 계산해야하는 상황에서 쿼리가 보다 빠르게 동작시키기 위해서 고생한 흔적이 들어있다. 내용환경설정DB 실행docker run -d --name timescaledb -p 5432:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg15 Table 생성create table realtime_datas ( id serial, event_time timestamptz no..
[TimescaleDB documents] time_bucket() Why?영어 공부 및 지식 습득Summarytime_bucket()을 이용하면, 시간 버킷을 단위로 데이터를 집계할 수 있다.내용TimescaleDB를 이용하면, time_bucket()함수를 사용 할 수 있는데, 이는 사용자가 원하는 시간 만큼 집계를 가능하게 한다. PostgreSQL의 date_bin() 함수와 비슷한데, 시작 시간과 버킷의 사이즈에 대해서 더 좋은 확장성을 가지고 있다. 시계열 데이터를 다루려면, 반드시 다운 샘플링(시간 빈도를 줄이는 것)이나 분석이 필요하다. Bucketing이 동작하는 방식time interval을 이용해서, 데이터를 그룹한다. time_bucket()함수는 interval length로 microseconds, milliseconds, seconds, min..
[fastapi documents] OpenAPI operationId Why?영어 공부 및 지식 습득SummaryOpenAPI에 API의 식별자를 변경할 수 있다.OpenAPI에서 API를 제외 시킬 수 있다.내용사용자 정의 OpenAPI path사용자가 직접 OpenAPI의 path operation을 operation_id를 이용해서 설정할 수 있다.from fastapi import FastAPIapp = FastAPI()@app.get("/items/", operation_id="some_specific_id_you_define")async def read_items(): return [{"item_id": "Foo"}]결과아래와 같이 구성하면, 함수 이름을 OpenAPI path operation으로 사용하는 것이 가능하다.from fastapi import..
[python documents] python3.11 pep655 TypeDict Why?영어 공부 및 지식 습득SummaryTypeDict의 각 요소에 required, not-required를 표시 할 수 있게 됨.내용Required, NotRequired를 이용해서, 각각의 요소들이 필요한지 여부를 쉽게 표현할 수 있다. 기존에는 이를 위해서 상속을 받아야 했다.기본적으로는 모든 field는 Required이지만, total parameter를 False로 셋팅하면, NotRequired가 기본이 된다.class Movie(TypedDict): title: str year: NotRequired[int]m1: Movie = {"title": "Black Panther", "year": 2018} # OKm2: Movie = {"title": "Star Wars"} # ..