XELP
xelp

전체 글

iOS, Android Developer
Developer/iOS

CoreData

Coredata란 Coredata는 Apple Framework의 일종이다. 데이터를 저장함에 있어 영구적인 데이터를 저장할 수 있다. UserDefaults가 간단한 데이터를 저장한다면, Coredata는 대용량의 데이터를 저장하는 데에 적합하다. 그렇다고 하여 Database인가? 는 또 아니다. Coredata가 할 수 있는 여러 기능 중 Persistence가 RDBMS인 SQLite로 지원된다. 정확하게는, Coredata는 앱의 모델 계층이며 객체 그래프를 관리하는 Framework이다. 데이터 저장을 위한 Coredata 사용법 Coredata를 파일로 추가하고 Model을 추가한다. Entity는 마치 테이블명처럼, Attribute를 각각의 Column으로 생각하면 편하다. 이후 우측 퀵..

Developer/iOS

UICollectionView FlowLayout 좌측정렬

CollectionView를 쓰다보면, 보통은 FlowLayout을 통해 정렬에 관련한 코드를 작성하게 된다. 다만 이 경우 아이템이 1개인 경우에 대해 Align이 되지 않는 문제가 존재하는데 이를 해결하는 클래스를 작성해서 사용하도록 한다. LeftAlignFlowLayout 위의 커스텀 FlowLayout을 추가해준다. Example 간단한 사용법은 위와 같다.

IT 뉴스

안드로이드 14 개발자 프리뷰 1이 공개되었습니다.

안드로이드 14 다시 개발자들에게 중요한 날인 안드로이드 14의 프리뷰가 공개되었습니다. 미리 구글에서 언질을 준 내용도 있고 새로이 추가된 부분도 있는데, 개발적인 면에서 수정된 부분을 주로 적어봤습니다. 핵심 기능 정확한 알람 (Exact Alarm) 사용자가 의도한 정확한 타이밍에 발생하는 정확한 알람 기능은 새로운 권한(SCHEDULE_EXACT_ALARM)이 요구되며 기본적으로 OS에서 거부됩니다. 캐시된 상태에서 브로드캐스트 대기 안드로이드 14에서는 앱이 캐싱된 상태로 대기된 상태에서 브로드캐스트 역시 대기하게 됩니다. 앱이 다시 포어그라운드로 진입할 때 모든 브로드캐스트가 전달됩니다. 보안 APK 사이드로드에 관한 최소 API 레벨 제한 안드로이드 14부터는 targetSDKversion이..

취미생활

보금자리에 HomeKit을 구축하기

IoT의 세계로 새 집으로 이사해온지 몇 년이 지났다. 처음엔 그래도 큰 집이 좋다고 생각해서 큰 집을 골랐고, 실제로도 내 선택은 여전히 맞았다고 생각하지만.. 의외로 집의 관리가 안되는 부분이 은근히 있었다. 예를들면 전기장판을 켜고 출근을 한다던가 하는 것의 문제. 더군다나 개발자로서 일을 하며 집안에 컴퓨터가 3,4대가 생기면서는 더더욱 그렇다. 그래서 IoT의 시대가 오고나서는 Google Home에 맞춰 집안을 컨트롤하고 있다가, iOS개발에 힘을 더 쏟게 되고 하면서 집안에 온통 사과밭이 이루어지자 나는 Apple Homekit으로의 이사를 준비했다. 다만, Google home을 구축하던 때와는 다른 문제가 많았다. 첫번째로, 국내에서 Homekit과 연동되는 제품군이 매우 적다는 것. 설..

Developer/iOS

Stackview in ScrollView

