📘 Mori 프로젝트 - 2025년 7월 2일 전체 개발 로그
작성일: 2025-07-02
✅ 전체 작업 요약
- 감정 분석 로직 개선 및 GPT 프롬프트 구조화
- 요약 결과에서 감정, 피드백 구분 정확도 향상
summaries
테이블 생성 및 Supabase 연동 완료- 저장 기능 완성 (
saveSummary
적용) - 유저 자동 등록 문제 트러블슈팅 및 트리거 수동 생성
- 전체 저장 워크플로우 검증 및 실사용 테스트 완료
🔍 감정 분석 및 피드백 프롬프트 수정
문제 상황
초기에는 GPT 응답에서 요약
, 피드백
, 감정
파트가 혼재되어 정확한 구분이 어려웠음.
개선 방식
프롬프트를 명확히 구조화:
다음 일기를 세 가지로 나눠 요약해줘:
1. 📘 요약:
2. 💬 피드백:
3. ❤️ 감정:
개선 결과
- 프론트엔드에서
.match()
로 각 항목을 정교하게 추출 가능 - UI에서 안정적으로 섹션별 출력
💾 Supabase summaries 테이블 설계 및 저장 구현
테이블 생성
create table summaries (
id uuid primary key default uuid_generate_v4(),
user_id uuid references auth.users(id),
date date not null,
content text,
summary text,
feedback text,
emotion text,
created_at timestamp with time zone default now()
);
RLS 정책 설정
CREATE POLICY "Allow individual access"
ON summaries
FOR ALL
USING (user_id = auth.uid())
WITH CHECK (user_id = auth.uid());
저장 로직 (Summary.jsx
)
await saveSummary({
user_id: user.id,
date: new Date().toISOString().slice(0, 10),
content: input,
summary: extractSection(result, "📘 요약:"),
feedback: extractSection(result, "💬 피드백:"),
emotion: extractSection(result, "❤️ 감정:")
});
🧩 user_profiles 트리거 자동 생성 문제
문제
- 구글 로그인 후
auth.users
에는 저장되지만user_profiles
에 자동 삽입되지 않음 - RLS 정책 때문에
user_profiles
에 등록되지 않으면summaries
저장 실패
해결 방법
트리거 함수 수동 생성
create or replace function public.handle_new_user()
returns trigger as $$
begin
insert into public.user_profiles (user_id, email)
values (new.id, new.email);
return new;
end;
$$ language plpgsql;
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
테스트 및 검증
- 시크릿 모드로 새 계정 로그인
user_profiles
자동 삽입 확인됨- 트리거 정상 작동 확인
🧪 테스트 시나리오 결과
- ✅ 기존 계정:
요약 → 저장
까지 정상 작동 - ❌ 신규 계정: 트리거 미작동 시 저장 실패
- ✅ 트리거 활성화 후 신규 계정 자동 등록 및 저장 성공
🗂️ 기타 작업 정리
/lib/useAuth.js
: 로그인 세션 추적, 전역 상태 반영/lib/ensureUserProfile
: 구글 로그인된 사용자가 Supabase에 존재하는지 확인하고, 없다면 user_profiles 테이블에 추가 -> 현재는 트리거 수정으로 필요하지 않으나 추후 수정 후 제거 예정/lib/summaryApi.js
: Supabase 저장 함수 구현/pages/Summary.jsx
: UI 반영, 저장 동작 연결- 테스트용 문구 입력으로 요약/감정/피드백 추출 확인
useAuth.js
// Supabase 로그인 상태 훅
import { useEffect, useState } from "react";
import { supabase } from "./supabase";
export function useAuth() {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// 현재 세션 확인
const getSession = async () => {
const { data, error } = await supabase.auth.getSession();
setUser(data.session?.user || null);
setLoading(false);
};
getSession();
// 로그인 상태 변화 감지
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((_event, session) => {
setUser(session?.user || null);
});
// 클린업 함수
return () => subscription.unsubscribe();
}, []);
return { user, loading };
}
summaryAPI.js
// 📍 src/lib/summaryApi.js
import { supabase } from "./supabase";
/**
* 요약 결과 저장
*/
export async function saveSummary({
user_id,
date,
content,
summary,
feedback,
emotion,
}) {
const { data, error } = await supabase.from("summaries").insert([
{
user_id,
date,
content,
summary,
feedback,
emotion,
},
]);
if (error) {
console.error("❌ Supabase 저장 오류:", error.message);
throw error;
}
return data;
}
⚠️ 트러블슈팅 요약
문제 | 원인 | 해결 방법 |
---|---|---|
summaries 저장 오류 | user_profiles에 유저 없음 | 트리거 수동 생성 or 수동 insert |
자동 삽입 안됨 | 함수/테이블명 오류, email 누락 | SQL로 함수 및 트리거 재정의 |
RLS에 막힘 | user_id 없거나 권한 없음 | 정책 점검 및 uid 일치 보장 |
✅ 오늘 완료된 주요 작업
- GPT 프롬프트 개선 및 감정 피드백 구조화
- 감정, 요약, 피드백 구분된 출력 구현
- Supabase 저장 기능 구축 완료
- 트리거 구성으로 유저 자동 등록 처리
- 테스트 통해 신규 계정 정상 저장까지 확인
구동 화면
📌 내일 예정 작업 (2025-07-03)
- 📅 감정 일기 캘린더 구조 설계 및 연동 준비
'사이드프로젝트' 카테고리의 다른 글
[Mori] 7일차 (0) | 2025.07.04 |
---|---|
[Mori] 6일차 (0) | 2025.07.03 |
[Mori] 4일차 (0) | 2025.07.01 |
[Mori] 3일차 (0) | 2025.06.27 |
[Mori] 2일차 (0) | 2025.06.26 |