본문 바로가기

분류 전체보기

(271)
[테스트] private 접근 지정자에 대한 유닛 테스트 개요 안드로이드 개발 중 유닛 테스트(Unit Test)를 수행하던 중 private 접근 지정자로 지정된 메소드는 테스트 중 외부에서 접근이 불가능하기 때문에 이를 어떻게 해야 하나 고민하다 여러 블로그 및 포스팅을 참고하여 정리한 게시글이다. TL;DR private이 지정된 메소드 대부분은 굳이 테스트하지 않아도 되지만 일부에 복잡한 로직에 한해서는 작성할 수 있다. Stack Overflow에 게시된 다양한 개발자들의 의견 이 private 메소드에 대한 테스팅은 유닛 테스트를 처음 시작하는 사람들이 처음 고민하는 관문인 것 같다. 마치 아래 포스팅과 같이. 아무래도 외부에서는 인스턴스의 private 함수/변수 등은 접근이 불가능하기 때문에 더 쉽게 만날 수 있는 고민이기도 하다. 이에 대한 사..
[Android] Coroutine, Retrofit을 활용한 비동기 네트워킹 처리 중 에러 핸들링 개요 안드로이드에서 비동기 처리를 하는 대표적인 방법 중 하나는 Retrofit과 Coroutine을 활용하는 것이다. 이 과정에서 다양한 네트워크 오류 상황에 대응하기 위한 다양한 에러 핸들링 방법에 대해 소개하는 게시글이다. 1. try.. catch 블럭 가장 전통적인 방법이다. 단순히 네트워킹이 필요한 위치에 try..catch 블럭을 활용하면 된다. fun updateProfile(file: File) = viewModelScope.launch(Dispatchers.IO) { try{ repository.updateProfile(file) }catch(e: Exception){ //에러 처리 코드 } } 가장 흔하고 간단한 방법이지만 한 앱에서 여러 개의 네트워킹 처리 함수가 존재할텐데, 각 함..
[테스트] Unit Test - 테스트의 검증 방법 개요 이번 포스팅은 Unit Test 과정에서의 검증 방법과 각종 용어에 대해 정리한다. 상태 검증과 행위 검증 테스트의 검증은 주로 상태 검증과 행위 검증으로 나뉜다. 상태 검증은 특정 메서드가 수행된 후 객체들의 상태를 검증하는 것이고, 행위 검증은 특정 메서드가 호출되었는지와 같은 행위를 검사한다. 상태 검증의 예 val abc = Abc() abc.increase() assertThat(abc.value).isEqualTo(10) 위에서는 abc 인스턴스의 value가 10과 같은지 상태를 검증한다. 행위 검증의 예 val abc = Abc() abc.increase() verify(abc, atLeastOnce()).increase() 위에서는 abc 인스턴스의 increase() 메서드가 최소..
[테스트] Unit Test - 기초 개념 및 작성 원칙 Unit Test(단위 테스트) Unit Test는 특정 함수나 소스코드 모듈이 의도된 대로 작동하는지 검증하기 검증하는 방법 중 하나이다. 기본적으로 특정 코드가 잘 작동하는 것을 검증하여 버그가 줄어들 뿐만 아니라 테스트 코드를 작성하면서 기존의 코드에 대한 개선점을 발견하여 더 좋은 코드를 작성할 수 있게 된다. Unit Test 작성 방법 하나의 테스트 케이스에서 최소한의 기능만 검증하고, 간결하게 작성한다. 입력에 대한 결과를 검증하는 방식으로 작성하라. 개발하는 부분 최대한을 커버하라. Third Party Library는 잘 검증되었으리라 믿고 Unit Test의 검증 대상에서 제외하라 클린 테스트 코드를 작성하기 위한 FIRST 원칙 Fast: 테스트는 빠르게 동작하여 자주 실행시킬 수 있..
[안드로이드] FCM 서비스를 통해 메시지를 foreground, background에서 받을 경우 데이터 처리 방법 및 액티비티 이동 개요 파이어베이스의 FCM을 통해 안드로이드 애플리케이션으로 데이터를 전송함과 동시에 노티피케이션 클릭 시 특정 액티비티로 이동하는 방법을 설명한다. (FCM 세팅 방법 및 서버에서 FCM PUSH 방법 등은 제외) 1. 서버에서의 설정 click_action 속성을 추가한다. 이 속성은 시작하고 싶은 액티비티의 intent-filter로 활용하게 된다. const message = { notification:{ title:chat.nickname, body: chat.message, }, data: { createdAt: chat.createdAt, message:"hello", click_action: "NOTIFICATION_CLICK", }, tokens: token }; 2. Android의 A..
[안드로이드] Dialog와 DialogFragment 개요 안드로이드 개발 과정 중 dialog를 구현할 때 흔히 마주치는 Dialog와 DialogFragment에 대한 비교 게시글이다. DialogFragment란? DialogFragment는 클래스명에서 보이듯 fragment이다. 하지만, dialog를 보여주는데 활용되는 fragment라는 특징이 있다. 이 Fragment는 Dialog 객체를 포함하고 fragment의 상태에 따라 적절히 화면에 디스플레이 된다. 무엇을 사용해야 하는가? 공식문서에서는 DialogFragment를 사용하는 것을 권장한다. 그 이유는 다음과 같다. DialogFragment는 fragment의 생명주기를 활용할 수 있다. 기본 Dialog를 활용할 때 Activity가 파괴되더라도 dialog가 존재하여 생기는 l..
[안드로이드] ListAdapter의 작동 원리 및 갱신이 안되는 경우 개요 RecyclerView를 활용하여 목록을 리스팅할 때 흔히 사용하는 어답터로 RecyclerView.Adapter와 ListAdapter로 나뉜다. 전자는 아이템 목록을 직접 관리하며 값이 변경될 경우 변경된 범위, 항목에 대해 직업 notify를 해주어야 한다. 하지만, ListAdapter는 이런 작업이 필요가 없는 어답터이다. ListAdapter는 어떻게 동작할까? ListAdapter의 개념 ListAdapter는 RecyclerView.Adapte를 베이스로 하는 클래스로 아이템의 차이(diff)를 백그라운드 스레드에서 처리해준다. ListAdapter의 작동 원리 우선 사용 방법은 매우 간단하다. ListAdapter의 submit 함수로 리스트를 전달해주면 된다. 그 뒤에서는 Asyn..
[Kotlin] 코틀린 공식 문서 - Coroutine context and dispatchers 개요 해당 게시글은 Coroutine context and dispatchers | Kotlin (kotlinlang.org)을 번역한 게시글 입니다. Coroutine context and dispatchers 코루틴은 코틀린 표준 라이브러리에 정의된 Coroutine Context 타입의 값으로 표현되는 어떤 context에서 항상 실행된다. Coroutine context는 다양한 요소의 집합으로, 주요 요소로는 Job, dispatcher 등이 존재한다. Dispatchers and threads Coroutine context에는 코루틴이 어느 스레드에서 실행될 지 결정하는 Coroutine dispatcher가 존재한다. Coroutine dispatcher는 특정 스레드에서 코루틴이 실행되게..