전체 글

Never stop acting like the new one on the team
Daily & Thinking

현실 세상의 TDD 를 보면서 개인적인 생각 정리

1부 기초 좋은 코드? * No silver bullet (trade-off) * 협업 가능한 코드 * 서로의 기준을 충족 하는 코드 당시 개발자의 지식(외부 + 내부 도움)내의 최선의 선택이였고, 비즈니스를 잘 수행했다면 좋은 코드고 이를 개선하는 코드를 작성하는 것은 멋진 경험이라고 생각합니다. 신기능도 즐겁지만, 당시에 코드 작성자가 어떤 생각이였고, 이를 추적하는 과정도 즐거움의 과정 코드명세? 문제를 정의하고(Input), 해결(Output) 하기 위한 명세 프로그래머는 정제된 기능 명세를 아키텍처와 코드로 번역 개인적으로 조엘 온 소프트웨어 책의 손 쉬운 기능 명세 작성법이 큰 도움이 되는 것 같음. 코딩의 시간이 길어질수록 비용은 오름(개발자에 따라 선형적, 지수적일 수도 있음) => 따라서..

Android/Today I Learned

서버 디펜던시 없이 네트워크 작업 캐시 구현하기(feat.OkHttp)

해당 글은 주관적인 의견이 많이 들어가고, 잘못된 내용이 있을 수도 있습니다 :) 코드는 아래 링크로 첨부해두겠습니다 이번 주제는 서버에서 etag, last-modified 등의 캐시 처리를 지원해주지 않을 때, 안드로이드에서 간단히 처리할 수 있는 방법에 대해 알아보려고 합니다. *서버에서 캐시 처리를 위한 정보(Cache-Control) 를 잘 내려준다면, OkHttp 를 이용하여 CacheDirectory 만 생성해주면 알아서 처리해주기 때문에 해당 포스트를 읽지 않아도 됩니다. 먼저 안드로이드에서 캐시하면 가장 바로 떠오르는 것중 하나가 Room, sqlite, realm 과 같은 로컬 데이터 베이스를 사용하는 것 입니다. 해당 방식의 처리도 좋지만, Table 과 Entity 를 정의해야 한다..

Kotlin & Java

동시성 작업

스레드 사이에서 공유 상태는 어떤식으로 관리 될 수 있을까요 ? 먼저 문제가 있는 코드를 한번 보고, 어떤식으로 해결할 수 있을지 확인해보겠습니다. 해당 코드를 돌려보면? 성공 할 때도 있지만, 실패하는 경우도 있습니다. while (balance.getBalance() > 0) 잔고가 0 보다 큰 경우에만 동작할 것이라 예상했지만, 우리의 예상을 깨고 마이너스 잔고가 보입니다.(여담이지만 코드만 보고 동시성 문제가 있을것이라 판단하는 것도 꽤 어려운 일이라고 생각합니다. 경우에 따라서는 제대로 동작하는 코드 처럼 보일경우도 있으니까요) 가시성, 원자성 문제를 모두 해결해야, 동시성(MultiThreading)으로 부터 자유로워질 수 있습니다. 해결에 주목적을 가지고 있기 때문에, 간단하게 짚고만 넘어가..

Android/Interview Question

Blocking, NonBlocking, Sync, Async 이해하기 좋은 아티클

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/#about Blocking-NonBlocking-Synchronous-Asynchronous 꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면 homoefficio.github.io 본문의 정리를 인용하면, Blocking/NonBlocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사 바로 리턴하지 않으면 Blocking 바로 리턴하면 NonBlocking Synchronous/Asynchronous는 ..

Android/Today I Learned

Material library 1.5.0 로 올리니 크래시가?!

해당 글에서는 AOSP 코드와 Material 코드를 보며 어떤식으로 에러를 수정하였는지 전달하고, 혹시나 AOSP 코드 등을 확인해야한다면 어떤식으로 접근할지 도움을 드리기 위해 작성하는 글입니다. 배포를 하기 위해 새로 개발된 Feature 들을 머지하고 QA 를 하던 도중 아래와 같은 에러가 발생하였습니다. MaterialCardView 에서 발생하고 있었고, 특징으로는 Android 9 이하의 버전들에서 발생하고 있었습니다. 먼저 사용하는 쪽의 코드를 간략하게 확인하였습니다. (checked 에 들어가는 값은 viewModel 을 통해 넣어주고 있고 회사 코드가 드러날 수 있어 제거하였습니다) 이전에 문제 없이 잘 동작했기 때문에 한눈에 어떤 것이 문제 인지 알수가 없었습니다. 또한 코드가 변경된..

Android/Today I Learned

Compose 버튼 사이즈 관련 Tips

Button(IconButton, RadioButton, Switch....) 대부분의 Component 에서 minimumTouchTargetSize() 함수가 내부에서 처리되는 것을 볼 수 있습니다. 잠시 함수를 보면, 48 dp 보다 작은 경우 Component 자체에 Padding 이 들어가게 됩니다(ContentPadding 을 0 으로 줘도 Component 밖으로 Padding 이 생깁니다). 따라서 48 보다 더 작은 값을 넣고 싶은 경우, 내부에 코드들을 모두 복사해서 minimumTouchTargetSize 함수를 제거해줘야 합니다. 혹은 아래와 같이 minimumTouchTargetEnforcement 를 false 로 변경하여 처리할 수도 있습니다. CompositionLocalPr..

Android/Development Tips

2.4.1 이상 버전에서 Navigation Component 사용할 때 주의점

관련 문구 https://medium.com/androiddevelopers/navigation-multiple-back-stacks-6c67ba41952f Navigation: Multiple back stacks Welcome to another article in the second MAD Skills series on Navigation! In this article we’ll take a look at a highly requested feature… medium.com 관련 레포지토리 (NavigationAdvancedSample) https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSa..

Android/Development Tips

DataStore Protocol Buffer 사용시 Tips

회사에서 필요해서 사용한 후기를 간단하게 적어둡니다. 불편했던 점 1. 사용시에 .proto 파일이 변경되면 빌드가 필요했습니다. 2. Map 같은 구조가 아니기 때문에 여러개 필요하다면, DataStore 객체를 만들어 낼 때, FileName 을 변경하여 처리했습니다.(물론 같은 이름으로 동시에 열수 없도록 처리되어 있습니다) 장점 1. 사용하기가 편합니다. 2. 빌드 이후 Generate 되는 코드를 보며 코드를 작성하면 되서 큰 어려움이 없었습니다. 아래와 같은 데이터 형식을 저장한다고 하면 val foodStores = listOf(FoodStore(....), FoodStore(....), FoodStore(....) ....) data class FoodStore( val name: Stri..

Android/Today I Learned

Compose Navigation - viewmodel 사용할 때 주의할 점

회사 선임분에게 감사의 인사를 최근에 Compose 에서 viewModel 을 파라미터로 넘겨서 사용할 때, 편의를 위해 compositionLocalOf 메서드를 사용하여 같은 Composable Scope 안에서는 currentViewModel() 과 같이 호출하여 당시에 제공하는 Composable Scope 에 맞는 ViewModelStoreOwner 를 넣어주고 viewModel 을 사용할 수 있도록 구성하여 사용하고 있습니다. compositionLocalOf 를 사용할 때, Theme 등의 전파의 개념에만 사용하는 것을 구글 가이드에서는 추천하고 있기 때문에, Interface 형식(AAC 의 의존성도 제거할겸)으로 만들어 사용하고 있습니다. 별문제 없이 사용하다가, 특정 상황에서 curre..

Nanamare
TEAM > SELF