서버에서 문자열로 넘어온 날짜가 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 설정 파..
[Hilt] 타입과 의존성
·
🗡️Hilt
Hilt는 타입으로 의존성을 구분한다.의존성이 Hilt 컴포넌트에 바인딩될때, 의존성을 식별할 수 있는 식별자로 class의 패키지명을 포함하고 있는 canonical name을 식별자로 쓰고있다. 어떤 의존성이 컴포넌트에 바인딩이 되고 바인딩된 의존성을 클라이언트가 컴포넌트에 요청할 때 정확하게 구분하고 수행할 수 있는 이유는 어노테이션이 마킹된 위치에 해당 의존성 타입이 명시되어 있기 때문이다.  그렇다면 동일한 타입이 두 번 바인딩될 경우는 어떻게 될까?Hilt입장에서는 클라이언트가 의존성을 요청할 때 어떤 의존성을 주입을 해야할지 모른다. 컴파일 타입에 object 그래프를 점검하고 중복 바인딩 문제가 있는 경우 컴파일을 중단한다. 그리고 DuplicateBindings 이라는 중복 바인딩 에러가..
[Hilt] Dagger Hilt로 의존성 주입하기
·
🗡️Hilt
0. Dagger HiltAndroid Framework는 각종 컴포넌트 간 의존성이 상당히 강하다. 클래스간 의존도를 낮추기 위해서는 의존성 주입(Dependency Injection)을 사용할 수 있다. 객체 생성 시 클래스 간 의존성이 생기게 되는데 이 때, 객체의 생성을 클래스 내부에서 하는 것이 아니라 클래스 외부에서 객체를 생성하여 주입시키는 의존성 주입의 디자인 패턴을 이용할 수 있는 것이다.  이전에는 개인이나 회사별로 수동 또는 별도 의존성 주입 솔루션을 직접 만들어 쓰기도 하였다. Java나 Kotlin 진영에서 널리 쓰이고 있는 라이브러리를 쓰기도 했다.  Android Framework는 자바 언어를 지원하는 것부터 시작했기 때문에 Guice를 사용하기도 했고 구글에서 안드로이드 전..
[Hilt] Hilt 내부 동작 원리
·
🗡️Hilt
0. Annotation Hilt는 annotation 기반으로 돌아간다. annotation의 특징은 소스코드를 해치지 않으면서 컴파일러에게 부가정보를 제공하기 위함이다. Hilt annotation을 사용하여 부가정보를 제공컴파일 타임에 의존성 그래프에 이상이 없는지 확인생성된 소스코드를 기반으로 동작하므로 리플렉션을 사용하지 않아도 되어 퍼포먼스가 떨어질 일이 없음1.  코틀린에서의 Hilt Annotation Processingdependencies { implementation 'com.google.dagger:hilt-android:2.48.1' kapt 'com.google.dagger:hilt-compiler:2.48.1'}kapt { correctErrorTypes tr..
2023년 회고.
·
💬 회고
- 24년 1월 1일의 검단산에서  회고란 모름지기 한 해를 돌아보며 연말에 쓰기 마련인데 1월 말이 되서야 글을 써본다. 기록하고 싶은 순간들과 큰 이벤트들이 있었기 때문에 기록으로 남기고자 한다. 이직2023년 가장 큰 키워드는 역시 이직이다. 2년 반 남짓몸 담았던 회사를 떠나 다른 둥지를 틀게 되었다. 얼어붙은 IT 업계의 채용시장과 연이은 동료들의 퇴사, 독서실을 끊어 퇴근 후 새벽까지 남아 스터디를 하던 시간까지, 견뎌내야 했던 시간들도 있었지만 모든 일에는 끝이 있기 마련이니 스스로를 잘 다독이며 인내의 시간을 보냈던 것 같다. 연말이 되기 전 많은 축하를 받으며 귀한 결실을 맺게 되었다.  이직을 결심하며 회사를 정하는 기준을 구체화 해본 계기도 되었다. 나에게는 뚜렷한 2가지의 이유가 ..