서버에서 문자열로 넘어온 날짜가 Date로 잘 매핑되는 이유
·
🐸 Android
안드로이드 개발을 하다 보면 서버에서 날짜를 문자열로 보내주고, 클라이언트에서는 이를 Date 타입으로 받는 경우가 종종 있다.예를 들어, 서버에서 아래와 같은 JSON 응답을 보낸다고 해보자{ "id": 1, "drinkDate": "2025-06-07", "title": "Meeting"} 클라이언트에서는 다음과 같은 데이터 클래스로 매핑한다고 가정하자data class UserCalendar( val id: Int, val drinkDate: Date, // 서버는 String, 클라이언트는 Date val title: String) 서버에서는 drinkDate를 String 형태로 보내주고 있음에도 불구하고, 클라이언트에서는 이를 java.util.Date로 받아도 예외 없이..
코틀린 상태 관리, 불변 데이터 중심으로 생각하기
·
💎 Kotlin
0. 가변성과 상태var 같은 읽고 쓸 수 있는 프로퍼티나 MutableList처럼 내부 상태를 변경할 수 있는 객체를 사용하면 `상태(state)` 를 갖게 된다. 상태를 갖는 객체는 단순히 사용 방법뿐만 아니라 그 `이력(history)` 에 따라 동작이 달라질 수 있기 때문에, 프로그램을 이해하거나 디버깅하기 어려워진다. 예를 들어, 은행 계좌의 잔액을 나타내는 balance라는 상태 값이 있다고 하자. 사용자가 출금하거나 입금할 때마다 이 값은 바뀌고, 특정 시점의 balance 값은 과거에 어떤 동작들이 있었는지에 따라 결정된다. 이런 구조에서는 단순히 현재 코드만 봐서는 전체 동작을 예측하기 어렵다.또 다른 예시로, 필터 기능을 개발한다고 하자. 가격 필터, 출시순 필터, 지역 필터 등이 있고..
값과 참조로부터 시작하는 얕은 복사 깊은 복사
·
💎 Kotlin
1. 값과 참조여기 var a = 2 가 있다. 개발자에게는 단순히 변수 a에 숫자 2를 넣는 것이지만, 컴퓨터는 이것을 메모리에 어떤 공간을 할당하고, 그 공간에 값을 저장하는 것으로 인식한다. 변수 앞에 붙는 선언 키워드로 이 변수는 어떤 성격을 가진다라는 힌트를 컴파일러에게 준다. 컴퓨터는 변수에 값을 할당할 때 두 가지 방식 중 하나로 처리한다.값(value)으로 할당: 실제 데이터를 그대로 저장참조(reference)로 할당: 데이터가 있는 메모리 주소만 저장왜 분리했을까? 모든 데이터를 값으로 저장하면 메모리 사용량이 폭발적으로 증가한다. 이를 해결하기 위한 방법으로 '변하지 않는 값은 한 번 고정을 해놓고 참조를 하게 하자' 로 풀기 시작하였다. 메모리의 입장에서는 한 군데만 차지하면 되기 ..
[Gradle] Android Gradle Plugin과 Gradle 기본 생성 파일
·
🐸 Android
0. IntroGradle 은 빌드도구이다. Java, Kotlin, Python 등 내가 작성한 소스 코드들을 컴파일하고 실행 가능한 파일로 만들어주는 기본적인 빌드 수행을 한다. 하지만 Android 앱 빌드에는 특수한 작업들이 필요하다.예시는 아래와 같다.Android 앱은 `.apk` 또는 `.aab` 형식으로 패키징해야 한다.`.class` 파일을 Android의 `Dalvik(ART)` 실행 환경에서 사용할 수 있는 `.dex` 파일로 변환해야 한다.res/layout.xml, res/drawable/ 같은 Android 리소스를 빌드 과정에서 최적화해야 한다.`AndroidManifest` 에 선언된 앱 정보, 권한, 컴포넌트 설정을 Gradle과 연동해야 한다.빌드 변형 (`Build ..
[Gradle] Java Versions in Android Builds
·
🐸 Android
0. IntroWhether your source code is written in Java, Kotlin, or both, there are several places you must choose a JDK or Java language version for your build.- Android Developers Document우리는 앱 빌드를 위해 JDK 또는 Java 언어 버전을 여러 곳에서 선택해야한다.  `compileOptions` 와 `kotlinOptions` 을 이용하여 Java 버전과 `JVM` 버전을 설정해주는 과정을 먼저 살펴보고, Kotlin과 Java 소스코드가 Gradle 빌드 도구로 JDK 실행환경에서 작동하는 과정을 정리한다. 또 `Gradle JDK`는 어떻게 정의될 수..
[Android] Convention Plugin
·
🐸 Android
0. Convention Plugin멀티 모듈을 적용해나가고 있는 우리팀의 프로젝트 특성상, 모듈마다 공통적으로 작성해야하는 설정들이 있다. build types 이나 compile options 설정 등 보통 동일하게 설정들이 있는데 각 모듈을 생성할 때마다 똑같이 작성해야하는 수고로움이 있다.Convention Plugin은 주로 buildSrc 디렉터리나 별도의 Gradle 플러그인 모듈에서 정의되며, 모듈마다 동일한 설정을 반복하지 않아도 되도록 도와준다. 즉, Gradle에서 반복적인 설정을 캡슐화하여 프로젝트의 공통 규칙을 관리하는 방법이다. 이 블로그글은 적용 방법보다 Convention Plugin을 적용하면서 코드적인 이해를 돕고자 작성했다. 1. Gradle Kotlin DSL 설정 파..
FCM Notification 2 - background 에서 푸쉬 알람받기
·
🐸 Android
0. FCM 푸쉬 알림이란 서버에서 모바일 장치에 보내는 알림 또는 메세지이다. 직접 구현한 서버에서 사용자 장치로 알림을 보내기 위해서는 앱과 서버의 연결을 지속적으로 유지해야 한다. 하지만 FCM(Firebase Cloud Messaging)은 구글 클라우드 서버를 이용해 앱에서 서버에 연결하지 않아도 기기의 내부 연결을 통해 메세지를 보낼 수 있다. Firebase console 에서도 FCM token 을 넣어 푸쉬 메세지를 보낼 수 있지만, 서버와 연결한다면 이러한 과정을 거치게 된다. 1. FCM Message Type when your app in background, the method onMessageReceived never invoked FCM에서 보내는 메세지의 타입에 따라 앱의 포..
FCM Notification 1 - 안드로이드 13에서 Notification 권한 허가 변경
·
🐸 Android
기존 안드로이드 OS에서는 유저의 동의없이 푸쉬 알림을 띄울 수 있었지만, 안드로이드 13 부터는 다른 permission 들처럼 알람 권한이 새로 생겼다. 알림 권한은 유저 기기의 OS가 13인 경우 모두 해당 된다. 즉 대응을 하지 않으면 유저들이 알림을 받지 못한다. 1. Delcare The Permission POST_NOTIFICATIONS (Notification Permission) 은 Target SDK API 33 이상부터 추가 가능 2. Scenario Target SDK API 32 이하의 앱이 Android 13 디바이스에 설치되면 Notification Channel을 등록할 때 자동으로 Notification 권한 요청 팝업이 나옴 Target SDK API 33 이상의 앱..
나는 어떻게 장애를 전파하였는가 (2)
·
💬 회고
0. 결심 당시 한꺼번에 장애를 겪으며 '어떻게 대응해야 효율적으로 할 수 있지? 이걸 어떻게 모두에게 전파할 수 있지? 그리고 이해관계자들에게는 어떻게 전파해야하지?' 라는 생각을 했었다. 하이브리드앱이라는 새로운 플랫폼이 생기면서 얽히게 되는 이해관계자들은 더 많아질 수밖에 없었다. 애초에 '이 에러가 나도 확인해야하는 에러였어?' 라며 자신이 이해관계자인지도 불분명한 경우도 있었다. 앱에서 디버깅이 불가하여 웹 개발자에게 요청해야하는 순간들도 있었으며 '이게 왜 앱에서 에러가 나는거야?'라며 이해도가 서로 일치하지 않는 경우가 있었다. 그리고 이렇게 취합된 문제정의와 해결 과정들을 운영팀과 소통하면서 전달하는 과정도 순탄치 않았다. 커뮤니케이션 코스트를 줄이면서도 운영팀은 문제 정의를 빠르게하여 서..
나는 어떻게 장애를 전파하였는가 (1)
·
💬 회고
이번 글은 1년 전 하이브리드앱을 출시하며 겪은 앱 안정화의 과정에서 느꼈던 것들을 얘기하고자 한다. 하이브리드앱이기에 웹과 앱의 통신과정에서 발생한 에러들도 많았다. 안드로이드 개발자는 나 혼자뿐이었으므로 하이브리드앱의 설계를 처음부터 끝까지 혼자서 담당했고 디버깅하는 과정에서도 웹 개발자와도 소통을 많이 했었어야 했다. 소프트웨어 개발을 하는 곳이라면 어느 곳에서든 장애가 없을 수 없다. 하지만 체감상 거의 대부분은 상대적으로 빠르게 해결할 수 있는 것들이다. 큰 장애는 1년에 몇 번정도 발생한다던데(by 개발팀장님) 그 일들을 한꺼번에 겪으면서 '앱 안정화'란 Task를 직접 만들고 프로덕트 팀 내 에러 대응 프로세스 정립까지 한 이야기를 써보고자한다. 1편은 당시 내가 짧은시간에 한꺼번에 겪었던 ..