목록Android (31)
nueijeel
1. 테스트 3단계 공식 (Finder, Assertion, Action)Compose Test Rule은 다음과 같은 3단계를 따른다. - .finder : 화면에서 무엇을 찾을 것인지 설정. onNode, onNodeWithText, onNodeWithContentDescription 등으로 테스트의 대상을 찾음. (ex. 특정 text 또는 contents description에 해당)- .assertion : 찾은 요소가 어떤 상태인지 확인. assertIsDisplayed, assertIsEnabled, assertIsSelected 등으로 상태를 검증함. (ex. 표시됨, 선택됨, 활성화됨)- .action : 어떤 동작을 수행할 것인지 정의. performClick, performTextIn..
CatchMate Github Repository에는 Push와 Pull Request가 발생하면 변경된 코드들이 ktlint 규칙에 맞는지 검사하는 action을 수행하도록 설정되어 있다. 프로젝트를 Jetpack Compose로 Migration하는 과정에서 예상못한 충돌이 발생했다. 1. 문제 상황 "Function name should start with a lowercase letter (except factory methods) and use camel case (standard:function-naming)" Compose Migration이 수행된 코드를 로컬에서 원격 레포로 Push 한 뒤 ktlint가 체크됐을 때 위와 같은 오류 메시지가 발생하며 빌드에 실패한다. 분명 Compos..
안드로이드에서 리스트를 표시할 때 사용자 경험을 위해 무한 스크롤을 사용한다. 무한 스크롤(Infinite Scroll)이란?사용자가 페이지 하단에 도달했을 때 목록이 계속 로드되는 방식으로다음 콘텐츠를 보기 위해 추가적인 동작이 없고, 페이지 로드 시간이 짧다는 장점이 있다. 아무래도 모바일 환경에서는 화면이 작기 때문에별도의 동작 없이 사용자 입장에서 매끄럽게 작동하는 것이 중요하다. 안드로이드에서는 Jetpack Paging3 라이브러리를 이용해 무한 스크롤을 구현할 수도 있지만이번 글에서는 RecyclerView의 Scroll 리스너를 사용해 간단히 처리하는 방식을 소개하려고 한다. 리스트 불러오는 API 구조// 필터 미지정 시 모든 쿼리 값 안넣고 호출@GET("boards/list..
안드로이드 스튜디오 시뮬레이터에서는 카카오 로그인이 정상적으로 작동하는데기기에서 배포된 앱을 실행했을 때 카카오 로그인이 안되는 현상이 발생했다. 발생한 오류 로그카카오계정으로 로그인 실패System.err W AuthError(statusCode=401, reason=Misconfigured, response=AuthErrorResponse(error=misconfigured, errorDescription=invalid android_key_hash or ios_bundle_id or web_site_url)) 개발 과정에서 카카오 개발자 콘솔 안드로이드 플랫폼 설정에 이미 디버그용 키 해시를 등록해놓은 상태였기 때문에 무엇이 문제인지 감도 안 잡혔다...구글링을 해보니 릴리즈 키 해시를 등록해야..
프로젝트에서 FCM(Firebase Cloud Messaging)을 이용한 푸시 알림을 구현해야 했는데앱이 Background 상태일 때 푸시가 뜨지 않고 작업 표시줄에만 알림이 표시되는 현상이 발생했다. fcm이 알림을 처리하는 방식과 관련이 있기 때문에 이걸 이용해서 해결해보려고 한다. 앱 상태에 따른 수신 메시지 핸들링 Firebase 공식 문서에 따르면FCM은 FirebaseMessagingService 클래스의 onMessageReceived() 함수를 통해 메시지를 수신한다. 보통의 경우 onMessageReceived() 콜백 함수가 작동해 알림을 표시하도록 하면 되지만 두 가지 예외 케이스가 있다. 1. 앱이 Background 상태일때 Notification 메시지만 수신되는 경..
그동안 단일 액티비티 기반의 프로젝트에서 프래그먼트 간 데이터 공유를 위해 Bundle 객체를 주로 사용해왔다.다양한 타입의 값들을 bundle에 담아 전달할 수 있는데 그 중 사용자 정의 클래스 객체를 전달하기 위해서는 직렬화하는 과정이 필요했다. 지금까지는 java의 serializable 인터페이스를 구현해 직렬화했었는데,안드로이드 환경에서 serializable은 성능적 측면에서 문제가 있을 수 있다는 점을 알게되어 더 나은 방안을 찾아보고 포스팅하게 되었다. 직렬화직렬화(Serializable)는 메모리에 있는 데이터를 디스크에 저장하거나 네트워크 통신을 통해 전달하기 위해 byte stream 형태로 변환하는 것이다. (역직렬화는 반대 개념) 그렇다면 직렬화가 필요한 경우는 언제일까?..
새로운 프로젝트를 시작하면서 이전 프로젝트를 진행할 때 구현했던 내용을 그대로 적용하지 않고 조금이라도 아쉬웠던 부분을 개선한 코드를 작성하려고 노력했다. 그 중 하나가 토큰 관리에 관한 부분이었는데,OkHttp의 Interceptor와 Authenticator를 사용해서 토큰 관리할 수 있는 방법을 프로젝트에 적용한 과정을 작성해보려고 한다. 이전의 방식과 비교이전 프로젝트에서는 API 호출 시 Header로 직접 AccessToken을 전달해 통신했다. 그 과정에서 토큰 만료 응답(401)이 반환될 경우 Refresh Token을 사용해 재발급 api를 직접 호출하여 새로운 AccessToken을 발급받아 기존 작업을 다시 수행하는 과정을 거쳤다. 이 방법은 API 호출마다 일일이 토큰 헤..