항상 제목을 짓는게 제일 어려운것 같은데, 습관적으로 맨 처음에 제목을 적어야하니 영 맘에 드는 제목이 아니지만,그래도 어쩔 수 없지. 기존 내 코드에는 하드코딩된 링크 부분이 있었다. 광고 배너처럼 스와이프해서 공지 이미지를 보여주는 용도였다.처음 개발할 때 공지 기능 스와이프 하는걸 만들고 싶어서 급하게 별 생각 없이 만들었는데,이게 공지가 기간에 따라 내리고 올리고 해야하는것이라현 상태에서는 공지글 새로 업데이트하기 위해서는 배포를 새로해야하는 그런 멍청한 디자인이라는걸 깨달았다. 그래서 공지 이미지랑 공지글 링크를 디비에 저장해서, 그 디비 내용을 받아와서 화면에 뿌려주는 용도로 바꿀거다.스와이프하는 공지 섹션이랑 아이템 키워드가 `Carousel`이라서 이 단어로 이것저것 만든다. 1. Do..
앱에 로그인을 했다가 다른 앱 들렀다가 다시 돌아오면 매 번 새로 로그인을 하라고 하는 상황이었다.전화번호 로그인을 구현해 둔 상태인데, 처음엔 전화번호 로그인이 다 이런가? 하였는데 그럴리가 없다.내 잘못인 것이지. 1. AuthRepository 인터페이스에 authStateChanges 메서드를 추가했다. Stream authStateChanges(); 2. AutoRepositoryImpl 에서 authStateChanges 구현을 추가한다.Stream authStateChanges() { return _firebaseAuth.authStateChanges().map((user) => user != null); } 3. GetIt 파일의 AuthCubit에 authRepository를 추가..
관리자만 접근할 수 있는 페이지를 만들고싶었다.그래서 OAuth를 구글 로그인으로 하나 활성화했다.그다음에 admin 권한 관리를 어떻게 하나 찾아봤다. 1. `roles`테이블을 만든다.테이블을 만들어서 role 이라는 칼럼에 admin, member 이런 식으로 권한을 넣어줄 수 있게 한다. 회원이 로그인하면, 이 테이블을 참조해서 권한을 확인하겠지. 2. 특정 이메일을 하드코딩해서 권한을 관리한다.예를 들어 'admin@example.com' 이 이메일이면 관리자 페이지로 넘어갈 수 있도록 하고, 아니면 안되게 하는 것을 코드로 박아버리는 것이다. useEffect(() => { if (user && user.email !== 'admin@example.com') { router.p..
https://supabase.com/docs/guides/database/postgres/row-level-security Row Level Security | Supabase DocsSecure your data using Postgres Row Level Security.supabase.com 여기 보면 이런 문구가 있다. 내가 찾던 부분이었다. Enabling Row Level Security#You can enable RLS for any table using the enable row level security clause:alter table "table_name" enable row level security;Once you have enabled RLS, no data will be ac..

애플리케이션의 사용자 권한에는 현재 세 종류가 있다: 멤버, 코치, 어드민. 물론 영어로 해 뒀다. member, coach, admin 이렇게. 보통 멤버 권한으로 앱을 사용하고, 매일 바뀌는 운동 등을 작성하고, 수정하고, 회원 기록을 입력하고 하는거는 coach, 아니면 admin이 해야한다. member는 그냥 게시된 글을 보기만 할 수 있으니 수정할 일이 없다. 작성할 일도 없고.어느날 admin 권한을 넣어서 앱 내용을 좀 채워보려 했더니, 키보드가 등장하면서 화면의 90%를 먹어버리는 것을 발견하였다.이런 예상치 못한 변이 있나. 에러 1. 글을 작성하는 페이지에서키보드가 등장하면 이렇게 가려져 버리는 것이다. 이러한 에러를 사전에 발견하지 못한 이유가 있다.에뮬레이터로 테스트하면서 개발할..

전에도 인터넷이랑 강의 보면서 했는데다시 하려니 기억이 안나서이런건 블로그에 작성해두면 더 좋겠다 싶었다. 우선 앱스토어 계정이랑, 모든 준비는 다 끝냈고, 빌드파일 올리는것만 남은 상태라고 가정하겠다. 우선 플러터 작업 디렉토리로 가서 터미널에`flutter build ios --release` 그러면 터미널에 `Runnint pod install...`-> `Runnig Xcode build...`이런게 나오고 잘 끝나면 `Built build/ios/iphones/Runner.app`이렇게 출력된다. 이제 Xcode에서 내 프로젝트를 연다. Fluttter 프로젝트 안에 `ios`디렉토리가 있는데, 거기를 열면 된다. `Product>Archive` 이렇게 하면 된다. Xcode에서 바로 Di..
분명히 되었단 말이다.내가 수도 없이 코드 작성하고 아이폰 시뮬레이터에서 매번 확인했단 말이다. 그런데 테스트 플라이트 앱을 받으니 이건 뭐람 로그인부터가 안되는 것이다. 그래서 왜 로그인이 안될까, 찾아봤다. 다양한 이유가 있을 수 있었다. 차근 차근.,, 하나씩. 1. 깃헙 레포를 처음에 public으로 작업했다. 그래서 firebase 설정 파일들을 전부 `.gitignore`에 넣어서 숨김 처리해 뒀었다. 그래서인가, 싶어 해당 파일들을 그냥 다 숨김처리를 취소했다. 지금은 private 레포로 작업중이기 때문이다. 2. Xcode로 가서 Runner-> Build Phases -> Copy BVundle Resources 아래에 `GoogleService-Info.plist`가 잘 있나 확인해..
로그아웃이 되어야 하는데 안된다.앱을 등록하려면 로그아웃, 회원탈퇴 기능이 구현 되어야 승인이 나는데, 그래서 로그아웃, 회원탈퇴를 시키려는데안되는 것이다. 이유를 찾은 것 같다. 장장 이틀 동안 찾아 헤맸다. 내가 만들고 있는 `my_page`에서는 하위 페이지로 `n-RM` 페이지를 가지고 있다.찾아보니 하위 페이지에서 `loadCurrentUser()` 하면서 캐시된 유저 정보를 다시 갖고왔던게 아닌가 싶다. 사실 지금 해결의 실마리를 찾은 것 같아 두근거려서실행을 못해보고우선 블로그를 적고 있는 것이다. 왜냐면 이게 실행이 잘 되면, 나는 또 이 블로그 글 작성하는 것을 등한시할 것이기 때문이다. 아 이거 냄새가 난다. 냄새가 나.버그의 냄새를 좇아서 여기까지 온 나에게 칭찬을 해 주고 싶군. ..
아 도무지 에러가 안잡혀서, 지난 에러에 대해 글을 쓰기로 했다. 짤막하게. openAI api를 쓰려면 api key가 필요하다. 아주 소중한 api key. 처음에는 코드를 이렇게 썼었다. const functions = require("firebase-functions");const admin = require("firebase-admin");const { onDocumentWritten } = require("firebase-functions/v2/firestore");const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); 그랬더니, 이 함수를 firebase functions에 deploy 하려고 `firebase depl..
유료 API 결제를 하였다. 우선 10달러 넣어두었고, 5달러 이하로 떨어질 때마다 10달러씩 충전하게 해 두었다. 이런 아름다운 자본주의 세상, 모든 어여쁜 것에는 돈이 드나니. https://platform.openai.com/docs/quickstart 챗GPT는 잘 써왔는데, OPEN AI api 결제는 처음 해 본다. 둘은 별개다. 돈을 받아내기 위해서인지, 굉장히 친절한 설명으로 가이드 되어 있는 것을 알 수 있다. 1.https://platform.openai.com/api-keys 여기에 가서, api 키를 만든다. 우상단에 보면 'Create new secret key' 버튼이 있다.이 때 생성되는 api 키는 다시 볼 수 없다. 잘 복사해 둔다. 2.터미널로 가서, .zshrc 파일..