본문 바로가기

분류 전체보기

(36)
[PostgreSQL] Numeric type에 NaN이 들어가는 환장의 콜라보 Contents최근에 황당한 일을 겪게 되어 정리해본다.동일한 시나리오를 한번 작성해 보겠다. 우선 아래와 같이 테스트 환경을 구축한다.환경설정python3.11pandaspsycopg3postgresql 15dockerfileFROM postgres:15EXPOSE 5432docker-compose.ymlversion: '3.8'services: db: build: . container_name: pg15-local restart: unless-stopped ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: pos..
[python] pydantic 2.0 decimal.Decimal type to float (with. postgresql) Contentspostgresql에서는 소수를 표현하기 위해서, 여러 타입을 제공해준다.NUMERIC(), DECIMAL()REAL 부동소수DOUBLE PRECISION 부동소수MONEY 고정 소수보통의 경우에서는 사람들은 NUMERIC()을 선택하지 않을 까 싶다. 데이터를 저장하는데 있어서 무결성을 지키고 싶어서 정확한 소수를 저장하고 싶을 것이다. 물론 비즈니스 요구사항에 따라 다르다. 아무튼 위와 같이 NUMERIC()을 DB에서 사용한다고 가정하겠다.문제는 Raw SQL 모듈과 Pydantic 2.0을 이용한 직렬화에서 발생한다. 구성 환경은 다음과 같다.postgresql 15 (DB)pydantic 2.0 (JSON 직렬화)psycopg 3.0 (Raw SQL 모듈) 우선 DB에서 NUMER..
주니어 개발자에게 추천하는 책 1 - 소프트웨어 장인 Outlinehttps://product.kyobobook.co.kr/detail/S000001889885 소프트웨어 장인 | 산드로 만쿠소 - 교보문고소프트웨어 장인 | 더 나은 개발자가 되어, 더 좋은 코드를 전달하고 싶은 당신을 위하여이 책에서 풀어낸 소프트웨어 장인정신의 프로페셔널리즘, 기술적 탁월함, 고객 만족은 애자일, 린(lean)product.kyobobook.co.kr Contents주니어 개발자에게 추천하는 책 시리즈 첫번째이다. 우선 이 책은, 소스 코드를 더 짜는 방법에 대해서 알려주는 책이 아니다. 개발자로서의 태도(삶 혹은 일)에 대해서 이야기 하고, 개발자가 겪을 수 있는 상황에서의 일을 하는 방법을 알려준다. 어쩌면, 이 책은 개발을 공부하는 방법은 알지만, 정신적인 성장과 ..
[FastAPI] fastapi와 DB간의 session 로깅하기 Intro분석을 도와주는 100줄 이상의 SQL raw query문을 사용하는 API들이 있다.해당 쿼리들을 단일로 실행하는 경우 꽤나 복잡한 쿼리문을 사용함에도 불구하고, 200ms아래로 항상 개발을 진행해왔다. 그런데, 적은 양의 트래픽이 있었음에도 불구하고, API의 처리 속도가 굉장히 느리다는 것을 느꼈다.가장 의심되는 부분은 FastAPI로 작성된 백엔드 서버와 DB간의 통신이 모종에 이유로 API를 줄을 세우는게 아닐까 하는 의심이 들었다. 이 문제를 식별하기 위해서, FastAPI와 DB의 session 연결을 logging하여 분석하기로 결정했다.contents우선 문제를 2가지로 나누어서 생각하려고 했다. 1. pool size 문제 + slow query2. 잘못된 transaction..
[ChatGTP] AI로 조금 더 효율적이게 공부하는 방법 요즘 나의 관심사 중 한개는, ChatGPT를 조금 더 효율적이게 사용해서, 공부하는 것이다.나는 취미 생활을 할때에도 남들이 보기에 하찮아 보일지 언정 새롭게 알게 되는 지식에 굉장한 즐거움을 느끼는데, ChatGPT의 project 기능을 이용해서, 각 취미 별로 프로젝트를 만들어 공부를 하기도 한다.예를 들면, 커피, 사진(카메라) 등 말이다. 현재 내가 사용하는 방식을 공유 해볼까 한다. 아, 물론 유료버전을 사용 중인데, 무료 버전은 사용해본지 오래되어 어디까지 허가되는지 모르겠다. Project를 이용한 원하는 대답 컨트롤 하기ChatGPT의 sidebar menu를 보면, New project라는 메뉴가 있다. 원하는 이름으로 생성 해준다. 그리고, 본인이 어떤 역할로서 ChatGPT와 ..
테스트 코드에 대한 결정 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얕은 복사는 새로운 복합 객체를..