반응형

전체 글 90

[2023년 4월 회고] - 리팩토링, 너무 어려운

리팩토링, 디자인 패턴, 테스트 코드 등 개발자라면 어디선가 메아리처럼 들려오고 적용하고 싶고 그렇지만 힘들기도 한 그런 것들 입니다. 핑계 같지만, SI 프로젝트를 처음 TDD로 진행했을 때 실시간으로(프로젝트 마감 1일 전에도) 바뀌는 기획에 하나 둘 씩 추가되는 DB Column들과 그 때 마다 TestCode를 변경해야하는 번거로움으로 인해 첫 번 째 도전은 너무도 쉽게 실패로 끝났습니다. 그리고 리팩토링, 프로젝트가 끝나고 리팩토링 할 때, 그리고 이미 개발된 기능의 기획 변경이 있을 때 혹은 복잡한 경우의 수가 있을 대 테스트 코드를 활용하여 잘 마무리 지었을 때는 조금 자신감도 붙었습니다. 예전에 내가 작성한 소스코드를 보면, 비대해진 BaseClass와 이를 상속 받았지만 제대로 부모 클래..

Django Swagger(drf_yasg) 수정하여 FastAPI + Pydantic 처럼 API문서 자동화 하기

안녕하세요. 글쓰는 개발자 입니다. Frontend와 원활한 협업과 의사소통 비용 감소를 위해 API 문서화를 중요하게 생각합니다. drf_yasg 를 활용해서 Backend에서 쉽게 작성하고, API 문서를 보는 사람이 최대한 편하게 읽을 수 있도록 고민을 많이 했습니다. (참고: Django Swagger 연동하기 1편, 2편) 그러던 어느 날(약 1년 전) FastAPI 를 처음 접하게 되었고 Pydantic을 활용해 endpoint의 argument에 type만 지정해주면 자동으로 문서가 작성되는 것을 보고 신세계라 느껴졌습니다. 편리하다 생각했던 @swagger_auto_schema 데코레이터는 FastAPI를 접하고 '불편한', '한 번 더 작업해야하는' 것이라는 기분이 들었습니다. 그렇게 당..

Backend/Django 2023.05.02

Django Base Model 을 통한 Model 중복 제거 (db_table, primary_key), __init_subclass__

안녕하세요. 글쓰는 개발자 입니다. Django ORM 을 사용하면, 간편하게 Model을 정의하고 강력한 migration 기능 덕분에 손 쉽게 DB에 Table을 생성 할 수 있습니다. 하지만, 아래와 같이 매번 class Meta 코드를 작성하고 db_table을 정의하는 것이 불편하게 느껴졌습니다. 그래서 BaseModel을 만들고 이를 상속 받기만 하면 Model을 생성 할 때 마다 중복 되는 작업을 없앨 수 있도록 하였습니다. 요구 사항은 다음과 같습니다. 1. Model 의 Class name을 "Model" 을 제외하고 snake case 로 변환한 값을 Table name으로 세팅 2. id 는 Auth Increment로 적용 3. Mixin을 활용해 TimeStamped Column ..

Backend/Django 2023.05.02

Django Middleware에서 API 접근 권한 검증하기 (Django, DRF의 request.user 와 Middleware에의 AnonymousUser)

안녕하세요. 글쓰는 개발자입니다. 어플리케이션을 개발하다 보면, 서비스 내 정의된 권한 레벨에 따라 접근 가능한 API가 상이한 경우가 많습니다. Django에서 'request.user' 를 통해 User 객체를 불러오고 권한 레벨에 해당하는 인자를 검증하여 403 Forbidden Error 를 반환 할 수 있습니다. 다양한 방법이 있겠지만, Django Custom Middelware 를 활용해 End Point가 '/admin/' 으로 시작하는 API에 대해 권한 검증하는 방법을 소개 합니다. 그런데 저는 이 과정에서 간단히 Middleware에서 response 객체 생성 이전에 request.user 를 활용해 User 객체를 받아오면 된다고 생각했지만, 지속적으로 'AnonymousUser'..

Backend/Django 2023.05.02

Git prepare-commit-msg 를 통한 commit convention 정착시키기

안녕하세요. 글쓰는 개발자 입니다. prepare-commit-msg 파일을 생성하여, git commit message convention을 정하고, 이를 준수했을 때만 commit이 가능하게 하는 법을 소개합니다. Commit message의 허용되는 Prefix를 정하고 commit 수행 시 message를 검증하고 Convention을 준수하지 않는 경우, 안내 메시지를 출력하는 방법 입니다. 적용 순서는 다음과 같습니다. .git/hooks 확인, prepare-commit-msg 생성 및 권한 부여 .git/hooks/prepare-commit-msg 작성 commit 수행 ------------------------------------------ 2023. 05. 04 추가 --------..

개발환경 구축 2023.04.26

