질문 정리 36

State와 StateFlow 차이

정리 이유안드로이드 개발 과정에서 State와 StateFlow를 상황에 맞춰 선택적으로 사용해왔습니다. 하지만 이 두 기술을 사용하는 구체적인 이유와 상황을 타인에게 명확히 설명하는 것이 어려웠기 때문에, 이에 대해 다시 조사하고 이해를 정리하고자 합니다.Stateprivate val _change = mutableStateOf(false)val change: State = _change 타입: State는 Jetpack Compose에서 제공하는 타입으로, 값이 변경될 때 재구성을 유발할 수 있는 값을 보유합니다. Composable 함수에서 읽히며 값의 변화를 감지하여 UI를 업데이트하도록 설계되었습니다.사용법: 주로 Jetpack Compose에서 UI와 관련된 데이터를 위해 사용됩니다. 사용자와..

질문 정리 2024.05.30

PDF 파일 다운로드를 사용자에게 알리기

문제 상황파일 스트림을 통해서 pdf를 다운로드하는 과정에서 사용자에게 다운로드 상태나 메세지가 보이지 않습니다. 따라서 사용자는 다운로드의 진행 상태를 알 수 없어 해당 기능을 사용하는데 불편함을 느낄 수 있습니다.따라서 pdf를 다운로드 하면 다운로드에 대한 정보가 사용자에게 제공되도록 개발을 하려고합니다.생각한 방법downloadManager 사용적합한 상황주로 웹에서 직접 파일을 다운로드할 때 사용됩니다. 다운로드할 리소스는 웹상의 URI 형태로 제공되어야 하며, 이 URI는 HTTP 또는 HTTPS 프로토콜을 사용해 접근 가능한 파일이어야 합니다.대용량 파일 다운로드: 대용량 파일이나 긴 다운로드 시간이 필요한 파일을 다운로드할 때 유용합니다.앱 사용 중이 아닐 때도 다운로드 필요: 앱이 백그라..

질문 정리 2024.05.29

안드로이드 컴포즈 페이스북 로그인 연동 정리

1. 필요한 의존성 추가프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다.plugins { id("com.android.application") version "8.1.1" apply false id("org.jetbrains.kotlin.android") version "1.8.10" apply false id("com.google.dagger.hilt.android") version "2.45" apply false id("com.google.gms.google-services") version "4.4.0" apply false id("com.google.firebase.crashlytics") version "2.9.9" apply false}plugi..

질문 정리 2024.05.26

위임하는 방식(By)과 직접 할당하는 방식(=)의 차이는 무엇일까?

현재 프로젝트의 마감일이 가까워짐에 따라 코드를 점검하는 과정에서 다음의 방식을 혼용하고 있음을 알게 되었습니다.val a = getSurveyViewModel.a.collectAsState().valueval a by getSurveyViewModel.a.collectAsState()val a by viewModel.a.collectAsState()이 구문에서 by 키워드는 위임(delegate)을 의미합니다.collectAsState()는 Flow를 State로 변환하는 함수입니다. 이 함수는 Compose에서 상태(State)를 구독(subscribe)하고 UI를 다시 렌더링할 수 있게 해줍니다.by 키워드를 사용하면 State 객체를 a 변수에 위임하여, a 를 직접 State 객체처럼 사용할 수..

질문 정리 2024.05.24

안드로이드 컴포즈 구글 로그인 연동 정리

1. Google Service 추가프로젝트의 build.gradle 파일에 Google 서비스 플러그인과 Google 로그인 라이브러리를 추가해야합니다.// Project-level build.gradleplugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("com.google.gms.google-services")}dependencies { //firebase implementation(platform("com.google.firebase:firebase-bom:32.7.0")) implementation("com.google.firebase:firebase-analytics")..

질문 정리 2024.04.28

연속된 버튼 클릭, api 요청 처리법

