분류 전체보기 1270

[Python] Redis - 연결 재시도

개요2024.08.07-[Python] redis - pub/sub 구현하기에서 Python Redis 라이브러리를 사용해 pubsub를 구현했었는데, subcriber에서 서 예기치 않은 연결 종료로 인해 구독이 멈춘 이력이 있다. 구현 코드에 연결 재시도 로직이 따로 없어서 추가 구현이 필요할 것 같다.그보다 우선 Redis-py에서 제공하고 있는 재시도 기능부터 살펴보려고 한다. retryRedis-py는 실패 후 특정 횟수만큼 재시도를 수행하는 Retry 기능을 제공하고 있다.from redis.retry import RetryRetry(backoff, retries, supported_errors=(, , ))기본적으로 재시도 간격, 그리고 재시도 횟수를 지정해야 하는 것 같다. Retry 객..

Python 2025.06.05

[알고리즘] 최장 증가 수열(LIS) - DP

문제최근 알고리즘 문제를 풀던 중 증가수열과 관련된 문제를 발견했다. 완전 탐색으로도 구현할 수 있지만 비효율적으로 보여 좀 더 좋은 방법을 정리해 본다. 최장 증가 부분 수열최장 증가 부분 수열(Longest Increasing Subsequence) 문제는 주어진 수열에서 오름차순으로 정렬된 가장 긴 부분 수열을 찾는 문제이다. 부분 수열이 연속적이거나 유일할 필요는 없다. 예로 들어, 아래 그림과 같은 수열이 있다고 하자.이 수렬의 증가 부분 수열은 [1, 5], [1, 4], [2, 3, 8] 등 여럿 존재하지만, 그중 길이가 가장 긴 최장 증가수열을 찾으면 아래와 같다. 접근최장 증가 수열을 구현하는 대표적인 방법은 완전 탐색, DP를 이용하는 방법이다.수열의 한 원소 K에 대해, K에서 끝..

Algorithm 2025.06.04

[Git] reflog - HEAD 이력 확인하기

개요git reset으로 커밋을 취소하던 중 실수로 유지해야 하는 커밋도 함께 취소를 해버렸다. 방법을 찾던 중 reflog 명령여를 활용하는 방식이 있어 reflog라는 명령어 자체에 대해서 일단 알아보고자 한다. reflog로컬 저장소에서 HEAD 또는 브랜치가 업데이트된 시점을 기록한다. 이 이력은 로컬 저장소의 아래 경로에 기록된다..git/logs/ref/heads# 또는.git/logs/HEAD즉, 변경 이력을 확인하고 싶다면 reflog 명령어가 아니라 위의 파일을 확인해도 된다. reflog는 list, show, expire, delete 등 다양한 하위 명령어를 제공하고 있다. 이 글에서는 주로 show 명령어를 다루려고 한다. 사용법기본적으로 아래와 같이 하위 명령어를 생략하여..

Git | GitLab 2025.06.02

[MySQL] OPTIMIZE - 테이블 최적화

개요AWS RDS 사용 중 총 100GB의 스토리지 용량 중 95GB를 사용하고 있다는 알람을 받았다.문제를 해결하기 위해 데이터베이스 테이블에서 데이터를 삭제했는데 스토리지 용량을 줄어들지 않는 상태다.이번 글은 이 문제를 해결하는 방법 중 하나인 OPTIMIZE TABLE 구문에 대해서 정리한다. 원인데이터베이스는 데이터를 삭제하면 실제로 데이터를 삭제하는 것이 아니라 삭제 표시만 한 후 다른 데이터가 오면 그 위에 덮어쓰는 방식으로 동작한다.좀 더 간결하게 표현하면 데이터를 삭제해도 해당 공간을 바로 회수하지 않는다. 이후에 데이터를 삽입할 떼 보다 빠른 성능을 위해 할당한 공간을 재사용하기 위함인데, 용량 확보 필요시 OPTIMIZE TABLE 구문으로 삭제한 공간을 실제 디스크 공간으로 회수..

Database 2025.05.30

[LeetCode] 239. Sliding Window Maximum

문제문제 : https://leetcode.com/problems/sliding-window-maximum/주어진 정수 숫자 배열과 왼쪽에서 오른쪽으로 이동하는 k 크기의 슬라이딩 윈도우가 있다고 하자. 슬라이딩 윈도우 내에는 k 개의 숫자만 존재한다. 슬라이딩 윈도우가 한 칸씩 오른쪽으로 이동할 때마다의 최댓값을 반환하라 예시 )Input: nums = [1,3,-1,-3,5,3,6,7], k = 3Output: [3,3,5,5,6,7]Explanation: Window position Max--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 ..

[알고리즘] 슬라이딩 윈도우