사용처 iOS StackView는 구성에 따라 가로 또는 세로로 View를 쌓아주는 좋은 녀석이지만, 같은 사이즈로 뷰를 연속적으로 쌓기에는 그리 좋은 View가 아니기도 하다. 특히 Scroll이 되지 않는 다는 점은 꽤나 아쉬운 점인데, StackView를 ScrollView로 감싸면 이 문제를 해결 할 수 있다. 생각보다 자주 쓰는 방식이라 이것을 포스팅해둔다. ScrollView 먼저 스크롤 뷰를 추가하고, Constraints를 지정하여 뷰의 외부 사이즈를 잡는다. 보통은 전체 영역을 잡을 테니 이런 식으로. StackView StackView를 추가한다. ScrollView는 기본적으로 Contents layout Guide와 Frame layout Guide가 있다. StackView가 전체..

Developer/iOS

Alamofire + RxSwift

RxSwift를 공부하면서, Alamofire와 RxSwift의 결합 개인 라이브러리를 개발하기로 마음먹었다. RxAlamofire라는 좋은 라이브러리가 따로 존재하는 모양이지만, 개인적으로 개발한 라이브러리가 존재함과 동시에 기존 라이브러리와의 통합을 모색했다. (아마 이렇게 하는 것이 나에게 있어서도 더 낫지 않을까..) 기존 라이브러리의 형태 기존에는 위와같은 형태로 개발에 사용해왔다. Request에 필요한 정보를 가진 Requester class와, Request 관련 옵션을 포함한 BaseRequestOption, 그리고 성공과 실패에 사용할 Closure를 따로 마련했다. 이 Closure 형식을 제거하고 RxSwift를 도입해보기로 했다. RxSwift를 도입해보자 먼저 init에서 바로 ..

Developer/iOS

Array <-> Dictionary

// Array -> Dictionary var pgrInfoSplitOrigin = Dictionary(grouping: data.pgrInfo!, by: { $0.pgrSetSno }) var pgrInfoSplit = pgrInfoSplitOrigin.sorted(by: { (first, second) in return first.value.first!.pgrSetSno! Array var stackData : [[VO.PgrInfo]] = pgrInfoSplit.map({$0.value})

Developer/RxJava or RxKotlin

Observable

- Hot Observable - 마치 라이브 방송을 하듯, 발행 이후 모든 구독자들에게 같은 값을 뿌린다. val src: ConnectableObservable = Observable.interval(1, TimeUnit.SECONDS) .publish() src.connect() src.subscribe { value: Any -> println("First: $value") } Thread.sleep(3000) src.subscribe { value: Any -> println("Second: $value") } Thread.sleep(3000) ConnectqableObservable로 Hot Observable을 생성하여 publish한다. 이후 connect()함수를 작성해야 발행이 시작된다..

Developer/Android

Collection Reduce, Fold

val numbers = listOf(7, 4, 8, 1, 9) val sum = numbers.reduce { total, num -> total + num } println("reduced: $sum") // reduced: 29 val sumFromTen = numbers.fold(10) { total, num -> total + num } println("folded: $sumFromTen") // folded: 39 컬렉션 내의 모든 값을 모으는 함수들이다. reduce : 리스트의 첫번째 항목부터 하나씩 불러내 함수를 통해 값을 변화시킨다. fold : 처음에 넣은 값을 초기값으로 시작한다.

Developer/Android

Clean Architecture

클린 아키텍쳐란 프로그램 개발 시 3가지의 계층 (Enitity, UseCase, External Interfaces) 로 구분하며, 내부의 계층일 수록 외부의 계층과 단절되어야 있음을 뜻한다. 즉, 외부 인터페이스 내에 존재하는 DB, UI등은 Enitity에서 알아채선 안된다. 최대한 의존성을 낮추는 것이 이 패턴의 핵심이다. 구성요소 Entity는 주로 정책에 관련된 정보를 가지며, 가장 기본적인 데이터를 가지거나 이 값들을 계산하는 로직을 가진다. DTO도 이 계층에 포함된다. UseCase는 단순 실행 가능 작업을 가진다. Android의 경우에서는 UI와 상호작용하여 Repository 패턴을 통해 데이터를 가져오는 것을 뜻한다. getTestDataUseCase 등의 메소드 이름을 통해 기능..