프로그래밍/Python 9

Pydantic BaseSettings로 환경변수 관리하기 – @property 패턴 적용기

https://kojub.tistory.com/24 Pydantic.BaseSetting을 사용한 환경변수 관리.env 파일은 중요한 설정과 변수들을 정의한다. DB 정보, URL, API Key 등과 같은 민감한 정보를 코드에 하드코딩하지 않고 관리할 수 있어 필수적인 파일이다.그러나 개발⸰테스트⸰배포 환경이나kojub.tistory.com 한 5개월 전에 Pydantic BaseSetting으로 환경변수 관리하는 config파일을 구성한 적 있다.import osfrom dotenv import load_dotenvfrom pydantic_settings import BaseSettingsload_dotenv()def _getenv(name: str, default: str = None) -> str..

[ FastAPI ] HTTPException에서 CustomException으로 예외 처리 개선

BaseResponse, 예외 상황에서도 잘 동작할까? 대화 속에서 발견한 설계 실수{ status_code : INT (200, 400, ... 같은 상태코드), data : 응답 DTO ( 실질적 데이터 ) message : STRING ( 추가적인 메세지 ) } 어제 안드로이드 개발자분과 이야기하면서, Exception 응답도 BaseResponse 형태로 내려주면 되는지에 대한 질문을 받았다."아뇨, 정상처리 됐을 때만 해당 응답구조로 내려줍니다." 아니 애초에 BaseResponse 클래스를 처음 만든 이유가 예외 처리든 정상 처리든 일관성 있게 응답을 관리하고, 클라이언트에서 에러 핸들링을 더 쉽게 할 수 있도록 하기 위해서였는데, 왜 그렇게 짰는지 의문이 들었다. (좋은 부분을 캐치해주신 ..

[ FastAPI ] Response 구조 분석 및 공통 구조 커스텀하기

미들웨어 적용도 해볼 겸 API response 구조를 통일해보려 했다.문서를 보니, 미들웨어 적용 자체는 꽤 간단했다. ( response 내부 까보기 전까진..ㅎ ) https://fastapi.tiangolo.com/tutorial/middleware/#create-a-middleware Middleware - FastAPIFastAPI framework, high performance, easy to learn, fast to code, ready for productionfastapi.tiangolo.com pydantic으로 BaseResponse 클래스 만들고 적용 base_response.pyclass BaseResponse(BaseModel): """공통 response DTO"""..

black으로 코드스타일 포매팅

괄호 안에 들어갈 내용은 앞뒤로 한 칸씩 띄워서 작성하는 거.연산자 앞뒤로도 한 칸씩 띄워서 작성하는 거.성격이 조금이라도 다른 로직의 경우 두 번 개행을 해서 작성하는 거....등등, 로직 자체에는 영향을 주지 않지만, 누구나 사소하지만 신경 쓰는 고유한 스타일이 있듯이, 나도 꼭 지켜야만 속이 시원한 작성 습관들이 있다. 이걸 매번 신경 쓰면서 작업하다 보면, 혼자 코딩할 때도 번거롭고 가끔 놓치기도 한다.하지만 더 큰 문제는 여러 사람이 함께 작업하는 회사 환경이다.띄어쓰기나 개행 스타일이 제각각이다 보니 코드 가독성이 떨어지고, 통일감이 없어 퍽 신경쓰인다.( 일하는데 집중하면 사실 잘 안보일 때가 많지만, 한 번 신경쓰이면 계속 신경쓰이는 안읽음 메세지 표시 같달까 )그래서 Black처럼 코드 ..

언더스코어 인 파이썬 ( 파이썬 객체지향적으로 사용하기 )

1. 이 글을 쓰게된 계기 회사가 성장하고는 있지만, 여전히 다양한 실험을 진행하는 스타트업이다 보니, feature 개발에 집중하느라 리팩토링할 여유가 많지 않다. 그래서 관련 feature를 개발하면서 레거시 코드까지 건드려야 하는 상황이 오면, 틈틈이 쫌쫌따리 리팩토링을 진행하곤 한다. 얼마 전, 크론잡으로 실행되는 로직에 새로운 기능을 추가하다가 해당 소스 코드 파일을 살펴보게 됐는데, 곳곳에 언더스코어(_)가 마치 디자인 시스템처럼 많이 사용된 흔적을 발견했다. 다른 파일들과는 달리... 나름의 이유가 있는 걸까, 아니면 단순한 남용일까? 판단을 위해 이 글을 참고하여, 파이썬에서 언더스코어가 어떻게 활용되는지 번역하고 살을 붙여 정리해보았다.사실 제일 중요한 파트는 5. 언더바를 포함한 변수명..

Pydantic.BaseSetting을 사용한 환경변수 관리

.env 파일은 중요한 설정과 변수들을 정의한다. DB 정보, URL, API Key 등과 같은 민감한 정보를 코드에 하드코딩하지 않고 관리할 수 있어 필수적인 파일이다.그러나 개발⸰테스트⸰배포 환경이나 국가별로 설정이 달라야 하는 경우 여러 개의 .env 파일을 사용하는 일이 빈번하며, 이 과정에서 환경 변수가 누락되거나 잘못된 타입으로 정의될 경우, 예기치 않은 예외가 발생한다.  실제로 회사에서도 .env파일 관리가 번거로운 탓에 휴먼에러로 인해서 돌아야 할 배치가 돌지 않는다거나, 특정 로직이 실행되지 않는 버그가 발생하기도 했다.  이럴 때, 파이썬 환경에서는 Pydantic에서 제공하는 BaseSettings를 상속받아서 설정관련 변수들을 정의하면 위에서 말한 예외를 어느 정도 방지할 수가 있..

mypy에서 가상 환경 파일 무시하기: venv 디렉토리 제외 설정 방법

에러 발생./test.sh 테스트 파일을 실행하는데, mypy를 실행하는 순서에서 아래와 같은 에러가 발생했다. mypy란?mypy는 python 코드의 정적타입 검사를 하는 도구이다.타입이 올바르게 사용되었는지 사전에 발견해서 코드 품질을 높이는 도구이다. - 타입검사 : mypy코드의 타입 주석을 확인하고, 예상된 타입과 실제타입이 일치한지 검사한다.- 호환성 검사 : 타입검사를 토대로 코드가 기대하는 방식대로 동작하는 지 검사한다. 위와 같은 검사를 위해서 기본적으로 프로젝트의 모든 python 파일을 검사하려고 하는 게 특징이다. 에러 원인venv는 프로젝트 내 python 패키지를 독립적으로 설치하고 관리하는 가상환경이다.이 가상환경에는 프로젝트의 외부 라이브러리나 종속성 패키지들도 포함이 된..

Error:Field validation for *** failed on the 'required'

문제 상황1. 요청 필수필드값을 모두 채웠는데, 에러가 발생한다... 축의금 기록을 테스트 하는데, 버튼이 눌린 뒤 반응이 없었다.( 아직 FE분이 에러 토스트 메세지 기능을 붙이기 전이였음.. )뭐가 문제인가 싶어서 네트워크 탭을 열어보니까 400에러와 함께 아래와 같은 response가 내려왔다.{ "detail": "Key: 'CreateExpense.IsInvited' Error:Field validation for 'IsInvited' failed on the 'required' tag \nKey: 'CreateExpense.Name' Error:Field validation for 'Name' failed on the 'required' tag \nKey: 'CreateExp..

딕셔너리 활용하기

요즘 이 책 시간 날 때마다 보고있는데, 딕셔너리에 관해서 너무 좋은 내용이 있어서 기록한다. 파이썬으로 api 로직 짜다보면 keyError 가 나는 경우가 있는데, 내가 굉장히 더럽게 코드를 짜서 해결하고 있었더라 하하 여기서 소개하는 딕셔너리 활용법을 이용하면 굉장히 클린하게 해결할 수 있더라고. get( ), setdefault( ) 그동안 나는 keyError가 나거나 할 때, 아래와 같은 방식으로 해결을 했다. orderNo = None if 'orderNo' not in data else data["orderNo"] 살짝 자바스크립트의 삼항연산자 느낌 같기도 하고..? 근데 이 책에선 이게 파이썬 답지 않은 코드이자, 악취나는 코드라고 소개하고 있다. 이걸 딕셔너리의 내장함수인 get() 이..