728x90
반응형

개발 32

(Android) Dynamic App Icon

기획자가 가끔 크리스마스, 한글날, 어린이날 과 같이 특별한 기념일에 앱 아이콘을 독특하게 바꾸고 싶은 요구사항을 전달하는 경우가 있습니다. 보통은 이렇게 특별한 날만 바꾸는 건 어렵고 앱을 업데이트해야만 아이콘을 변경할 수 있습니다. 하지만 activity-alias를 사용하게 된다면 앱 업데이트를 하지 않고 동적으로 앱 아이콘을 변경할 수 있습니다. activity-alias activity-alias는 AndroidManifest.xml에서 사용할 수 있는 태그로 기존에 선언된 에 대해 별칭을 제공하는 기능입니다. 이것을 사용하면 하나의 Activity에 여러개의 진입점을 생성할 수 있고, 다양한 인텐트 필터()나 메타데이터()를 적용하여 동일한 Activity를 다양한 방식으로 사용할 수 있습니..

(Android) 네이버/카카오 API 키 안전하게 관리하기

안드로이드 애플리케이션 개발에서는 다양한 Third Party Library를 활용하여 기능을 향상시키고 개발 시간을 단축합니다. 이러한 라이브러리들은 종종 API 키를 필요로 하는데, 이는 서비스 제공자와 애플리케이션 간의 인증을 위해 사용됩니다. 하지만 이 API 키가 노출될 경우, 보안 위험이 발생할 수 있습니다. 불법적인 접근, 데이터 유출, 비용 상승 등 다양한 문제가 생길 수 있기 때문에, API 키를 안전하게 관리하고 보호하는 것이 중요합니다. 네아로(네이버 아이디 로그인), 카아로(카카오 아이디 로그인)과 같이 메신저 로그인을 연동할 때도 위와 같은 상황이 동일하게 적용되기 때문에 API 키 관리를 중요하게 생각해야합니다. 이를 위해 개발자는 코드 내에서 직접적으로 키를 노출하지 않고 관리..

Kotlin object와 Gson의 오해