[2023년 3월 회고] - 4월 마지막 주에 쓰는 3월 회고

지난 달 회고를 작성하면서 분명히 습관화 해야지... 해야지... 하면서도 이렇게 늦게 쓰게 되었습니다. 4월 마지막 주에 써버리면 마치 이 회고는 3월 회고가 아니라 3월 ~ 4월 셋 째 주를 포함하는 회고가 될 것 같아서 캘린더와 Gitlab commit log를 보며, 최대한 3월의 느낌을 반영 하려 합니다.(미리 써야겠습니다...) 추후 진행 할 업무에 대한 PoC로써 kubeFlow PipleLine 으로부터 전달받은 Metric을 Kafka Broker로 전달하고 Python Websocket에서 subscribe하여, 클라이언트로 전달하는 기능을 완성했습니다. 그리고 동시에 Elastic Search, Kibana 또한 연동 되었구요. 이 과정에서 저는 Python Websocket으로 Ka..

[Django + Redis + Celery] Python 분산 비동기 작업 큐 (Distributed Task/Job Queue) 튜토리얼

Django, Django RestFramework 를 활용해 웹 어플리케이션을 개발하면서, 처리 시간이 오래 걸리는 API 를 개발해야하는 경우가 있습니다. 처리 시간이 지연되어 사용자의 대기 시간이 길어지면서 사용자 경험은 부정적으로 흘러갑니다. 이런 문제를 해결하기 위해 Celery를 Django app에 포함 시켰고, 사용 방법을 소개 합니다. 튜토리얼 방식으로 진행하며, Python 가상환경 설정 및 Django 설치 부터 차근차근 진행하겠습니다. 본 튜토리얼을 통해, 다음 내용을 얻으실 수 있습니다. 1. Celery를 어떤 경우에 사용하는지 2. Django app 에 Celery를 적용하고, Redis 를 Message Broker로 사용하기 3. Celery task_id 를 활용한 ta..

Backend/Django 2023.03.31

Python decorator(파이썬 데코레이터) functools.wraps 사용하기 / 디버깅 가능한 데코레이터 작성

데코레이터는 감싼 함수가 실행 되기 전과 후에 다른 코드를 실행 할 수 있게하고, 재사용 가능한 빌딩 블록을 정의하며, 그 빌딩 블록으로 다른 함수의 동작을 변경하거나 확장할 수 있는 python의 유용한 기능입니다. 하지만, 단점이 있다면 디버깅이 어렵고 기존(감싸지는) 함수의 메타데이터를 숨겨버리는 단점이 있습니다. 메타 데이터로써 원래 함수명, docstring, 매개변수 리스트는 클로저(closure)에 의해 숨겨집니다. Meta data를 잃어버리는 데코레이터(Decorator) 아래 코드는 인자로 전달 받은 함수(Python에서 함수는 일급 객체) 의 반환 값을 대문자(uppercase)로 변환하여 반환하는 데코레이터(decorator) 를 작성하고, hello_world 메소드를 데코레이터(..

Python 2023.03.08

PEP-3102 Keyword-Only-Arguments / python method 에서 asterisk(별표) 의미 (*, *args, **kwargs)

안녕하세요. 글쓰는 개발자 입니다. Python 개발을 하다보면 종종 보이는 것이 있습니다. 바로, 흔히들 별표라고 부르는 asterisk, * 입니다. Python 개발자라면 누구나 익히 알고 있듯이 곱셉 연산, unpacking 등에 사용되는 것은 물론, *args / **kwargs와 같이 positional / keword arguments 역할도 할 수 있습니다. 그런데 최근 단순 궁금증으로 FastAPI의 APIRouter 구현을 뜯어보던 중 FastAPI에 작성된 mutiple arguments를 받는 method들은 대부분 arguments로 asterisk (*)를 포함하고 있었습니다. '그림1'과 같이 fastapi/routing.py 파일의 APIRouter Class의 add_api..

Python 2023.03.03

FastAPI, Django, Django REST Framework, Flask 비교 - 어떤 프레임워크를 선택해야 할까?

안녕하세요. 글쓰는 개발자 입니다. 약 2년 간 Django 를 사용했던 제가 이번 신규 프로젝트의 프레임워크로 FastAPI를 선택했습니다. 그 과정에서 여러 고민이 있었는데요. 제가 FastAPI 사용 결정을 내리는 동안 Django 와 어떤 것이 다른 지 정리한 것을 소개합니다. Intro Django Dynamic Website 개발을 위한 Fullstack Web Framework 입니다. Fullstack인 만큼 방대한 기능을 보유하고 있습니다. 내장 ORM과 DB migration 덕분에 model을 쉽게 관리 할 수 있습니다. 또한, 높은 보안성 으로부터 cross-site scripting, SQL injecttion 등의 위험으로부터 안전합니다. Instagram 개발에 사용되었을 정도..

Python 2023.03.01
반응형