분류 전체보기 544

2025년 회고

어떤 해는 버티는 것만으로 충분하고, 어떤 해는 달리는 것만으로 숨이 차다. 나에게 2025년은 그 두 가지가 묘하게 섞인, 그러면서도 '확장'이라는 단어가 가장 잘 어울리는 시간이었다. 안드로이드라는 익숙하고도 안전한 울타리를 넘어 플랫폼의 경계를 허무는 법을 배웠고, 결핍 속에서 설계의 본질을 마주했다. 1년이라는 긴 시간 동안 내가 남긴 선명한 궤적들을 문장으로 정리해 본다.'행운복권' 마이그레이션2025년 가장 기억에 남는 사이드 프로젝트는 단연 '행운복권' 서비스의 마이그레이션이었다. 어느 날 마주한 서버의 부재는 개발자에게 마치 산소 공급이 중단된 것과 같은 위기였지만, 나는 이 결핍을 시스템의 자생력을 기르는 기회로 삼기로 했다. 서버 의존성을 과감히 걷어내고, 로컬 DB(Room)와 Ala..

Memoir 2026.01.04

안드로이드 신입 개발자의 시선에서 본 테스트 코드

여러 개발자들에게 테스트 코드에 대해 물어보면, 의외로 비슷한 대답이 돌아온다.“우리 회사에는 테스트 코드가 없다”는 말이다.이유는 제각각이다.필요성을 느끼지 못해서라는 사람도 있고, 바쁘다 보니 작성할 여유가 없었다는 사람도 있다.솔직히 말하자면, 나 역시 한동안은 후자에 가까웠다.입사 초기에 팀에는 안드로이드 개발자 한 분만이 중요하다고 판단되는 로직에 한해서 테스트 코드를 작성해두고 있었다. 다만 내가 담당했던 Feature 영역에서는 Repository, UseCase, ViewModel 등 중 어느 것도 “반드시 테스트가 필요하다”고 느껴지지 않았다. 그 당시의 나는 그렇게 판단했다.생각이 바뀌게 된 계기는, 기존에 작성된 코드를 기반으로 새로운 기능을 구현하게 되었을 때였다.Feature 하나..

Develop/Kotlin 2025.12.28

프로세스 실종 사건 - Activity 스택이 사라졌다.

사라진 결제의 행방을 추적하라사건은 이러하다.그날도 평소처럼 평화로운 오후였다.사용자는 결제 화면에서 신중하게 결제 수단을 고르고, 한껏 기대에 부풀어 ‘결제하기’ 버튼을 눌렀다.이제 곧 결제가 완료되고, 상품권이 발송될 터였다.그런데, 그때였다.은행 앱으로 연결된 순간, 우리의 앱은 잠시 무대 뒤로 퇴장했다.잠시면 돌아올 줄 알았다. 하지만 그것은 그의 마지막 기억이었다.사용자는 은행 앱에서 오랜 시간 머물렀다.카드를 선택하고, 비밀번호를 입력하고, 그러나 마지막 순간에 결제를 취소했다.그리고 돌아왔을 때, 앱은 여전히 그 자리에 있었다.하지만 무언가 달랐다.화면은 익숙했지만, 기억은 사라져 있었다.결제 금액도, 선택한 선물 정보도, 입력했던 메시지도 모두 흔적이 없었다.마치 새로 설치한 앱처럼, 모든..

Develop/Kotlin 2025.09.19

Jetpack Compose 환경에서 ExoPlayer 최적화

Jetpack Compose로 동영상 UI를 만들기 시작했을 때는 단순히 화면에 영상만 잘 나오면 된다고 생각했다. 그러나 구현을 조금씩 구체화할수록, 예상하지 못했던 문제들이 하나둘씩 고개를 들기 시작했다.특히 요즘 유행하는 세로형 숏폼 콘텐츠 앱을 만들다 보면 이 어려움을 누구나 실감할 것이다. 사용자는 화면을 끊김 없이 스크롤하고 싶어 하고, 개발자는 각 화면마다 ExoPlayer를 안정적으로 관리해야 한다. 동시에 메모리 누수 없이 플레이어를 재활용하는 과제까지 따라붙는다.결국 세 가지 조건이 충돌한다.스크롤은 매끄러워야 하고, 영상은 자연스럽게 재생돼야 하며, 앱은 절대 크래시가 나면 안 된다. 문제는 이 세 가지가 서로 얽혀 있다는 점이다. 하나를 잡으면 다른 하나가 삐걱거리는 식으로 개발자를..

Develop/Kotlin 2025.08.15

2024년 회고 (feat. 우아한테크코스)

우아한테크코스로 시작해서.. 우아한테크코스로 끝나다..2024년은 개발자로서 큰 변화를 경험한 한 해였다. 특히, 우아한테크코스 6기에 참여하면서 단순한 기술 학습을 넘어 협업, 문제 해결, 그리고 성장하는 방법을 배울 수 있었다. 이번 회고에서는 한 해 동안 겪었던 주요 경험과 배운 점을 정리하고자 한다."우아한테크코스를 통해 가장 크게 달라진 점은 문제를 해결하는 과정에서 구조와 원칙을 고민하며 코드를 바라보게 되었다는 점이다." 이전에는 기능을 빠르게 구현하고 결과를 내는 데에만 집중했다면, 이제는 “이 구조가 정말 최선일까?”, “왜 이렇게 동작할까?” 같은 질문을 스스로에게 던지며 개발에 임하게 되었다. 단순히 정답을 외우는 방식이 아니라, 눈앞의 문제를 해결하기 위해 설계와 구조를 고민하고 적..

