주말에도.. 하얗게 불태웠다..
이제 진짜진짜 본격적으로 작업하기에 앞서,
이전에 진행했던 피버타임 기능을 활성화해보고자 하는데...
바로 가시죠, 렠흐고.
Chat - Fever-time 채팅방 기능 구현 (Supabase 스케쥴링 적용)
나의 SQL.. 다시 언-록! (ft. 캐릭캐릭체인지)
[이전 포스팅 참고]
Supabase - Scheduling 기능, Next.js에서 활용 가능한지에 대한 테스트 진행
1. 테스트용 SQL 작성
테스트를 위해 스케줄을 2시/6시에서 1분 간격으로 설정하는 SQL은 아래와 같다.
-- 1. 스케쥴링 함수 생성 (수정 없음)
CREATE OR REPLACE FUNCTION calculate_fever_rooms()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
-- 기존 피버타임 레코드 삭제
DELETE FROM fever_time_rooms
WHERE created_at::date = CURRENT_DATE;
-- 가장 많이 메시지가 등록된 상위 5개의 채팅방 추출
INSERT INTO fever_time_rooms (room_id, chat_per_hour, created_at)
SELECT
room_id,
COUNT(*) AS chat_per_hour,
now() AS created_at
FROM messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 집계
GROUP BY room_id
ORDER BY chat_per_hour DESC
LIMIT 5;
END;
$$;
-- 2. 테스트 스케쥴링 (1분 간격으로 실행)
SELECT cron.schedule(
'test_fever_time_task', -- 테스트 작업명
'* * * * *', -- 매 1분마다 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출 (SELECT 사용)
);
✅ 주요 변경사항
- 스케줄 표현식 변경: '0 14,18 * * ' → ' * * * *' (1분마다 실행).
- 작업명 변경: 'fever_time_task' → 'test_fever_time_task' (기존 작업과 이름이 겹치지 않도록 구분).
2. 이 바보야!! 스키마 변경된거 참고해야지!!
아.. 그러고보니까 생각난게 해당 SQL은 과거 테스트용 작업 때 했던 내용이라..
현재 이렇-게 달라진 스키마에는 적용이 안된다!!!!! (이런 바보!!)
그렇게 변경된 SQL..
CREATE OR REPLACE FUNCTION calculate_fever_rooms()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
-- 기존 피버타임 레코드 삭제
DELETE FROM chat_fevertime_rooms
WHERE created_at::date = CURRENT_DATE;
-- 최근 3시간 동안 메시지가 가장 많이 등록된 상위 5개 채팅방 추출
INSERT INTO chat_fevertime_rooms (id, room_id, chat_per_hour, created_at)
SELECT
gen_random_uuid() AS id, -- UUID 생성
room_id,
COUNT(*)::text AS chat_per_hour, -- 메시지 수를 텍스트로 변환
now() AS created_at
FROM messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 데이터
GROUP BY room_id
ORDER BY COUNT(*) DESC
LIMIT 5;
END;
$$;
-- 테스트용 스케줄링 (1분 간격)
SELECT cron.schedule(
'test_fever_time_task', -- 테스트 작업명
'* * * * *', -- 매 1분마다 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출 (SELECT 사용)
);
✅ 주요 변경사항
- 테이블 이름 변경 ( fever_time_rooms → chat_fevertime_rooms )
- id 칼럼 추가: gen_random_uuid()를 사용하여 UUID를 생성.
- chat_per_hour 데이터 타입 변경: COUNT(*) 값을 ::text로 변환하여 chat_per_hour와 호환.
- 스케줄링 설정: 매 1분마다 실행 (* * * * *).
3. 결과물을 확인했는데.. 으잉?
아래의 SQL을 활용하여 테이블의 결과를 확인했는데..
- 피버타임 테이블 결과 확인
SELECT * FROM chat_fevertime_rooms
ORDER BY created_at DESC;
아니 이게 왠걸; 이런 오류가 뜨고 말았다..!
ERROR: 42P01: relation "messages" does not exist
QUERY: INSERT INTO chat_fevertime_rooms (id, room_id, chat_per_hour, created_at)
SELECT
gen_random_uuid() AS id, -- UUID 생성
room_id,
COUNT(*)::text AS chat_per_hour, -- 메시지 수를 텍스트로 변환
now() AS created_at
FROM messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 데이터
GROUP BY room_id
ORDER BY COUNT(*) DESC
LIMIT 5
CONTEXT: PL/pgSQL function calculate_fever_rooms() line 8 at SQL statement
간단하게.. 해석하자면 message라는 친구가 없다는 건데…
그렇다… 진짜로 messages가 없고 chat_messages가 있는 것이었다!
4. 스키마를 참고하여 다시 만든 SQL..
따라서 해당 내용을 다시 집어넣은.. 새로운 SQL를 넣어주기로 하는데..
CREATE OR REPLACE FUNCTION calculate_fever_rooms()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
-- 기존 피버타임 레코드 삭제
DELETE FROM chat_fevertime_rooms
WHERE created_at::date = CURRENT_DATE;
-- 가장 많이 메시지가 등록된 상위 5개의 채팅방 추출
INSERT INTO chat_fevertime_rooms (id, room_id, chat_per_hour, created_at)
SELECT
gen_random_uuid() AS id, -- UUID 생성
room_id,
COUNT(*)::text AS chat_per_hour, -- 메시지 수를 텍스트로 변환
now() AS created_at
FROM chat_messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 데이터
GROUP BY room_id
ORDER BY COUNT(*) DESC
LIMIT 5;
END;
$$;
-- 2. 테스트 스케쥴링 (1분 간격으로 실행)
SELECT cron.schedule(
'test_fever_time_task', -- 테스트 작업명
'* * * * *', -- 매 1분마다 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출 (SELECT 사용)
);
✅ 주요 변경사항
- 테이블 이름 수정: messages → chat_messages / fever_time_rooms → chat_fevertime_rooms
- 칼럼 수정: chat_per_hour: COUNT(*)::text로 수정 / id: UUID 자동 생성 추가 (gen_random_uuid())
- 스키마 일치: room_id 및 created_at 컬럼 명칭과 데이터 타입을 새로운 스키마에 맞게 수정
5. 세부 사항 수정
생각해보니 chat_per_hour 에는 3시간 데이터가 집계되는 형식이라..ㅎ
(반올림을안해주면.. 어.. 소숫점이 나올 수도 있으므로 반올림기능까지 추가해줬다.)
CREATE OR REPLACE FUNCTION calculate_fever_rooms()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
-- 기존 피버타임 레코드 삭제
DELETE FROM chat_fevertime_rooms
WHERE created_at::date = CURRENT_DATE;
-- 가장 많이 메시지가 등록된 상위 5개의 채팅방 추출 (시간당 메시지 계산 및 반올림)
INSERT INTO chat_fevertime_rooms (id, room_id, chat_per_hour, created_at)
SELECT
gen_random_uuid() AS id, -- UUID 생성
room_id,
ROUND(COUNT(*) / 3.0)::text AS chat_per_hour, -- 시간당 평균 메시지 반올림
now() AS created_at
FROM chat_messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 데이터
GROUP BY room_id
ORDER BY COUNT(*) DESC
LIMIT 5;
END;
$$;
-- 2. 테스트 스케쥴링 (1분 간격으로 실행)
SELECT cron.schedule(
'test_fever_time_task', -- 테스트 작업명
'* * * * *', -- 매 1분마다 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출 (SELECT 사용)
);
✅ 주요 변경사항
- 시간당 메시지 계산 및 소숫점 반올림 추가ROUND(COUNT(*) / 3.0)을 사용 → 시간당 평균 메시지 수 반올림결과, ::text로 변환 → chat_per_hour에 저장
- (소숫점 첫째 자리 기준)
- COUNT(*) / 3.0을 사용 → 최근 3시간 동안의 메시지 수/3, 시간당 메시지 수 계산
- 테이블 이름 및 칼럼 명칭 유지:결과, chat_fevertime_rooms 테이블에 저장
- chat_messages에서 room_id와 created_at을 기준으로 집계
6. 결과물 및 관련 SQL 코드
최종적으로 정리된 코드는 아래와 같다.
- 피버타임 SQL (테스트용)
CREATE OR REPLACE FUNCTION calculate_fever_rooms()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
-- 기존 피버타임 레코드 삭제
DELETE FROM chat_fevertime_rooms
WHERE created_at::date = CURRENT_DATE;
-- 가장 많이 메시지가 등록된 상위 5개의 채팅방 추출 (시간당 메시지 계산 및 반올림)
INSERT INTO chat_fevertime_rooms (id, room_id, chat_per_hour, created_at)
SELECT
gen_random_uuid() AS id, -- UUID 생성
room_id,
ROUND(COUNT(*) / 3.0)::text AS chat_per_hour, -- 시간당 평균 메시지 반올림
now() AS created_at
FROM chat_messages
WHERE created_at >= now() - interval '3 hours' -- 최근 3시간 데이터
GROUP BY room_id
ORDER BY COUNT(*) DESC
LIMIT 5;
END;
$$;
-- 2. 테스트 스케쥴링 (1분 간격으로 실행)
SELECT cron.schedule(
'test_fever_time_task', -- 테스트 작업명
'* * * * *', -- 매 1분마다 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출 (SELECT 사용)
);
- 결과 보여주는 SQL
-- 함수 실행
SELECT calculate_fever_rooms();
-- 결과 확인
SELECT * FROM chat_fevertime_rooms
ORDER BY created_at DESC;
숫자로 변경해주긔 ^-^)b → 숙제!
- 1분 → 14시, 16시 간격 스케쥴링 실행 SQL
-- 테스트 스케줄 삭제
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM cron.job WHERE jobname = 'test_fever_time_task') THEN
PERFORM cron.unschedule('test_fever_time_task');
END IF;
END $$;
-- 원래 스케줄 복원 (매일 오후 2시, 6시 실행)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM cron.job WHERE jobname = 'fever_time_task') THEN
PERFORM cron.schedule(
'fever_time_task', -- 원래 작업명
'0 14,18 * * *', -- 매일 오후 2시, 6시 실행
$$ SELECT calculate_fever_rooms() $$ -- 함수 호출
);
END IF;
END $$;
-- chat_fevertime_rooms 초기화
DELETE FROM chat_fevertime_rooms
WHERE created_at::date = CURRENT_DATE;
-- chat_messages 테스트 데이터 삭제 (필요 시)
DELETE FROM chat_messages
WHERE created_at >= CURRENT_DATE;
마무리 - 변경사항이.. 너무 많아요오...
디자인 하다가 개발자로 넘어가니.. 왜 맨날 '안된다'라고 하는지에 대해 알아가고 있는 중이다.
디자인 작업에선 정말 하나 바꾸는건데
개발쪽으로 넘어가면... 아예 구조부터 뜯어고쳐야하는 상황이 빈번하기 때문. (엉엉엉)
양쪽에 입장이 다르다는 것을 인지하면서 소통과 협업하는 것이 중요하다는 것을 많이 느끼고 있다..
언능 디자인이 픽스되길 바라며.. D- end.
오늘의 KPT 회고
Keep: 디자인과 개발자적인 역량까지 생긴 림졍.
Problem: 수정.. 제발 멈춰..
Try: 디자인은 오케이, 근데 기능은 갈아엎지..ㅁr...
'React TIL' 카테고리의 다른 글
[React] Day_81 최종 프로젝트 기능 구현 내용정리 (0) | 2025.01.14 |
---|---|
[React] Day_79 최종 프로젝트 관련 내용 정리 (0) | 2025.01.10 |
[React] Day_78 최종 프로젝트 관련 내용정리 (1) | 2025.01.09 |
[React] Day_77 최종 프로젝트 관련 내용정리 (0) | 2025.01.08 |
[React] Day_76 최종 프로젝트 관련 내용정리 (0) | 2025.01.07 |