안녕하세요. 안드로이드 개발자 정석준입니다. 오늘 소개할 내용은 Kotlin에서 Gson을 사용할 때 object로 json을 파싱하는 경우 발생하는 버그에 대해 이야기해보려고 합니다. 예제코드 import com.google.gson.Gson fun main() { val gson = Gson() val json = "{}" val house: House = gson.fromJson(json, House.Room::class.java) val name = when (house) { House.Living -> "Living" House.Room -> "Room" } println(name) } sealed class House { object Room : House() object Living: Hou..

개발/코틀린 2023.08.03

(Coroutine) asStateFlow()를 써야할까요?

안드로이드 개발을 하면서 대부분 MVVM 패턴을 많이 사용하고 그 안에서 Observable한 형태를 사용하기 위해 LiveData, Rx, Flow등 여러가지를 사용합니다. 그 안에서 ViewModel 내부에서는 Mutable한 형태를 유지하고 외부에서는 Immutable한 형태를 유지하기 위해서 아래와 같은 형태를 많이 사용합니다. import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow sealed interface LoadingUiState { object Loading : LoadingUiState object Load..

개발/코틀린 2023.07.28

코틀린 언어 스터디

👩🏻‍💻👨🏻‍💻 멤버 정석준(멘토) 고수민 김우남 배준형 이유경 이은정 이제일 정지원 최윤정 📚 책 개발자를 위한 코틀린 프로그래밍 A to Z https://www.yes24.com/Product/Goods/112923585 2장 ~ 14장 (총 13장) 👊 목표 Kotlin 심화로 넘어가기 전에 기초를 다지기 ⏰ 시간 매주 일요일 저녁 9시 OT - 2023.07.16(월) 2023.07.16 ~ 2023.10.15 📍 장소 구글밋 진행 🎸 기타 스터디 준비는 각자 편한 형태로 준비해주세요. ex) 블로그, ppt, github 등등 과반수 이상 미출석 시 스터디 진행 하지 않아요. ✍🏻 스터디 결과물 고수민 2장 https://freckle-meteor-e1e.notion.site/chapter-2..

개발/스터디 2023.07.16

파이브 라인스 오브 코드 - 타입 코드 처리하기

독립된 if 문은 검사(check)를 담당하고, if-else 문은 의사결정(decision)으로 간주합니다. 한 가지 예를 들면, 숫자 배열에서 평균을 구하는 함수에서 배열의 크기가 0이면 오류가 발생하고 그렇지 않으면 계산한 값을 반환하는 함수가 있습니다. function average(arr: number[]) { if (size(arr) === 0) throw "Empty array not allowed" else return sum(arr) / size(arr) } 이 함수에서 배열의 크기가 0인지 아닌지로 의사결정을 하기 보다는 검사를 담당하는 것으로 보입니다. 그럼 이것은 이렇게 변경 할 수 있습니다. function assertNotEmpty(arr: number[]) { if (size(..

개발/리팩터링 2023.07.09

파이브 라인스 오브 코드 - 긴 코드 조각내기

규칙 - 왜 다섯 줄인가? 이 책에서는 근본적인 규칙으로 다섯 줄 제한을 소개합니다. 메서드는 {와 }를 제외하고 5줄 이상이 되면 안된다고 이야기 합니다. 아래 isTrue() 메서드는 4줄 입니다. function isTrue(bool: boolean) { if (bool) return true; else return false; } 메서드가 길면 한 번에 긴 메서드의 모든 논리를 머릿속에 담아야하기 때문에 작업하기가 어렵습니다. 또한 메서드 이름만 보고 어떤 역할을 하는지 유추가 되기 때문에 주석을 넣는 것과 같은 효과를 낼 수 있습니다. draw() 메서드는 매우 길지만 내부를 잘 보면 map을 그리는 영역과 player를 그리는 영역이 존재하고 있습니다. 우리는 메서드 추출 이라는 리팩터링을 통..

개발/리팩터링 2023.07.03

파이브 라인스 오브 코드 - 리팩터링 깊게 들여다보기

리팩터링이란 코드가 하는 일을 변경하지 않고 더 나은 코드를 만드는 것 입니다. 코드 개선 더 나은 코드를 만들기 위해 코드를 개선해야 하는데 가독성과 유지보수성을 잘 챙겨야 좋은 코드라고 할 수 있습니다. 가독성 가독성은 의도를 전달하기 위한 코드의 성질로 가독성을 잘 챙긴 코드는 읽기 쉽고 작성자의 의도를 잘 파악하기가 쉽습니다. 유지보수성 유지보수성은 얼마나 많은 후보를 조사해야 하는지를 나타내는 성질입니다. 여기서 말하는 후보는 버그를 고치거나 기능을 추가하기 위해 어떤 코드가 어디에 있는지, 새로운 코드를 어디에 배치해야하는지에 대한 context를 말합니다. 유지보수성이 좋으면 조사해야 하는 context가 줄어들고 놓치는 부분이 없어서 또 다른 버그를 발생시키는 위험을 줄여줍니다. 일반적인 ..

개발/리팩터링 2023.06.19

(Test) Junit에서 isEqualTo 와 isSameAs

Kotlin에서 JUnit을 사용할 때 isEqualTo와 isSameAs 메서드의 차이점은 Java에서와 동일합니다. isEqualTo 메서드는 두 개의 객체가 내용(content) 면에서 동일한지 확인하는 데 사용됩니다. 객체의 값(value)을 비교하기 위해 equals 메서드를 사용합니다. 예를 들어, obj1과 obj2라는 두 개의 객체가 있다면, assertThat(obj1).isEqualTo(obj2)를 사용하여 obj1이 obj2와 동일하다고 단언할 수 있습니다. isSameAs 메서드는 반면에 두 개의 객체가 메모리 상에서 정확히 동일한 인스턴스를 참조하는지 확인합니다. 객체의 참조(reference)를 비교합니다. 예를 들어, obj1과 obj2라는 두 개의 객체가 있다면, assert..

개발/코틀린 2023.06.17

(Coroutine) Flow flatMapConcat, flatMapLatest, flatMapMerge

flatMapConcat, flatMapLatest, 그리고 flatMapMerge는 모두 Kotlin의 코루틴 라이브러리에서 제공하는 Flow 연산자들입니다. 이들 연산자들은 각각 다른 방식으로 upstream Flow의 각 요소를 다른 Flow로 변환하고, 이렇게 생성된 여러 Flow들을 하나의 결과 Flow로 연결합니다. flatMapConcat: flatMapConcat 연산자는 upstream Flow의 각 요소를 Flow로 변환하고, 이를 순차적으로 연결하여 결과 Flow를 생성합니다. 즉, 한 번에 하나의 내부 Flow만 처리하며, 새로운 내부 Flow는 이전의 내부 Flow가 완전히 수집된 후에만 수집됩니다. flatMapMerge: flatMapMerge 연산자도 upstream Flow..

개발/코틀린 2023.06.14
728x90
반응형