7. 관심매장 만들기
2025. 3. 13. 15:39ㆍ현 프로젝트 시작단계
728x90
느낀점
생각보다 관심매장 만들기가 생각이 안나서 일단 하던 작업을 멈추고
누워서 생각을 하다가 자다가 일어나니까 드디어
어떤 로직을 만들어야 될지 이해했다
일단 supabase에서 데이터베이스를 어떤걸 만들어야될지 고민을 했는데
방법은 두가지 인거같다.
일단 서버에서 불러올때 필터링 되어서 불러 올것인가
두번째 서버에서 전부디 불러와서 필터링 될것인가였는데
두번째 방법을 쓰게된다면
남의 테이블 정보까지 불러올 수도 있겠다 생각했습니다.
쉽게 설명하면
어떤 방식을 쓸것인가
서버에서 필터링하는 방식
- 설명:
사용자가 로그인한 상태에서 해당 사용자의 정보(예: user_id)를 기준으로 데이터베이스 쿼리를 보낼 때, 서버는 로그인한 사용자에게 관련된 데이터만 반환합니다. 예를 들어, SELECT * FROM favorites WHERE user_id = 현재사용자ID와 같이 쿼리하면, 그 사용자에게 해당하는 데이터만 불러오게 됩니다. - 장점:
- 보안: 다른 사용자의 데이터가 노출될 위험이 없어요.
- 성능: 불필요한 데이터를 전송하지 않으므로 네트워크 부하가 줄어들고, 클라이언트에서의 추가 필터링 작업도 필요 없어요.
- 유지보수: 데이터베이스 쿼리만 수정하면 되므로 관리가 용이해요.
대충 흐름
하트 누를시
I/flutter ( 5722): ✅ 관심 매장 등록 성공: storeId = 2
I/flutter ( 5722): 관심 매장으로 등록되었습니다.
제거시
I/flutter ( 5722): 🗑 삭제 요청: user_id = 유저 uuid , store_id = 2
I/flutter ( 5722): 🔍 DELETE Response: null
I/flutter ( 5722): ❌ 삭제 실패: 응답이 없음
- 현재 로그인한 사용자 확인
- Supabase의 auth.currentUser를 사용해 현재 로그인한 사용자의 userId 가져오기.
- 만약 null이면 로그인하라고 안내.
- 현재 매장이 관심 등록된 상태인지 확인
- favorites 테이블에서 user_id == 로그인한 사용자 ID && store_id == 클릭한 매장 ID인 데이터가 존재하는지 조회.
- 등록 / 해제 (토글) 처리
- 등록되어 있으면 DELETE 실행.
- 등록되지 않았으면 INSERT 실행.
- UI 업데이트 (setState 또는 상태관리 사용)
- 관심 등록 여부를 반영하여 하트 아이콘을 변경.
코드
백엔드 코드 ( 관심매장을 눌렀을때 추가 , 한번 더 눌러서 삭제하기를 눌렀을떄 )
import 'package:supabase_flutter/supabase_flutter.dart';
class FavoriteService {
final SupabaseClient _supabase = Supabase.instance.client;
// 관심 등록 여부 확인
Future<bool> isFavoriteStore(String userId, int storeId) async {
try {
final response = await _supabase
.from('favorites')
.select('id')
.eq('user_id', userId)
.eq('store_id', storeId);
return response.isNotEmpty; // 결과가 있으면 true, 없으면 false
} catch (e) {
print('❌ 관심 등록 여부 확인 실패: $e');
return false; // 오류 발생 시 기본값 false 반환
}
}
// 관심 매장 등록
Future<bool> addFavorite(String userId, int storeId) async {
try {
await _supabase.from('favorites').insert({
'user_id': userId,
'store_id': storeId,
'created_at': DateTime.now().toIso8601String(),
});
print('✅ 관심 매장 등록 성공: storeId = $storeId');
return true;
} catch (e) {
print('❌ 관심 매장 등록 실패: $e');
return false;
}
}
// 관심 매장 해제
Future<bool> removeFavorite(String userId, int storeId) async {
try {
await _supabase
.from('favorites')
.delete()
.eq('user_id', userId)
.eq('store_id', storeId);
print('✅ 관심 매장 삭제 성공: storeId = $storeId');
return true;
} catch (e) {
print('❌ 관심 매장 삭제 실패: $e');
return false;
}
}
}
supabase 정책 추가
1️⃣ 관심 매장 읽기 (자신의 데이터만 조회 가능)
CREATE POLICY "Allow users to read their own favorites"
ON favorites
FOR SELECT
USING (auth.uid() = user_id);
2️⃣ 관심 매장 추가 (로그인한 유저만 가능)
CREATE POLICY "Allow users to insert their own favorites"
ON favorites
FOR INSERT
WITH CHECK (auth.uid() = user_id);
3️⃣ 관심 매장 삭제 (본인의 데이터만 삭제 가능)
CREATE POLICY "Allow users to delete their own favorites"
ON favorites
FOR DELETE
USING (auth.uid() = user_id);
결과
위의 하트버튼을 누르면
데이터베이스에 정보 저장
삭제시 정보 없어짐
728x90
'현 프로젝트 시작단계' 카테고리의 다른 글
9. 스프링 테스트 / 진행사항 (0) | 2025.03.15 |
---|---|
8. 탈퇴하기 로직 / 네이버 지도 길찾기 제작 (0) | 2025.03.14 |
6. 백엔드 마커시스템 문제점 (0) | 2025.03.11 |
5. jira 도입 (0) | 2025.03.07 |
4. 개발 시작단계 - kIsWeb / 진행사항 (1) | 2025.03.05 |