분류 전체보기 235

이직 후 근황

영상 플랫폼에서 일한다는건 꽤나 앱개발자로서 흥미롭다. 간단하게 영상 출력해보는 정도로 써본 exoplayer 가 전부였는데 컨버팅, 코덱, ffmpeg , trim , crop , 카메라 등등... 여러가지를 접해보고 있다. 여러 가지 프로젝트를 동시에 하는거보다 하나의 서비스에 몰입해서 애정을 가지고 개발하고 있는 점도 즐거움중에 하나다. 이미 라이브되고 있는 서비스다보니 업데이트 템포를 쫒아가랴 기존의 많은 코드들을 이해하고 익히는데 시간이 좀 걸렸지만 이제는 확실히 적응이 되어가는거 같다. 아직도 공부가 부족해서 헤매는 부분이 있긴하지만 어찌저찌 도움 받으며 해결해나가고 있다. 사이드 프로젝트 이야기를 좀 하자면. 이전에 하던 사이드 프로젝트는 이유는 모르겠지만 어째선가.. 팀원들이 다들 바쁘기도..

잡담 2023.11.16

라이브러리 배포 후 적용을 하려는데 NoClassDefFoundError ?

아마 라이브러리 배포를 처음 해봐서 바보 같은 실수를 한거 같다. aar 로 라이브러리 배포가 됐는데 데모앱에서는 잘됐는데 왜 실제 프로젝트에서는 안되는거야? 하면서 NoClassDefFoundError 를 만났는데 이는 aar 은 라이브러리에 작성된 리소스는 불러오지만 라이브러리에 종속되어있는 다른 라이브러리는 불러오지 않기 때문. 라이브러리 내부에는 적용되어있지만 실 프로젝트에 없는 라이브러리를 적용시켜주었더니 해결. 쓰고보니 뭔가.. 예전에 이런 글을 봤던거 같기도 하네

Android 2023.11.16

첫 퇴사

퇴사를 했다. 2년 반의 첫 회사생활의 마침표를 찍었다. 이런 저런 일도 많았고 많은 사람들을 만나고 또 헤어지길 반복하다가 이제는 내가 떠나가는 날이 왔다. 언젠가 이런 날이 오지 않을까 막연한 생각이였지만 막상하고나니 기분이 너무 좋다거나 후련하다거나 그렇지만은 않은거 같다. 첫 회사이니만큼 애정도 많았고 다니는 동안 이 회사가 잘되길 진심으로 바랬던 것 같다. 불만이 없었던건 아니지만 그만큼 좋은 점도 많았으니 잘 다닐 수 있었다. 사교성이 좋지 않은 나지만 정말 다행히 친근하게 다가와주는 좋은 사람들 덕분에 행복했던 회사 생활이였다. 이젠 내가 그동안 해온 것들이 회사의 자산이 되어 도움이 되어 의미있게 쓰이길 바란다. 많은 사람들이 고생했다는 인사와 앞으로를 응원해주고 격려해줬다. 모두에게 고맙..

잡담 2023.08.30

코루틴에 관한 50가지 질문과 답 - 1

1. Android의 Kotlin 코루틴은 무엇이며 기존 스레딩과 어떻게 다릅니까? 안드로이드에서 Kotlin 코루틴은 스레드와 다릅니다. 코루틴은 사용자 공간에서 구현되며 적은 수의 기본 스레드에 다중화됩니다. 그러므로 스레드를 만들고 파괴하는 오버헤드 없이 매우 가벼운 방식으로 코루틴을 일시 중지하고 다시 시작할 수 있습니다. Kotlin 에서 코루틴은 경량의 비차단 실행 스레드입니다. 즉, 스레드와 달리 코루틴은 사용자 공간에서 구현되며, 매우 가벼운 방식으로 일시 중지하고 다시 시작할 수 있습니다. 이를 통해 오버헤드 없이 많은 수의 코루틴을 실행할 수 있습니다. 2. 코루틴 맥락에서 "suspending functions"의 개념을 설명할 수 있습니까? 코루틴 맥락에서 suspending fun..

Android/Coroutine 2023.07.10

eventFlow 방식으로 이벤트를 처리하고 있을 때 든 생각

보통 sealed class 를 이용해서 각 이벤트마다 따로 묶어서 기능의 성격에 맞게 구분하는데 한 액티비티에 프래그먼트가 3개가 들어있는 화면이 있다고 가정하자 그리고 액티비티의 viewModel 을 모두가 공유하고 있는 상황일때 하나의 event flow 만을 이용해서 처리하면 각 프래그먼트에서 같은 flow 를 콜렉트 하는 상황이 생긴다. 이러면 다른 이벤트를 처리하기전 기존의 flow 를 해제해주지 않으면 한 곳에서 진행중인 collect 가 다른 프래그먼트로 가야할 데이터를 계속 가져가서 원하는 화면에서 원하는대로 동작하지 않는 상황이 생긴다. 그래서 내린 결론은 event flow 는 한 액티비티나 한 프래그먼트에서 즉, View 를 기준으로 같이 쓰이는 애들끼리 묶어서 따로 만들어주는게 관..