해당 기능이 필요하게 된 이유현재 개발중인 앱에서 회원가입 버튼을 연속으로 누르는 경우, 요청을 두번하게 된다. 이 문제를 해결하기 위해서는 이벤트 처리 시점에 추가적인 상태 관리 또는 조건 검사를 통해 중복된 이벤트의 실행을 방지하는 방법이 필요합니다.하지만 무조건 연속된 클릭을 막아야할까요? 제가 생각한 클릭의 종류는 3가지였습니다. 연속된 클릭을 허용하면 안되는 버튼, 연속된 클릭을 해도 상관없는 버튼, 연속된 클릭이 필요한 버튼입니다.이 부분 중 연속된 클릭을 허용하면 안되는 버튼의 예시로는 회원가입 버튼 등이 있습니다.생각한 버튼 연타 방지 기법Debounce 기법 사용:사용자의 입력에 대해 일정 시간 동안의 입력을 무시하고, 마지막 입력만 처리하는 방법입니다. 이를 통해 사용자..

질문 정리 2024.04.24

서버로 요청을 보내는 테스트 코드

API 테스트 코드를 작성하게 된 주요 이유 개발 도중 기획 변경으로 인해 API가 자주 수정되고 있습니다. API의 변경에 따라 안드로이드 코드도 연쇄적으로 수정해야 합니다. 서버의 소소한 변경사항에 대한 정보가 누락될 때가 있습니다. 서버가 재배포될 때마다 API 변경으로 인해 발생할 수 있는 오류를 확인하고자 합니다. 주요 JUnit 어노테이션 @Test: 이 어노테이션이 붙은 메소드는 JUnit에 의해 테스트로 인식되고 실행됩니다. @Before: 각 테스트 메소드가 실행되기 전에 실행되어야 할 코드를 포함하는 메소드에 이 어노테이션을 사용합니다. 예를 들어, 테스트에 필요한 객체를 초기화하거나 테스트 환경을 설정하는 데 사용됩니다. @After: 각 테스트 메소드의 실행이 끝난 후에 실행되어야 ..

질문 정리 2024.04.18

_username과 username 왜 나누는 것일까?(백킹 프로퍼티)

평소 프로젝트를 하며 다음과 같은 형식의 코드를 자주 사용했습니다. private var _username: String? = null var username: String? get() = _username set(value) { _username = value } private var _password: String? = null var password: String? get() = _password set(value) { _password = value } _username와 username를 나누어 사용하는 이유는 코틀린에서 일반적으로 사용되는 "백킹 프로퍼티(backing property)" 패턴 때문입니다. 캡슐화 강화: 내부적으로 사용되는 _username 필드는 비공개(private)로 설정..

질문 정리 2024.04.16

Retrofit의 Call과 Response 공부하기

Retrofit 요청 및 응답 타입 구미 인사이더를 개발할 때, 작성한 게시판 조회 코드 요청 및 응답 타입을 Custom해서 사용한 경우 fun getBoardDetail(boardNo: String) { showProgress() viewModelScope.launch { val response = repository.getBoardDetail(boardNo) val type = "게시판 상세조회에" when (response) { is NetworkResponse.Success -> { _boardDetail.postValue(response.body) _commentCount.postValue(response.body.comments) } is NetworkResponse.ApiError -> {..

질문 정리 2024.04.07

깔끔한 코드를 위해서 Ktlint 사용

원래는 안드로이드 스튜디오의 세팅에서 Actions on Save에 있는 자동 import와 format 기능을 사용하고 있었는데 자동 정렬 때문에 느려지는 느낌을 받았고, format의 경우 프로젝트 단위가 아니라 파일 단위로 되었기 때문에 klint를 사용해보려고합니다. https://github.com/JLLeitschuh/ktlint-gradle GitHub - JLLeitschuh/ktlint-gradle: A ktlint gradle plugin A ktlint gradle plugin. Contribute to JLLeitschuh/ktlint-gradle development by creating an account on GitHub. github.com Ktlint의 장점 코드 일관성: ..

질문 정리 2024.01.30