본문 바로가기

분류 전체보기

(135)
Redis는 싱글스레드지만 동시성 문제가 발생한다 1. Redis는 싱글 스레드로 동작하지만 동시성 문제가 발생할 수 있다.Redis는 싱글스레드로 동작하여 명령어 한개씩은 원자적으로 진행되지만,아래 상황에서는 각 명령어를 원자적으로 처리해도, 동시성 문제가 발생할 수 있다.Client A: GET stock (결과: 1)Client B: GET stock (결과: 1)Client A: stock - 1 → SET stock 0Client B: stock - 1 → SET stock 0⇒ 결론적으로 Redis는 싱글 스레드로 동작하지만, 여러 작업을 번갈아 가며 진행하기 때문에 동시성 문제가 발생할 수 있다.즉, 동시성은 있지만 병렬성은 없는 것이다. - 동시성 : 하나의 CPU 또는 스레드가 여러 작업을 번갈아 가며 진행해, 겉보기엔 동시..
API 성능 개선 - DB 인덱스 설정 1. 배경 및 목적API 성능 개선 - SQL 튜닝 을 진행하며 각 SQL에 적합한 인덱스를 적용하기 위해 인덱스를 연구함.연구하고 적용하는 과정을 서술했다.2. 고민사항2.1 싱글인덱스(uuid/doc_uid)와 복합인덱스(uuid, deleted_at) 중 어느걸 선택할까…해당 쿼리의 속도를 줄이는게 매우 중요쿼리가 매우 복잡하고 필요한 인덱스가 많기 때문에 복합인덱스 선택다른 쿼리에서도 많이 사용하는 uuid와 doc_uid, deleted_at은 필수2.2 uuid4 index가 얼마나 해비한지랜덤 값이기 때문에, 데이터베이스에 삽입할 때 순차적이지 않아서 성능 저하가 발생할 수 있음 특히, 클러스터링 인덱스를 사용하는 경우 성능이 떨어질 수 있음.PK의 보안 때문에 UUID를 고려한다면 UUID..
API 성능 개선 - SQL 튜닝 1. 배경 및 목적API 성능 개선 - 비동기 연구 이후에 인덱싱 상태 관련 로직이 추가됨.이후, 해당 API는 호출 시 평균 1.9초 이상의 시간이 소요되어, 서비스 응답 속도에 영향을 주고 있음.DB select 작업 : 최대 2.1s (약 75000건)Queue send 작업 : 최대 0.23s (약 500개 task)Redis set 작업: 최대 0.5s (약 500건)이 중, DB 조회 작업에서 주요 병목 구간이 발견되었고, 조회되는 데이터가 많아질수록 더 오래 걸릴 것으로 예상됨.이에 따라, 해당 API의 전반적인 SQL 쿼리 효율성을 검토하고 성능 개선을 시도하였음.2. 개선 전 성능 현황DB select 작업 : 평균 1.03s (약 41000건)API 실행 시간 : 평균 2.165s (약..
API 성능 개선 - 비동기 연구 1. 배경 및 목적LAG 정보를 업데이트하는 인덱싱 요청API는 호출 시 평균 1.2초 이상의 시간이 소요되어, 서비스 응답 속도에 영향을 주고 있음.이에 따라, 다량의 I/O 작업을 포함하는 해당 API의 비동기 처리 적용 가능성을 검토하고 성능 개선을 시도하였음.2. 개선 전 성능 현황주요 병목 구간:DB select 작업 : 최대 2.1s (약 75000건)Queue send 작업 : 최대 0.23s (약 500개 task)Redis set 작업: 최대 0.5s (약 500건)평균 실행 시간: 1.2s3. 최종 성능 개선 결과전체 API 평균 실행 시간: 1.24s → 0.78s개선 폭: 약 40**% 단축**주요 개선 포인트: Redis pipeline + 비동기 처리 최적화4. 성능 개선 방법4..
CI/CD Tools 1. CI/CD Tools 종류1-1. GitHub Actions장점: GitHub과 완벽 통합, 간단한 설정 (.yml), Docker build/push 쉬움단점: GitHub에 코드가 있어야 유리, 병렬 워크플로우는 요금제 제한도커 친화도: ★★★★★💡 추천 상황: GitHub에서 코드 관리 중이고 Docker 이미지 빌드/배포도 함께 하고 싶을 때1-2. GitLab CI/CD장점: GitLab과 완벽 통합, 강력한 권한 제어, 무료로도 강력한 기능 제공단점: GitLab EE는 비쌈, 러닝커브 있음도커 친화도: ★★★★★💡 추천 상황: 자체 GitLab 운영 중인 기업, 보안/권한 제어가 중요한 환경 GitHub Actions와 GitLab CI/CD 차이 (실제 기업에서 GitLab을 많이..
SQL 작성법과 실행순서 문법 순서 SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY->LIMIT 실행 순서FROM - > ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT FROM : 조회 테이블 확인ON : 조인 조건 확인JOIN : 테이블 조인 (병합)WHERE : 데이터 추출 조건 확인GROUP BY : 특정 컬럼 그룹화HAVING : 그룹화 이후 데이터 추출 조건SELECT : 데이터 추출DISTINCT : 중복 제거ORDER BY : 데이터 순서 정렬   + Spring boot QueryDSL 사용법
DB 쿼리 최신순 1건 조회하기 단건 조회 1. limit 이용하기SELECT *FROM document_statusWHERE doc_uid = {document_uid}ORDER BY docsta_created_at DESCLIMIT 1;2. distinct 이용하기SELECT DISTINCT ON (doc_uid) *FROM document_statusWHERE doc_uid = {document_uid}ORDER BY doc_uid DESC, docsta_created_at DESC; 1번째 방법이 더 빠름. 2번째 방법의 order by에는 disctinct에 들어가는 컬럼이 포함되어야 함. SQLAlchemy 더보기 stmt = ( select(DocumentStatus) ..
FastAPI sqlalchemy DB 쿼리 생성법 1. execute, scalars, scalar 차이session.execute(stmt)쿼리 실행 → Result 객체 반환Result 객체session.execute(stmt).all()전체 결과 가져오기List[Row][ (1, 'Alice'), (2, 'Bob') ]session.execute(stmt).fetchall()Core 스타일 전체 결과List[Tuple][ (1, 'Alice'), (2, 'Bob') ]session.execute(stmt).first()첫 결과 RowRow or None(1, 'Alice')session.scalars(stmt).all()하나의 컬럼 or 모델 객체 리스트List[Any][1, 2] 또는 [User(id=1, name='Alice'), User(id..