본문 바로가기
IT/SQL

[PostgreSQL] pg_cron 익스텐션 환경설정

by 저당단 2025. 12. 15.

 

SSO 서비스를 만들면서 리프레시 토큰을 Redis가 아닌 PostgreSQL에 저장하기로 결정했었다.

  • 토큰 rotation(교체)
  • 최대 기기가 3개라면 가장 오래된 세션 제거

위의 요구사항들을 위해선 조건 기반 조회가 필요한데, Redis보다 RDBMS가 해당 작업을 수행하는 데 더 적절하기 때문이었다.

 

하지만 기간이 만료되거나 로그아웃으로 인해 회수된 리프레시 토큰들은 Redis와는 달리 자동으로 로우가 삭제되지 않는다.

그래서 특정 시간에 로우들을 지워줄 스케줄러가 필요한 상황이었고 SSO 서비스보다는 DB 레벨에서 처리해주는 게 더 안정적이라고 생각했다.

 

스케줄러 대신 트리거를 쓰자는 의견도 나왔지만 DB에 부하가 일어날 수 있고, 리프레시 토큰 삭제 작업은 정기적으로 실행되는 것이 더 알맞다고 판단하여 스케줄러를 만들기로 했다.

PostgreSQL에서는 pg_cron이라는 익스텐션을 지원하여 설치만 해주면 사용할 수 있다.

 

1. pg_cron 설치

apt install -y postgresql-16-cron
find /usr/lib/postgresql -name "pg_cron.so"

현재 PostgreSQL 버전과 일치하는 버전으로 설치해야 한다.

아래 명령어는 잘 설치되었는지 확인하는 명령어이다.

 

2. postgres.conf 설정

shared_preload_libraries = 'pg_cron'
cron.database_name = 'SSO'               # 스케줄러가 어떤 DB에 기본 연결할지
cron.host = '/var/run/postgresql'        # host가 아닌 local로 접속하도록 함
cron.timezone = 'Asia/Seoul'
cron.use_background_workers = on    # 내부 백그라운드 워커 방식으로 실행, on 권장

shared_preload_libraries에서 다른 확장이 이미 있다면?

'pg_cron,pg_stat_statements' 이런 식으로 쉼표로 같이 나열해야 한다.

 

3. pg_hba.conf 설정

local   all             postgres        md5
local   all             all             trust

postgres 계정은 보안을 위해 패스워드를 입력하도록 md5로 둔다.

cron은 postgres.conf에서 설정했듯이 local로 접속하도록 설정했으므로 인증을 우회하기 위해 trust로 둔다.

cron은 패스워드를 입력하지 못하기 때문이다.

만약 postgres 이외 계정을 모두 trust로 열어놓는 게 찜찜하다면 cron용 계정(ex: cron_user)을 따로 만들어도 된다.

 

4. 익스텐션 설치

\c SSO    -- SSO DB에 접속
CREATE EXTENSION pg_cron;

postgres.conf에서 설정한 DB로 접속하여 익스텐션을 설치한다.

 

5. 크론잡 등록

SELECT cron.schedule(
  'job_name',
  '* * * * *',
  $$ SELECT now() $$
);

 

6. 등록한 잡 확인

SELECT * FROM cron.job;               -- 등록된 잡 목록 확인 (jobid 확인 가능)
SELECT * FROM cron.job_run_details;    -- 실행 기록 (succeeded 뜨면 성공)
SELECT cron.unschedule(1);            -- jobid를 통해 등록된 job 삭제

 

 

 


초기 세팅 방법이 조금 복잡할 수 있지만 직관적이라서 한번 세팅하면 쉽게 사용할 수 있고,

DB 레벨에서 돌아가는 스케줄러라 안정적이라는 것이 큰 장점인 것 같다.

한번 해봤는데 또 까먹어서 정리해 놓음.

'IT > SQL' 카테고리의 다른 글

[mySQL] 종합적인 쿼리 예제 풀어보기 (JOIN, GROUP BY 등)  (5) 2024.11.06
[SQL] NULL 다루기  (1) 2024.10.31
[SQL] JOIN 문법  (3) 2024.10.02
[SQL] 시간 비교 - timestampdiff  (0) 2024.04.17