전체 글 230

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

[안드로이드] ViewPager2

프로젝트를 하다가 간만에 Viewpager 를 쓸일이 생겼다. 뷰페이저 자체가 예전부터 있었다보니 여러가지 방법으로 구현하는 방식이 있는데 이번에 나는 ViewPager2 와 FragmentStateAdapter 를 이용해서 만들어 보기로 했다. 먼저 ViewPager 가 지원중단되고 ViewPager2 로 몇년전에 넘어가게 됐는데 알아보는김에 왜 바뀌게 됐는지도 한번 알아보자. 대표적인 ViewPager 의 문제는 1. 리사이클러뷰에 뷰페이저를 집어 넣을때 발생한다. 뷰페이저는 PagerAdapter 기반으로 구성됐는데 스크롤을 할때마다 instantiateltem() 과 destroyItem() 메소드가 호출되면서 스크롤이 버벅거리는 문제가 있었다. * instantiateltem() : 화면에 표시..

Android/Android UI 2023.02.01

[이펙티브 코틀린] 5. 예외를 활용해 코드에 제한을 걸어라

확실히 어떻게 동작해야하는 코드가 있으면 예외를 활용해서 제약을 걸어주는게 좋을때가 있다. 코틀린에는 대표적으로 1. require : 아규먼트와 관련된 예측을 정의할때 상용하는 방법 숫자를 아규먼트로 받아서 팩토리얼을 계산하면 양의 정수만 받아야할때 좌표를 아규먼트로 받아서 클러스터를 찾을 때 비엉 있지 않은 좌표 목록을 사용할때 사용자로부터 이메일 주소를 입력받을 때 값이 입력됐는지, 이메일 형식이 바른지 확인할때 2. check : 상태와 관련된 예측을 정의할때 사용하는 방법 어떤 객체가 미리 초기화되어 있으어만 처리가 되게 하고 싶은 함수에 사용 사용자가 로그인 했을 때만 처리를 하게 하고 싶은 함수에 사용 객체를 사용할 수 있는 시점에 사용하고 싶은 함수인지 체크할때 사용 일반적으로 requir..

Effective Kotiln 2023.01.18

[이펙티브 코틀린] 4. inferred 타입으로 리턴하지 말라

코틀린은 타입추론(type inference) 를 제공한다. 자바 10부터는 코틀린처럼 타입추론을 제공하지만 코틀린에 비해서는 제약이 많다. 아무튼 타입 추론을 사용할때 주의할 점들이 있는데 할당 할때 inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다는 것을 기억해야 한다. 일반적으로는 아래와 같이 open class Drink class Water: Drink() fun main() { var drink = Water() drink = Drink() // 타입에러 } 하지만 이건 open class Drink class Water: Drink() fun main() { var drink : Drink = Water() // 타입 명시 drink = Drink() } 타입 명시를 해..

Effective Kotiln 2023.01.15

splahScreen 안드로이드 12 버전에 적용하기

최근 Dev6 프로젝트를 새로 개발하면 스플래시 스크린을 만들일이 생겼다. 이번에 스플래시 스크린을 만들면서 안드로이드 12 부터 바뀐 스플래시 스크린을 적용해보며 정리하는 글이다. 먼저 라이브러리를 추가하자. dependencies { implementation 'androidx.core:core-splashscreen:1.0.0-beta01' } 위 처럼 스플래시 스크린 라이브러리를 import 해준다. 이 라이브러리를 사용하려면 minSdk 는 21이상 , targetSdk 는 31 이니 참고하자. themes.xml 에 스플래시 스크린 테마를 추가하자. 이렇게만 보여주면 뭐가 무슨 옵션인지 찾아보기 귀찮으니 몇개 적어보자. windowSplashScreenBackground: splashscree..

Android/Android UI 2023.01.14

[이펙티브 코틀린] 3. 최대한 플랫폼 타입을 사용하지 마라

플랫폼 타입? 다른 프로그래밍 언어에서 와서 null 가능 여부를 알 수 없는 타입을 플랫폼 타입이라고 한다. 플랫폼 타입을 사용하면 해당 부분도 null 에러가 발생할 위험이 있으며 해당 코드를 사용하는 곳까지 영향을 줄 수 있다. 예를 들면 아래와 같은 상황이 있다. 안드로이드 개발자가 자바 코드로 코드를 작성하다가 코틀린으로 변경해서 코드를 이어서 작성한다고 가정해보자. // 자바 public String getValue() { return null; } // 코틀린 fun statedType() { val value: String = JavaClass().value // NPE // ... println(value.length) } fun platformType() { val value = Jav..

Effective Kotiln 2023.01.13