2025-07-02 18:56:54

📘 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 저장 기능 구축 완료
  • 트리거 구성으로 유저 자동 등록 처리
  • 테스트 통해 신규 계정 정상 저장까지 확인

구동 화면

일기 작성 하고 요약하는 화면
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