전체 글 285

[Django] Prefetch 에 대한 이해

Prefetch 란perfetch_related 함수는 쿼리에서 Join을 하지 않고, 개별 쿼리를 실행 한 후 django에서 직접 데이터를 조합하는 것 예시) A, B, C 모델이 존재 / A:B 는 1:N / B:C 는 1:N의 관계를 가짐 비교 1 ) A에서 C 까지의 Prefetch1안. Prefetch 병렬로 쓰기a = ( A.objects.filter(id=1).prefetch_related( Prefetch( "b_set", # A에서 B 역참조 ), Prefetch( "b_set__c_set", # A에서 C역참조 ), )).first() 2안. Prefetch 중첩해서 쓰기a = ( ..

[Django-Ninja] API 문서 Docs 커스텀

Ninja Docs기본적으로 Ninja에서는 가벼운 설정으로 Swagger나 Redoc을 지원하며https://django-ninja.dev/guides/api-docs/ 문서를 관리하기 위한 다양한 부가 기능들이 존재한다.문서 권한 설정문서 숨기기커스텀 태그 (openapi_extra 속성 v1이상 지원)커스텀 Docs 만들기 (링크) 등 도 가능하다. 문서 숨기기기본적으로 /api/openapi.json 을 바탕으로 -> /api/docs 의 문서를 생성해준다. 이를 Production 등에 활용시 다음과 같이 설정하면, url을 감춰준다.from ninja import NinjaAPIapi = NinjaAPI(docs_url=None) 참고 링크https://github.com/vitalik/dja..

[Utils] Python 메모리 프로파일러 (memory_profiler)

배경특정 API를 호출시 계속 서버의 메모리가 폭증하는 현상 발생-> loop 혹은 DB 데이터가 Python 메모리로 불러오는 과정에서 문제가 있을 것으로 생각하고 프로파일링을 통해 원인을 찾아 보기로 하였다. 결과적으로 API에서 비효율적으로 파이썬 메모리를 사용하는 로직을 찾아 수정하여서 해결하였다. memory_profiler  외부 패키지 라이브러리메모리를 개괄적으로 프로파일링 할 수 있는 외부 패키지 라이브러리docs 링크 : https://pypi.org/project/memory-profiler/ memoy-profilerA module for monitoring memory usage of a python programpypi.org 패키지 설치pip install memory_profi..

카테고리 없음 2024.05.05

[디자인패턴] 행동 패턴 - 상태(State) 패턴

상태 (State) 패턴이란State 패턴은 행동 패턴 중 하나로 내부 상태가 변경될 때 객체의 행동을 교체한다. 객체가 상태(값)을 변경하여, 행동의 변화를 유발함으로서 클래스 자체가 변경된 것 처럼도 보일 수 있다.  등장 배경[초안, 검토, 출판본]의 상태를 가진 문서 객체가 있다고 가정할 때, 발행(publish)라는 메서드는 각 상태(State) 마다 다르게 작동할 것이다. 초안: 검토 상태로 변경 검토: 공개 상태로 변경 / 관리자만 가능출판본: 이미 발행되었기에, 아무것도 하지 않음  이 처럼 유한한 범위의 상태를 가지고 있는 프로그램에 상태 변화에 따라 다르게 행동할 수 있도록 설계 되는 것이런 변경(transition)이라고 불리는 원칙은 유한한 범위이고, 미리 결정 되어야 한다.  예시..

[디자인패턴] 행동 패턴 - 전략(Strategy) 패턴

전략 (Strategy) 패턴이란행동 패턴 방법 중 하나로 동일한 레벨의 다양한 알고리즘을 정의 및 캡슐화 하고, 런타임시 동적으로 해당 알고리즘을 선택할 수 있게 하는 디자인 패턴이다. 이로서, 복잡한 알고리즘 내용을 비즈니스 로직에서 분리 하여 감출 수 있고, 클라이언트는 런타임 중 자유롭게 알고리즘을 수행하고 변경 할 수 있다. 등장 배경 예시로여행자들이 목적지 까지 가기 위한, 다양한 방법(대중교통, 차량 등등)에 대해 네비게이션을 통해 볼 수 있다고 가정여행자들은 원하는 방법을 선택할 때 마다, 해당 방법으로 목적지 까지 가는 방법을 보여 줄 수 있다.  예시 구조1. 목적지 까지 가기 위한 전략(알고리즘, Strategy) 들은 다 캡슐화를 한다.ex. RouteStrategy 인터페이스를 상..

[디자인패턴] 행동 패턴 - Command 패턴

Command (커맨드) 패턴이란커맨드 패턴은 행동 패턴 중 하나로, 요청을 요청 정보를 가지고 있는 독립 실행 객체로 전환하는 패턴을 말한다. 이 변환을 통해, 요청을 메서드 파라미터로 넘기거나, 요청의 실행을 지연 또는 큐에 넣기, 되돌리기 기능 등을 지원 가능한 패턴한다. 등장 배경텍스트 에디터 앱 제작시 (좌) 각 버튼들에 공통된 기능이 추가가 필요하다고 가정 (ex. 툴 바를 위한 핸들러)  가장 간단한 방법은 버튼 종류 마다 중복된 코드를 작성하는 것. 해결책비즈니스 로직과 UI 분리 처럼, GUI 객체가 요청을 직접 보내는 대신에, 요청 디테일을 추출하고, 호출되는 객체, 메서드 이름, 파라미터 리스트를 해당 요청을 발생 시키는 분리된 커맨드 클래스로 옮겨 진행.  즉 커맨드 객체는 여러 G..

[디자인패턴] 행동 패턴 - 옵저버 패턴

옵저버 패턴 이란?Observer 패턴은 관찰 중인 개체(주제, subject)에 이벤트가 발생시, 다른 개체들(구독자, observer)에 알리는 메커니즘으로 주제에 변화가 있으면 갱신 내용을 observer에 전달한다. 한 객체의 상태가 바뀌었을 때, 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식은 일(주제)대다(구독자)의 의존성을 가진다고도 정의할 수 있다. 이러한 메커니즘을 구독 메커니즘이라고도 하며, Subject, Observer / Subscriber - Publisher 라고도 많이 지칭한다.기술적인 예시는 메세지 큐(Message Queue) 시스템 활용시 / Event-Driven Systems 등에서 사용 될 수 있다.  특징Subscriber(구독자)와..

[AWS] EC2 경보 생성 및 SQS 알림 받기 (재시동)

개요 문제 : EC2 인프라가 메모리 부족으로 웹서버 자체가 다운되는 현상 발생 EC2에 경보를 달고 일정 조건을 충족하면, 인프라 재부팅 및 웹서버 재실행을 통해 복구 하기로 함 EC2 경보 설정 1. EC2 인스턴스 경보상태 탭에서 경보 추가 2. 경보 생성 3. 경보 알림 이름 작성 4. 경보 작업 -> [재부팅, 종료, 시작 등] 5. 경보 임계값 - CPU 사용율 / 상태 검사 실패 둘중 하나 / 네트워크 바이트 량 등등 - 임계값 80% 설정 - 경보 이름, 경보 설명 작성 6. 기존 서버의 평균 그래프 확인 - 임계값 설정이 애매하면, 그래프를 통해 확인도 가능 7. 셋팅 완료 EC2 SNS설정 AWS SNS 서비스 1. 주제 생성 2. 유형 및 이름 설정 (FIFO -> Amazone SQ..

AWS/AWS 일반 2024.04.21

[Django Ninja] 배포용 도커파일 (Dockerfile)

Dockerfile 기본적으로 Multi-Builder 사용 (builder-image / runtime-image) 만약 linux 에서 제공하는 도구(vi 등)를 쓰고 싶다면 설치 후 runtime-image 에 복사 해야 함 프로젝트명 : mysite / 실행 log는 ./access.log 에 기록 배포는 uvicorn에 gunicorn을 worker로 사용하여 실행 (worker 갯수는 cpu 코어 갯수 * 2) 로컬에 배포 하고 싶다면 ${SERVER_IP} 를 수정 (ex. 127.0.0.1 / 0.0.0.0 ) #################### Server Build #################### FROM python:3.11-slim AS builder-image RUN apt..

[좋은 API 설계하기] API 응답 시 모든 상태코드 200 고정

배경 API 설계시 일부 기업이나 방법론 중 모든 상태 코드를 200으로 처리하는 방법이 종종 거론되곤 한다. 관련 링크 : https://okky.kr/questions/661303 (카더라긴 하지만 댓글에 기타 정보 내용이 있음) 일반적으로 응답 코드는 요청에 대한 상태를 나타내는 HTTP 상태 코드(Status code)와, 에러에 대한 정보를 담은 세부 에러 코드(Error code)로 나뉘며 일반적인 처리는 상태 코드별로 > 세부 에러 코드를 나누는 것이 일반적이다. 위에 말한 방법은 상태 코드를 통일하고 > 세부 에러 코드로 통합 하는 것 이다. 모든 상태코드를 200으로 고정하여 처리 하는 경우 주된 목적 : HTTP Status Code가 노출 될 시 보안에 위험이 있을 수 있음 (ex...