- DB Lock을 처음 경험한 날31514나의 업무 중에 특정 CSV 파일을 읽어, 데이터를 파싱하고 테이블에 풀리프레쉬 방식으로 삽입하는 작업이 있다.백엔드 개발자의 요청으로 해당 스크립트를 실행했는데, 데드락에 걸리는 상황이 발생했다. 일단 원인은 나의 스크립트 안에 테이블을 삭제하고 다시 생성하는 코드가 포함되어 있는데, 이 타이밍에 백엔드 개발자가 데이터를 조회했기 때문에 락(Lock)이 발생했다. 위 이미지는 `t_pole_image`라는 테이블에 `AccessExclusiveLock`이 걸린 모습이다.`AccessExclusiveLock`은 가장 강력한 테이블 락(Lock)으로, 해당 테이블의 모든 작업을 차단한다.빨간색 박스 안에 있는 두 줄을 살펴보면, 하나의 세션에서는 `AccessExclusiveLock`을 획득(`grante..
- 2025-03-18 12:02:58(41일 전)
- LATERAL JOIN에 대해 알아보자.31514LATERAL JOIN은 SQL에서 제공하는 강력한 쿼리 기능으로, 일반적인 JOIN과는 다르게 작동한다.LATERAL JOIN의 특징은 오른쪽 테이블이 왼쪽 테이블의 각 행을 참조할 수 있다는 점이다.파이썬 코드로 표현하면 다음과 같다.for row1 in 왼쪽_테이블: for row2 in 오른쪽_테이블: # 작업 SQL 쿼리문은 다음과 같이 작성되는데, 일반 JOIN문과 달리 ON 조건이 없는 것을 확인할 수 있다.-- 왼쪽 테이블 당 매칭되는 오른쪽 테이블의 행을 3개씩만 가져오고 싶은 경우SELECT *FROM 왼쪽 테이블 leftCROSS JOIN LATERAL ( SELECT * FROM 오른쪽 테이블 WHERE 특정 조건 LIMIT 3) right; ..
- 2025-03-17 17:56:28(42일 전)
- SQLAlchemy와 psycopg2 중 어느 것을 사용할까?31514Pandas 데이터프레임을 Postgres 테이블에 적재하는 작업을 하면서 고민했던 내용에 대해 정리한 글이다.데이터프레임을 Postgres 테이블에 적재하는 방법에는 여러 가지가 있지만, 그 중에서도 SQLAlchemy 라이브러리와 psycopg2 드라이버를 비교하려고 한다. SQLAlchemySQLAlchemy는 ORM이자 DB API 역할을 하는 라이브러리이며, `create_engine()`을 사용하여 데이터베이스 연결을 관리한다.Connection Pool을 관리하여 재사용 가능한 DB 연결을 제공하고, `pandas.to_sql()`을 사용하여 데이터프레임을 테이블에 쉽게 적재할 수 있다.하지만 ORM이기 때문에 직접 SQL을 실행하는 psycopg2보다 다소 느릴 수 있다. psycopg2..
- 2025-03-06 14:45:37(53일 전)
- Pandas의 벡터 연산31514최근에 회사에서 ETL 작업을 수행하면서, DB에 있는 테이블을 불러와 변환 작업을 한 뒤 새로운 테이블에 적재하는 일을 진행했다.변환 작업은 Pandas를 사용했고, 이 과정에서 성능 향상을 고민하면서 알게된 벡터 연산에 대해 정리하려고 한다. 데이터프레임을 다룰 때 여러 가지 방법이 존재한다.`for문`, `iterrows()` 메서드, `apply()` 메서드와 같이 레코드를 하나씩 다루는 방법과 벡터와 같이 모든 레코드를 한 번에 다루는 방법이 있다.당연하게도 처리 속도 측면에서 벡터 연산이 우월하며, `for문`, `iterrows()`, `apply()` 중에서는 `apply()`가 가장 빠르다. 레코드를 하나씩 다루는 방법을 스칼라라고 하는데, 다음과 같은 특징을 가지고 있다.`for문` :..
- 2025-03-06 14:32:55(53일 전)
- Chunk를 사용하여 대용량 파일 전송하기31514회사에 A 서버의 내부망에서 돌아가는 Postgres 서버가 있다.우리에게 필요한 데이터는 매일 A 서번에 적재된다.하지만 웹 개발은 B 서버의 Postgres를 통해 진행된다. 따라서 웹 개발팀에서 최신 데이터를 사용하기 위해서 매일 A 서버로부터 데이터를 B 서버로 옮겨야한다.이를 해결하기 위해 Airflow와 Chunk를 사용하여 매일 새벽 3시에 두 서버의 Postgres를 동기화했다. Chunkchunk가 무엇일까?chunk는 데이터를 일정한 크기로 나눈 조각을 말한다.한 번에 전체 파일을 메모리에 올리지 않고, 작은 단위로 읽고 쓰거나 네트워크를 통해 전송하여 메모리 사용량을 줄인다. postgres의 특정 데이터베이스를 DUMP 하면 그 파일의 용량이 만만치 않다.이를 효율적으로 옮기기 위해..
- 2025-01-17 17:33:11(101일 전)
- Synology Active Backup for Business 사용법 (Windows)31514Synology Active Backup for Business는 Synology NAS에서 제공하는 백업 솔루션으로, 기업 환경에서 데이터 보호와 복구를 위해 설계된 강력한 도구를 말한다.사내에서 Synology NAS를 사용하고 있어서, 백업 솔루션으로 선택하게 되었다. 1. 설치2. 활성화 및 기본 설정3. 연결 대상 선택나의 경우 Windows PC에 있는 여러 파일들을 증분 백업하기 위해 PC/Mac > Windows를 선택했다. 4. Agent 프로그램 Windows PC에 설치 및 설정만약 NAS IP 주소를 입력하고 연결을 시도할 때 다음과 같은 오류가 발생하면, 이 링크를 참고하여 해결하면 된다.인터넷 오류입니다. 인터넷 연결을 확인하십시오.문제가 계속 발생하면 관리자에게 문의하여 서버의..
- 2025-01-06 15:13:22(112일 전)
- postgres 마이그레이션31514얼마 전 회사에서 A 서버의 Docker 위에서 돌아가는 postgres를 B 서버로 마이그레이션하는 작업을 맡았다. 일단 덤프 파일을 만들기 위해 A 서버에서 다음과 같은 명령어를 실행해준다.docker exec -i pg_dumpall -U > .sql `pg_dumpall` 명령어는 postgres에 존재하는 모든 데이터베이스에 대한 덤프 파일을 만들 수 있는데, 만약 일부 데이터베이스의 덤프 파일이 필요하면 `pg_dump` 명령어를 사용하면 된다. 다음으로 A 서버의 덤프 파일을 B 서버로 옮겨줘야 하는데, 나는 Termius라는 멀티 SSH 플랫폼을 사용하여 쉽게 옮겼다. 이제 A 서버에서 사용하던 postgres docker-compose.yml 파일의 내용을 가져와서, B 서버에서 실행..
- 2024-12-31 14:28:19(118일 전)
- Airflow 뜯어보기(2)31514# airflow\\configuration.pydef getboolean(self, section: str, key: str, **kwargs) -> bool: # type: ignore[override] val = str(self.get(section, key, _extra_stacklevel=1, **kwargs)).lower().strip() if "#" in val: val = val.split("#")[0].strip() if val in ("t", "true", "1"): return True elif val in ("f", "false", "0"): return False else: raise AirflowCon..
- 2024-12-17 10:34:25(132일 전)
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)