목록분류 전체보기 (62)
계발자 블로그
최근 회사 업무 중 내부 테스트를 위해 번들을 만들어 공유한 상황이었습니다.안드로이드 스튜디오에서 빌드 했을 때 문제가 없었는데 번들로 설치 했을 때이번에 추가한 화면에서 api 호출은 성공하지만 데이터를 못 불러왔습니다. 원인을 찾아보니 R8 난독화 과정에서 데이터 클래스를 지워버렸습니다. 새로 추가된 화면의 데이터 클래스들은 enum + 중첩 모델이 많았는데 따라서 Gson이 리플렉션을 통해 런타임에 데이터 클래스 생성 - 역직렬화하지만 해당 클래스가 코드에서 직접 참조 되지 않음 - R8은 컴파일 타임에 사용 하지 않는 클래스로 판단(제거)Gson이 필드를 찾지 못함 - 데이터 파싱 실패 기존 api 모델들은 자바 코드로 되어 있는데 코드 상에서 명시적으로 접근하고 있어서R8이 사용 중이라 판단 -..
Record란?어느날 자바 프로젝트에서 lombok을 사용해서 dto를 만들고 있었는데안드로이드 스튜디오에서 record로 바꾸지 않겠냐는 경고가 나타났습니다. record는 불변 데이터 모델을 간결하게 정의하기 위해 Java에서 추가된 문법입니다.Java 14에서 처음 소개 되었고 Java 16부터 정식 기능으로 추가 되었습니다. record는 VO(value Object)를 표현하는 새로운 클래스 타입입니다.기존 자바에서는 데이터를 담기 위한 클래스를 만들기 위해 많은 보일러 플레이트 코드가 필요했습니다.그래서 Lombok을 사용하기도 했죠public class Person { private String name; private int age; public Person(String n..
근 몇년간 앱 개발에서 많이 거론 되는 주제중 하나라고 생각했고 개발자 필독 도서에도 있고무엇보다 프로젝트를 처음 생성 할 때,그리고 이 화면이 어떤 기능을 하는지 도저히 알아보기 힘든 프로젝트를 만났을 때클린 아키텍처에 대한 중요성을 떠올리며 책을 구매해서 읽고 짧게 나마 느낀점을 남기려합니다. 개발 서적을 대학생 때 이후로 오랜만에 읽는거라 걱정을 했지만관심있던 주제라 그런지 의외로 술술 읽혀서 재밌게 읽었습니다.소프트웨어는 부드러워야 한다.수많은 앱을 만든 저자가 느낀 아키텍처 규칙은 동일하다더 강력해진 컴퓨터 성능, 새로운 프로그래밍 언어들이 나오지만 규칙은 바뀌지 않는다 하지만 우린 이 규칙을 계속 어겼고 이 경험을 바탕으로 세월이 흘러도 변치 않는 그 규칙 그게 클린 아키텍처라는 철학이고 이 ..
Combine이란?combine은 비동기 작업을 간단하게 처리할 수 있는 Apple의 framework입니다.iOS 13부터 지원하고 있습니다.기존의 비동기 처리 방식들은 여러 방법을 조합해서 개발하다 보니 코드가 복잡해졌지만combine으로 일관된 방식으로 비동기 처리를 할 수 있게 되었습니다. Combine 주요 컴포넌트Publisher데이터를 방출함ex:) NotificationCenter, URLSession, TimeremdSubscriber구독자 Publisher로부터 데이터를 받는 객체ex:) sink, assignOperatorpublisher에게 받은 값을 가공해서 Subscriber에게 제공ex:) map, filter, reduce, collect, combineLatestSubscr..
DiffableDataSourcef란?iOS 13부터 도입된 UICollectionView, UITableView의 데이터 소스를 관리하는 도구입니다. 기존에 UICollectionViewDataSource가 있었는데 왜 등장하였냐 하면위와 같은 문제가 있었습니다.Controller가 데이터를 받아와서, UI에 변경을 알립니다, 그러면 섹션 수가 잘못되어 앱이 종료되는 경우입니다.Controller와 UI가 갖고 있는 데이터가 일치하지 않는 것입니다.(own version of the truth)따라서 reloadData()로 데이터를 동기화시켜주었어야 합니다. reloadData를 사용해도 괜찮지만 애니메이션 없이 나타납니다. 이는 사용자 경험(UX)을 저하시킵니다.반면 DiffableDataSour..
UICollectionView란?iOS에서 리스트 및 그리드뷰를 구현할 수 있는 뷰에는 UITableView와 UICollectionView가 있습니다. UITableView데이터를 싱글 칼럼으로 나열해 주는 뷰UICollectionView데이터를 여러 칼럼 또는 레이아웃을 커스텀해서 표현해주는 뷰(그리드 뷰)그럼 무엇을 사용해야 할까요? UICollectionView가 자유도가 높음UITableView로 구현할 수 있는 부분을 UICollectionView가 커버할 수 있음두개의 구현 난이도 차이가 크지 않음따라서 간단한 데이터를 리스트로 보여줘야 할 경우가 아니라면 UICollectionView를 사용하는게 나은 것 같습니다. UICollectionView 구성요소UICollectionView: 데이..
Class(클래스)와 Struct(구조체)클래스와 구조체는 코드를 추상화 하기 위해 사용됩니다.클래스와 구조체는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있습니다.새로운 사용자 정의 데이터 타입을 만드는 것입니다.- 인스턴스(instance) : 클래스/구조체에서 생성된 객체 (= 구조체와 구조체라는 틀(frame)안에서 찍어낸 내용물)- 프로퍼티(property) : 클래스/구조체 객체(= 인스턴스)에 들어있는 정보, 값- 메서드(method) : 클래스/구조체 객체(= 인스턴스)에 들어있는 함수 선언하기클래스는 class 키워드를, 구조체는 struct 키워드를 이름 앞에 적어 선언합니다.class SomeClass {// 프로퍼티와 메소드를 정의합니다.}struct SomeS..
Tuple튜플은 swift에서 여러 개의 값을 하나의 값으로 묶는 데 사용되는 데이터 구조입니다.튜플은 서로 다른 타입의 값들을 포함할 수 있으며, 값을 순서대로 저장합니다. 튜플의 기본 사용법var tuple: (String, Int, Bool) = ("Kim", 100, true)var tuple2 = ("Kim", 100, 1.5)var person = (name: "Kim", age: 28, job: "president") 위의 코드에서 tuple 변수는 타입을 명시 한 문자열, 정수, boolean형으로 이루어진 값입니다.Tuple 역시 타입추론이 가능하기 때문에 타입을 직접 명시하지 않아도 괜찮습니다.또한 Tuple은 person 변수처럼 정의할 때 각 요소에 이름을 지정할 수 있습니다. 튜플..
Collectioncollection은 여러 값을 하나의 변수나 상수에 담아 관리할 수 있는 데이터 구조입니다.Swift에서는 Array, Dictionary, Set 이 세 가지가 있습니다. Array(배열)순서가 있는 값들의 모음동일한 타입의 값을 저장인덱를 통해 요소에 접근// 비어있는 배열 선언var emptyArray: [Int] = []var anotherEmptyArray = [Int]() // 타입 추론을 이용한 비어있는 배열 선언// 초기값이 있는 배열 선언var numbers: [Int] = [1, 2, 3, 4, 5]var names = ["Kim", "Lee", "Son"] // 타입 추론을 이용한 배열 선언 Dictionary키와 값의 형태로 담아 놓은 모음각 키는 고유함키를 통..
Flow란?코루틴 Flow는 Kotlin에서 비동기적인 연속적인 데이터 스트림을 처리하기 위한 라이브러리입니다. 이것은 비동기적으로 값을 생성하고 소비하는 데 사용되며, 연속적인 데이터 스트림을 표현할 수 있는 코루틴 유형입니다. 비동기적으로 작업을 처리하는 코루틴에서 Suspend 함수를 사용하면작업이 모두 완료된 후에 단일 값만을 반환받을 수 있습니다. 하지만 중간중간 진행되는 코루틴 작업 중에 갱신되는 값까지 반환받을 수 있다면로직 업데이트를 더 촘촘히 수행할 수 있습니다Flow는 이런 요구를 충족하기 위해 만들어진 타입입니다. Flow에서 데이터 스트림에 관여하는 주체는 Producer(생산자), Intermediary(중간 연산자), Consumer(소비자) 3개가 있습니다. Producer가..