Memoir 2024.11.22

안드로이드에서 일회성 이벤트 처리, 어떻게 할 것인가?

안드로이드 개발을 하다 보면, UI에서 단 한 번만 실행되어야 하는 이벤트를 처리해야 하는 상황이 종종 발생한다.예를 들어, 사용자에게 Toast 메시지를 한 번만 띄우거나, 특정 조건이 충족되었을 때 화면 이동을 한 번만 수행해야 하는 경우가 그렇다.하지만 안드로이드의 생명주기(Lifecycle) 특성과 ViewModel, LiveData의 동작 방식 때문에, 이 단순해 보이는 요구조차 쉽게 구현하기 어렵다.이번 글에서는 안드로이드에서 일회성 이벤트를 처리하는 다양한 방법을 살펴보고, 각각의 장단점을 정리하려고 한다.또한 어떤 상황에서 어떤 방법이 적절한지 함께 고민해보자.1. LiveData일반적으로 LiveData는 데이터가 변경될 때, 활성화된 옵저버에게만 업데이트를 전달한다.하지만 옵저버가 비활..

Develop/Kotlin 2024.10.27

너는 왜 inline Composable이야?

개요Compose를 사용하다 보면, 어떤 Composable은 일반 함수로, 또 어떤 Composable은 inline 함수로 정의된 것을 확인할 수 있다.예를 들어 Box 컴포저블도 다음과 같이 두 가지 형태로 제공된다.@Composablefun Box(modifier: Modifier) { Layout(measurePolicy = EmptyBoxMeasurePolicy, modifier = modifier)}@Composableinline fun Box( modifier: Modifier = Modifier, contentAlignment: Alignment = Alignment.TopStart, propagateMinConstraints: Boolean = false, c..

Develop/Kotlin 2024.10.22

Data Binding 프로퍼티 실종 사건 수사 일지

사건의 발단 🕵️백그라운드 스레드에서 Room DB를 통해 Reservation(예약 정보)이라는 데이터를 받아오고, 해당 데이터를 UI에 렌더링하기 위해 데이터 바인딩을 사용했다. 이 과정에서 BindingAdapter를 활용하여 UI를 업데이트했다.그러나 10번에 3번 꼴로 데이터 바인딩 프로퍼티가 null인 경우가 발생하여 앱이 크래시되는 문제가 있었다. 이러한 문제는 바인딩 프로퍼티가 누락되어 발생한 것으로 보인다. (아마 7번은 운 좋게 데이터 바인딩이 성공된 것으로 보인다)코드는 다음과 같다.// presenter 코드override fun loadReservation(id: Long) { thread { reservationRepository.findReservation(..

Develop/Kotlin 2024.05.12

얼렁뚱땅 Kotlin inline 탐험일지 🧐

탐험 개요고차함수를 활용하기 위해 컬렉션 함수 내부 코드를 보던 중 inline을 발견!inline이 뭐지 코드 줄을 안으로 뭐 하는건가???.. 일단 코틀린에서 제공하는 고차함수 API에서 쓰이는 것으로 확인되니 장점이 있겠지??그래서 inline이 뭔데?코틀린 공식문서를 보면 다음과 같이 설명한다."고차함수를 사용하면, 부가적인 메모리 할당으로 인해 메모리 효율이 안 좋아지고, 함수 호출로 인한 런타임 오버헤드가 발생하게된다. 그러나 람다식을 inline으로 처리하면 이러한 종류의 오버헤드를 제거할 수 있다."런타임 오버헤드가 뭔데?런타임 오버헤드는 프로그램이 실행되는 동안 추가적으로 발생하는 비용이나 부담을 의미한다. 이는 프로그램이 실행되는 동안 발생하는 여러 가지 작업들에 대한 처리 시간이나 자..

Develop/Kotlin 2024.04.06

우아한테크코스 6기 서류, 프리코스, 최종 코딩테스트 / 최종합격

네이버 부스트캠프를 진행하며 우아한테크코스를 지원했다. 그렇다면 여기서 우테코를 왜 지원했는지에 대한 궁금증이 생길 수 있다. 우아한테크코스는 네이버 부스트캠프와 다르게 10개월이라는 긴 시간동안 동료들과 오프라인에서 협업하게 된다. 이는 단기간의 부스트캠프와는 또 다른 매력적인 측면이라고 생각했고, 테코톡을 통해 안드로이드 관련 기술에 대한 흥미로운 이야기를 듣고 싶었다. 그리고 나 또한 테코톡을 통해 사람들에게 기술적 고민을 공유하고 싶다는 욕망이 있었다. 서류 "자기소개서는 문항의 요점을 정확히 파악하여 키워드 위주로 일관되게 작성하면 된다고 생각한다." 흐름이 깨지지 않도록 1~2가지의 키워드를 선택해 써 내려가고, 소제목과 줄바꿈을 잘 활용하여 가독성 높게 작성하는 것이 좋다. 프로그래밍 역량을..

Memoir 2023.12.28