import { createClient } from '@supabase/supabase-js'; import { getSupabaseUrl, getSupabaseKey } from './config'; const supabaseUrl = getSupabaseUrl(); const supabaseAnonKey = getSupabaseKey(); // 유효한 URL이 설정되었는지 확인 const isValidUrl = supabaseUrl && supabaseAnonKey && !supabaseUrl.includes('your-onpremise-supabase-url') && !supabaseAnonKey.includes('your-onpremise-anon-key'); let supabaseClient; try { console.log(`Supabase 클라이언트 생성 시도: ${supabaseUrl}`); // Supabase 클라이언트 생성 supabaseClient = createClient(supabaseUrl, supabaseAnonKey, { auth: { autoRefreshToken: true, persistSession: true, // 온프레미스 설치를 위한 추가 설정 flowType: 'implicit', }, global: { // 커스텀 fetch 구현 fetch: (...args) => { // 첫 번째 인자는 URL 또는 Request 객체 const urlOrRequest = args[0]; // URL 로깅 및 디버깅 let url = typeof urlOrRequest === 'string' ? urlOrRequest : urlOrRequest.url; console.log('Supabase fetch 요청:', url); // 기본 fetch 호출 return fetch(urlOrRequest, args[1]) .then(response => { console.log('Supabase 응답 상태:', response.status); return response; }) .catch(err => { console.error('Supabase fetch 오류:', err); throw err; }); } } }); // CORS 문제 확인을 위한 기본 헤더 테스트 (async () => { try { // 기본 서버 상태 확인 (CORS 테스트) console.log('Supabase 서버 상태 확인 중...'); const response = await fetch(`${supabaseUrl}/rest/v1/`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'apikey': supabaseAnonKey, }, }); if (response.ok) { console.log('Supabase REST API 연결 성공:', response.status); } else { console.warn('Supabase REST API 연결 실패:', response.status, response.statusText); // 응답 세부 정보 로깅 try { const errorText = await response.text(); console.warn('Supabase REST API 오류 응답:', errorText); } catch (e) { console.error('응답 내용 읽기 실패:', e); } } } catch (err) { console.error('Supabase 서버 상태 확인 중 오류 (CORS 문제 가능성):', err); } })(); // Supabase 연결 테스트 (async () => { try { console.log('Supabase 인증 테스트 시도 중...'); const { data, error } = await supabaseClient.auth.getSession(); if (error) { console.warn('Supabase 연결 테스트 실패:', error.message); } else { console.log('Supabase 연결 성공!', data); } // 추가 테스트: 공개 데이터 조회 시도 try { console.log('Supabase 데이터베이스 공개 테이블 조회 시도...'); const { data: tableData, error: tableError } = await supabaseClient .from('transactions') .select('*') .limit(1); if (tableError) { console.warn('Supabase 데이터베이스 테스트 실패:', tableError.message); } else { console.log('Supabase 데이터베이스 테스트 성공:', tableData); } } catch (dbErr) { console.error('Supabase 데이터베이스 테스트 중 예외 발생:', dbErr); } } catch (err) { console.error('Supabase 연결 확인 중 오류:', err); } })(); // Supabase 연결 로그 console.log('Supabase 클라이언트가 생성되었습니다.'); // 유효성 검사 로그 if (!isValidUrl) { console.warn('경고: 기본 Supabase URL 또는 Anon Key가 감지되었습니다. Supabase 설정 페이지에서 온프레미스 설정을 구성하세요.'); } } catch (error) { console.error('Supabase 클라이언트 생성 오류:', error); // 더미 클라이언트 생성 (앱이 완전히 실패하지 않도록) supabaseClient = { auth: { getUser: () => Promise.resolve({ data: { user: null } }), getSession: () => Promise.resolve({ data: { session: null } }), signInWithPassword: () => Promise.reject(new Error('Supabase 설정이 필요합니다')), signUp: () => Promise.reject(new Error('Supabase 설정이 필요합니다')), signOut: () => Promise.resolve({ error: null }), onAuthStateChange: () => ({ data: { subscription: { unsubscribe: () => {} } } }), }, from: () => ({ select: () => ({ eq: () => ({ data: null, error: new Error('Supabase 설정이 필요합니다') }) }), insert: () => ({ error: new Error('Supabase 설정이 필요합니다') }), delete: () => ({ eq: () => ({ error: new Error('Supabase 설정이 필요합니다') }) }), }), }; } export const supabase = supabaseClient; export { isValidUrl };