개요2025.05.19-[알고리즘] 투 포인터에서 배열을 효율적으로 탐색하는 방법 중 하나인 투 포인터 알고리즘에 대해서 알아보았다. 이번 글에서는 투 포인터 알고리즘과 함께 언급되는 슬라이딩 윈도우라는 알고리즘에 대해서 알아본다. 슬라이딩 윈도우슬라이딩 윈도우란 네트워크에서 사용하던 알고리즘으로 고정 사이즈의 윈도우가 이동하면서 윈도우 내의 데이터를 이용해 문제를 풀이하는 알고리즘이다.교집합의 정보를 공유하고 차이가 나는 양 끝의 원소만 갱신하는 방식으로 구현하는데, 배열 내 일정 범위의 값을 비교할 때 유용하다. 투 포인터 알고리즘과 연동하여 많이 사용한다. 투 포인터 VS 슬라이딩 윈도우슬라이딩 윈도우와 유사한 알고리즘은 투 포인터 알고리즘이 존재한다. 다만 부분 배열의 길이가 가변적인 ..

Algorithm 2025.05.28

[알고리즘] 투 포인터

개요알고리즘 문제를 풀어내다 보면 간혼 투 포인터 알고리즘이라는 단어를 접할 때가 있다. 배열을 순회할 때 사용하는 것 같은데, 이번 글에서는 투 포인터 알고리즘에 대한 개념을 알아본다 투 포인터 알고리즘1차원 배열에서 각자 다른 원소를 가리키고 있는 2개의 포인터를 조작해 가면서 원하는 값을 찾을 때까지 탐색하는 알고리즘으로, 보다 쉽게 표현하면 리스트에 순차적으로 접근할 때 두 점의 위치를 기록하면서 처리하는 알고리즘이라고 할 수 있다.특정 조건을 만족하는 부분 구간을 효율적으로 탐색할 수 있기 때문에 이중 for문으로 처리해 시간복잡도가 O(N^2)인 작업을 O(N)으로 줄일 수 있다. 일반적으로 배열이나 리스트가 정렬되어 있을 때 사용한다. 구현 방식일반적으로 투 포인터 알고리즘은 다음과 같이..

Algorithm 2025.05.27

[Python] defaultdict - 기본값을 포함한 딕셔너리

개요Python으로 딕셔너리를 사용하다 보면 키에 대한 값이 없을 때를 처리해야 하는 경우가 발생할 수 있다. 내 경우에는 보통 아래와 같이 처리해 오는 편이었다.def count_letters(word): counter = {} for letter in word: if letter not in counter: counter[letter] = 0 else: counter[letter] += 1 return counter예시 코드의 경우에는 0이 일종의 기본값인 셈인데, 만약 딕셔너리에 기본값을 설정하면 불필요한 조건문을 제거함으로써 보다 가독성 있는 코드가 될 수 있을 것 같다.따라서 이번 글에서는 딕셔너리에 기본값을 설정하..

Python 2025.05.26

[FastAPI] Form 데이터 받기

개요FastAPI를 사용해 Web 애플리케이션을 구현하던 중, 사용자가 Form으로 제출한 데이터를 받아서 처리할 필요가 생겼다. 여태까지 FastAPI를 사용할 때는 JSON 형식의 요청 본문이나 쿼리 매개변수를 처리해 왔었는데, 이번 글에서는 폼 데이터를 처리하는 방법을 정리해 둔다. 설치 필요 라이브러리먼저 FastAPI에서 Form 데이터를 처리하기 위해서는 아래 라이브러리 설치가 필요하다.$ pip install python-multipart 모듈 임포트Form 데이터를 입력받기 위해서는 아래와 같이 Form 모듈 임포트가 필요하다.from fastapi import Form 데이터 전달받기Form 데이터는 요청 본문을 받는 것과 동일하게 함수의 매개변수로 전달받으면 된다. 다만 데이터 ..

Python 2025.05.23

[Python] HTTPX - 비동기 프로그래밍

개요이 블로그에서 HTTPX 라이브러리 사용법에 대해 몇 가지 글을 작성했는데, 전부 동기 방식으로 프로그래밍한 내용으로 작성했다.하지만! HTTPX는 비동기 프로그래밍도 지원하고 있다. 이번 글에서는 HTTPX를 사용해 비동기 방식으로 HTTP 요청을 보내는 방법을 작성해보려고 한다. 요청비동기 방식으로 요청을 보낼 때에는 비동기 클라이언트(AsyncClient)를 사용해야 한다. 참고로 최상위 API(httpx.get, httpx.post 등)의 경우에는 비동기 방식을 지원하지 않는 것 같다.비동기 방식이기 때문에 요청 시 await을 사용해야 한다는 것을 제외하면 동기 방식으로 프로그래밍하는 것과 큰 차이가 없다.import httpximport asyncioasync def request():..

Python 2025.05.22