Flutter Sso Localhost Rails Uninitialized Constant Debug

Flutter SSO 로그인 실패 + Rails 서버 크래시 동시 디버깅 기록

TestFlight에서 소셜 로그인(Apple, Google)이 전부 실패하는 버그를 잡다가 서버도 크래시되고 있다는 걸 같이 발견했다. 각각 원인이 달랐고 둘 다 잡아야 앱이 정상 동작했다. 증상 실기기(TestFlight)에서 Apple 로그인, Google 로그인 버튼을 누르면 다음 에러가 표시됐다: Apple 로그인 실패: DioException [connection error]: The connection errored: Connection refused This indicates an error which most likely cannot be solved by the library. Error: SocketException: Connection refused (OS Error: Connection refused, errno = 61), address = localhost, port = 56837 Google 로그인 실패: DioException [connection error]: ... address = localhost, port = 56839 두 가지가 이상했다: ...

2025-10-01 · 3분 소요 · Seunghan
Flutter Rails Auth Session Persistence Debugging

Flutter + Rails 인증 세션이 계속 풀리는 문제 - 3가지 원인과 해결

Flutter BLoC 앱에서 로그인을 해도 세션이 자꾸 풀린다. 분명 SecureStorage에 토큰도 저장하고, Dio 인터셉터로 401 시 자동 갱신도 구현했는데 왜? 서버 로그부터 시작해서 원인 3개를 찾고 모두 고친 과정을 정리한다. 기술 스택 모바일: Flutter + BLoC 패턴 + Dio HTTP + SecureStorage 서버: Rails 8 API + ActionCable WebSocket 인증: SHA-256 digest 기반 access token + JTI refresh token (90일) 실시간: ActionCable WebSocket (토큰 기반 인증) 증상 로그인 직후는 정상 동작 시간이 지나면 API 요청이 401로 실패 토큰 갱신은 되는 것 같은데 WebSocket이 끊어짐 결국 앱이 미인증 상태로 전환 원인 1: 레거시 코드의 유령 - DTA 잔존 메서드 발견 서버 로그에서 토큰 갱신 시 user.tokens 관련 에러가 간헐적으로 보였다. 이전에 devise_token_auth(DTA)를 사용하다가 자체 토큰 시스템으로 마이그레이션했는데, token_refresh_service.rb에 DTA 시절 코드가 남아 있었다. ...

2025-09-27 · 4분 소요 · Seunghan
Rails Oauth Provider Uid Column Mismatch

Rails OAuth: PG::UndefinedColumn users.uid 에러 — 컬럼명 불일치

Apple Sign-In / Google Sign-In 연동 후 클라이언트에서는 500 에러만 보이는데, 서버 로그를 보면 실제 원인이 다른 경우가 있다. 오늘 마주친 케이스를 정리한다. SSO 연동 초기에는 클라이언트(Flutter) 쪽 설정 문제인지, 서버 쪽 문제인지 구분하기가 쉽지 않다. 이 글에서는 서버 DB 컬럼명 불일치로 인한 PG::UndefinedColumn 에러를 빠르게 진단하고 수정하는 방법을 다룬다. 에러 PG::UndefinedColumn: ERROR: column users.uid does not exist LINE 1: SELECT "users".* FROM "users" WHERE "users"."uid" = $1 ... 클라이언트(Flutter)에서는 401 Unauthorized로 보인다. ...

2025-09-06 · 2분 소요 · Seunghan
Rails Aasa Routing Proc Lambda Git

Rails AASA 라우팅 3가지 함정: proc vs lambda, 경로 누락, git 미추적

iOS 유니버설 링크(Universal Links)를 설정하려면 /.well-known/apple-app-site-association 경로에서 JSON을 반환해야 한다. Rails에서 이걸 라우팅할 때 흔히 빠지는 함정 3가지를 정리한다. 에러 ActionController::RoutingError (No route matches [GET] "/.well-known/apple-app-site-association"): ActionController::RoutingError (No route matches [GET] "/apple-app-site-association"): 배포 서버 로그에서 이 에러가 반복되고, iOS 앱에서 유니버설 링크가 동작하지 않는다. 함정 1: proc을 Rack 앱으로 사용 Rails routes에서 inline으로 파일을 반환하려고 proc을 쓰는 경우가 있다. # 동작하지 않는 코드 get "/.well-known/apple-app-site-association", to: proc { file = Rails.root.join("public/.well-known/apple-app-site-association") [200, { "Content-Type" => "application/json" }, [File.read(file)]] } Rails 라우팅에서 to: 옵션에 Rack 앱을 직접 넣을 때는 env 인자를 받는 callable이어야 한다. proc { } 블록은 인자 없이 정의되어 있어서 Rack 인터페이스를 만족하지 못한다. ...

2025-09-03 · 2분 소요 · Seunghan
Telegram Bot Intent Classification Bugs

Telegram 봇 의도 분류 버그 3가지와 Inline Keyboard 확인 플로우 구현

Telegram 봇에 자연어로 할 일을 추가하는 기능을 운영하던 중 발생한 버그 3가지와, 사용자 경험 개선을 위한 inline keyboard 확인 플로우 구현 내용을 정리한다. 버그 1: “저녁9시” → 09:00(AM)으로 파싱되는 문제 현상 입력: "내일 저녁 커피챗 미팅 저녁9시일정추가" 기대: due_time = "21:00" 실제: due_time = "09:00" 원인 extract_time_from_text 메서드에서 패턴 체크 순서가 잘못되어 있었다. # 버그 코드 if match = text.match(/오후\s*(\d{1,2})시/) # 1) 오후 ... end if match = text.match(/오전\s*(\d{1,2})시/) # 2) 오전 ... end if match = text.match(/(\d{1,2})시\s*(\d{1,2})?분?/) # 3) 숫자시 ← 여기서 "9시" 매칭 hour = match[1].to_i # 9 → "09:00" 반환, 아래 case/when은 도달 불가 return "#{hour.to_s.rjust(2, '0')}:00" end case text when /저녁/ return "18:00" # ← 절대 도달 못 함 end “저녁9시"에서 오후, 오전 패턴은 불일치하지만 세 번째 /(\d{1,2})시/ 패턴이 9시를 잡아 09:00을 반환해버린다. 그 아래 case when /저녁/은 절대 실행되지 않는다. ...

2025-06-25 · 5분 소요 · Seunghan
Rails Api Token Not Null Constraint

Rails API 토큰 생성: NOT NULL 컬럼 누락으로 발생하는 오류

Rails API 서버에서 소셜 로그인(SSO) 후 토큰을 발급하는 로직을 작성하다가 발생한 문제를 정리한다. 상황 Apple Sign In / Google Sign In 후 서버에서 access token과 refresh token을 발급해 클라이언트에 반환해야 한다. 컨트롤러에서 아래와 같이 직접 생성을 시도했다. token = user.api_tokens.create!( token_type: "bearer", expires_at: 1.hour.from_now ) 오류 ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR: null value in column "token_digest" violates not-null constraint 원인 api_tokens 테이블의 실제 스키마를 확인해보니 아래 컬럼들이 NOT NULL로 정의되어 있었다. # db/schema.rb create_table "api_tokens" do |t| t.string "token_digest", null: false # SHA-256 해시값 t.string "refresh_token_digest", null: false # refresh token 해시값 t.datetime "refresh_expires_at", null: false # refresh 만료 시각 t.string "jti", null: false # JWT ID (중복 방지) # ... end 직접 create!를 호출하면 이 컬럼들에 값이 자동으로 채워지지 않는다. ...

2025-06-22 · 2분 소요 · Seunghan
개인정보처리방침 문의