프로그래밍 36

Cursor 페이징 설계 재구성 : 정렬 기준이 하나 이상일 때

Cursor 페이징많은 사람들이 알고 있듯, LIMIT과 OFFSET을 사용한 페이징은 쿼리 실행 횟수가 많아지고, 그에 따라 응답 시간이 점점 길어지는 문제가 있다. ( 500건씩 N번 조회하면 (1 * 500) + … + ( N * 500) 건의 레코드 읽기가 발생.. ) 반면에, 커서 페이징은 마지막으로 조회한 항목의 고유값을 기준으로 다음 페이지를 가져오는 방식이다.이 방식은 OFFSET처럼 앞에서부터 N개의 데이터를 무시하고 건너뛰는 것이 아니라, 바로 다음 커서 이후의 데이터를 조회하기 때문에 조회량이 많아져도 쿼리성능이 일정하다는 장점이 있다. 초기 Cursor 페이징 구조 (ID 기반)초기 Cursor 페이징은 각 테이블에 공통으로 존재하는 기본 키인 id 값만을 기준으로 설계했다.1. R..

[Testing] 테스트 커버리지

테스트 커버리지작성한 코드들이 얼마나 테스트 되었느지에 대한 지표를 수치로 보여주는 것을 테스트 커버리지라고 한다.회사마다 이상적인 커버리지 비율은 다르고, 팀의 성숙도나 상황에 따라 접근 방식도 다르다. 내가 일했던 50~60명 규모의 스타트업에서는 커버리지를 따로 측정하진 않았고, 주로 간단한 API 통합 테스트만 작성했다. 암묵적으로 "통합 테스트는 쓰자"는 분위기는 있었지만, 현실적으로 일이 몰릴 땐 테스트가 생략되는 경우도 많았다. 그래서 이번 사이드 프로젝트에서는 테스트 커버리지도 직접 측정해보면서 테스트 설계와 도구에 대해 조금 더 이해해 보고자 한다. 도구테스트 도구들은 많지만, pytest와 pytest의 플러그인인 pytest-cov을 설치했다. pytest는 이미 실무에서 많이 쓰고 ..

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 + Prometheus + Grafana 연동으로 모니터링 환경 구축하기 ( Grafana )

https://kojub.tistory.com/52 FastAPI + Prometheus + Grafana 연동으로 모니터링 환경 구축하기 ( Prometheus )프로젝트 init을 마친 후, prometheus + grafana 조합의 모니터링 시스템을 구축했다.이왕 만들 거, 추후에 API 상태 모니터링을 통해 좀 더 안정적인 서비스를 운영해보고자 연동을 해보았는데, 그 과정kojub.tistory.com 앞전에 FastAPI 프로젝트에 Prometheus를 연동해 보았다.설정한 prometheus를 시각화 해서 보여주기 위한 Grafana 연동도 해보자.Grafana 컨테이너 실행 및 접속 방법요즘엔 Grafana에서 자동으로 Prometheus 데이터 소스 플러그인이 내장되어 있다.이 플러그인을..

FastAPI + Prometheus + Grafana 연동으로 모니터링 환경 구축하기 ( Prometheus )

프로젝트 init을 마친 후, prometheus + grafana 조합의 모니터링 시스템을 구축했다.이왕 만들 거, 추후에 API 상태 모니터링을 통해 좀 더 안정적인 서비스를 운영해보고자 연동을 해보았는데, 그 과정들을 살펴보자. prometheus FastAPI 적용1. docker desktop을 활성화 시킨 뒤, prometheus의 docker 이미지를 로컬에 다운로드 한다.docker pull prom/prometheus 2. 루트경로에 prometheus_data 폴더를 생성한 뒤, 그 안에 promehteus 설정파일 (promehteus.yml)을 만들어준다.global: scrape_interval: 15sscrape_configs:- job_name: 'bread-pilgrim'..

[ PR Agent ] CLI 방식 동작구조

PR Agent 를 로컬에서 실행해보았다. CLI 방식으로 실행해보았고, 동작구조를 살펴보기 위해 pr_agent/cli.py 파일을 들여다 보았다. 동작구조 도식화0. cli.py 파일 트리거cli.py 파일이 실행되면, run 메소드가 실행된다.if __name__ == '__main__': run() 1. CLI argument parserrun 메소드가 실행되면, 가장 먼저 set_parser 즉, CLI로 입력된 커맨드라인 인자값을 파싱하는 메소드(=set_parser)가 실행된다.def run(inargs=None, args=None): parser = set_parser() set_parser() 메소드PR-Agent를 실행할 때 어떤 인자를 받을지 정의하는 역할을 한다.def ..

프로그래밍/LLM 2025.05.08

[PR Agent] 1. 환경설정 및 테스트

https://qodo-merge-docs.qodo.ai/usage-guide/ Usage guide - Qodo Merge (and open-source PR-Agent)Noneqodo-merge-docs.qodo.aiPR Agent 란 PR-Agent는 Pull Request를 보다 효율적으로 리뷰하고 처리할 수 있도록 도와주는 오픈소스 도구로, 이번 OSSCA에서 기여할 프로젝트이다.오픈소스 기여의 초석을 다지기 위해, 해당 프로젝트의 환경 설정 과정을 먼저 살펴보았다. Run from sourcehttps://qodo-merge-docs.qodo.ai/installation/locally/#run-from-source1. pr-agent 오픈소스 레포 클론git clone https://githu..

프로그래밍/LLM 2025.05.02

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

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

[CodeRabbit] 자동 Pull Request 리뷰 툴 후기

https://kojub.tistory.com/41 [EggChatter] CodeRabbit을 활용한 PR 코드 리뷰 자동화혼자 사이드프로젝트를 하다보면 코드리뷰를 받을 수 없다는 점이 늘 아쉽게만 느껴졌다.그래서 자동으로 코드리뷰를 해주는 툴을 찾아보다가 CodeRabbit이라는 AI 코드리뷰 툴을 찾게 됐다. CodeRakojub.tistory.com  얼마전에 CodeRabbit이라는 자동 코드리뷰 툴을 사이드 프로젝트에 붙였었다.누군가가 CodeRabbit이 어떠냐는 질문을 한다면,진짜 혼자 개발하는 사이드플젝에선 정말 좋은 선택지라고 생각한다.좋은 점을 크게 두 가지 꼽자면,1. 기본적으로 리뷰를 정말 잘해준다.2. 무료 트라이얼 기간 동안에 카드 등록을 하지 않아도 되어, 불필요한 과금이 발..

CodeRabbit을 활용한 PR 코드 리뷰 자동화

혼자 사이드프로젝트를 하다보면 코드리뷰를 받을 수 없다는 점이 늘 아쉽게만 느껴졌다.그래서 자동으로 코드리뷰를 해주는 툴을 찾아보다가 CodeRabbit이라는 AI 코드리뷰 툴을 찾게 됐다. CodeRabbit 사이드 프로젝트에 붙여보기1. 회원가입계정을 생성하면 아래와 같은 화면이 나온다.여기서 나의 깃허브 계정을 통해 CodeRabbit을 적용한 레포지토리들을 동기화하고, 이를 대시보드에서 확인할 수 있다. 2. coderabbbit을 적용할 repository 추가우측 상단에 있는 Add Repositories 버튼을 클릭하면, 아래와 같이 CodeRabbit을 적용할 계정과 oranization을 선택할 수 있는 화면이 나타난다. 계정이나 Organzation을 선택하면, 그에 속한 레포지토리에 ..

프로그래밍/Git 2025.03.10