Android 2023.07.05

MockK 를 사용해서 테스트 코드를 적어보자

휴일이지만 일 때문에 어쩌다보니 일 아닌 일을 하고 있는데 시간도 많이 남고해서 미뤄놨던 테스트 코드나 적어볼까 하고 뒤적뒤적 하는중 코틀린용 mock 테스트 라이브러리 mockK를 발견하고 테스트 코드를 끄적여봤다. 기존에 자바 진영에서 많이 쓰던 mockito 가 대표적인 mock 라이브러리지만 mockK도 코틀린에 좀 더 적합한 방식을 제공하는것뿐 전체적인 매커니즘은 크게 다르지 않았다. 아 참, 이 글을 읽으러 누추한 블로그까지 찾아오셨다면 mock 에 대해서 알고 있는 분일거라 생각하지만 mock 은 모의객체를 의미한다. 풀어서 말하면 실제로 내부 코드들이 전부 작성되어 작동하는게 아닌 껍데기뿐인 객체라는 말이다. 이런건 왜 필요할까? 귀찮고 불편해서다. 테스트 코드를 작성하다보면 안드로이드의 ..

Android 2023.05.14

Jetpack Compose 에서 Lifecycle 관리하기

컴포즈를 사용하면 기존 Lifecycle 을 이용할때랑 같은 방식으로 작동하지가 않는다. 조금 다른 방식을 사용해야하는데 컴포즈에서 말하는 부수효과에 대한 이해가 필요하다. https://developer.android.com/jetpack/compose/side-effects?hl=ko Compose의 부수 효과 | Jetpack Compose | Android Developers Compose의 부수 효과 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 부수 효과는 구성 가능한 함수의 범위 밖에서 발생하는 앱 상태에 관한 변경사항입니다. developer.android.com 위 링크에 DisposableEffect 에 대해 예시를 들때 아래 코드와 비슷한 예제가 나온다..

android 12 블루투스 대응

예전에 작성된 코드를 다시 유지보수하는 작업이 필요했다. 이제는 마켓에 앱을 올리려면 targetsdk 가 31 이상이 되도록 강제되는데 이때 버전을 올리면서 블루투스 권한부여에 문제가 생겼고 라는 퍼미션을 추가하여 해결했다. 매니페스트 파일에 위 권한들을 추가해주고 블루투스 권한을 요청하는 시점에서 val permissionList = mutableListOf() for (permission in permissions) { permissionList.add(permission) } ActivityCompat.requestPermissions(context as Activity, permissionList.toTypedArray(), 200) 위 코드처럼 요청해줬다. 코드 일부만 가져와서 적은거라 제대로..

Android 2023.04.06

솔리티디 투표 컨트렉트

pragma solidity >=0.8.2 bool) Voted; //계약자의 주소를 특정해서 bool 로 투표했는지 안했는지를 체크하는 mapping //Evnet (브로드 캐스트) event AddCandidator(string name); event UpVote(string candidator, uint upVote); event FinshVote(bool live); event Voting(address owner); //modifier 지정자 컨트렉트 사람지정 modifier onlyOwner{ // 컨트랙트가 생성될때 constructor 서 알아오는 //컨트랙트 생성자의 주소인 owner 변수와 일치하는지 체크하는 modifier require(msg.sender == owner); _; /..

블록체인 2023.03.18

[이펙티브 코틀린] 7. 결과 부족이 발생할 경우 null과 Failure를 사용하라

우리는 함수를 작성하다보면 결과를 만들어 낼 수 없을 때가(예외) 있다. 대표적으로 아래와 같은 상황이 생길 수 있다. 서버로부터 데이터를 받을때 인터넷 문제로 받아오지 못한 경우 조건에 맞는 요소들중 첫번쨰 요소를 가져오려고 했는데 조건에 맞는 요소가 하나도 없는 경우 ex) index 에러 json 파싱을 하려고 했는데 형식이 맞지 않아서 발생하는 오류 이런 상황을 처리할때 두 가지 매커니즘을 활용 할 수 있다. 제목처럼 null이나 Failure(라는 이름의 sealed 클래스)를 사용해서 처리 예외를 throw 두가지에는 중요한 차이가 있다. 예외를 throw 하는거부터 보자. 일단 예외는 정보를 전달하는 방법으로 사용해서는 안된다. 예외는 잘못된 특별한 상황을 나타낼때 사용해야한다. 그 이유는 ..

Effective Kotiln 2023.03.01