본문 바로가기

분류 전체보기

(93)
Compose 프로젝트 일부 MVI로 마이그레이션 지금까지 MVI를 간단한 스톱워치로 알아봤는데, 스톱워치 기능 자체가 간단하다보니 MVI의 장점을 크게 느끼지 못했다. 전에 팀 프로젝트로 진행했던 Compose 프로젝트 일부를 Orbit 라이브러리를 이용하여 MVI를 적용해보고, 전과 후를 비교하여 어떤 차이가 있는지 확인해보고자 했다. MVI를 적용할 부분은 SavePhotoScreen으로, 사진을 찍고 추가적인 정보(라벨, 설명 등)를 입력 후 저장하는 기능을 담당한다.https://github.com/boostcampwm-2024/and04-Nature-Album/blob/dev/app/src/main/java/com/and04/naturealbum/ui/add/savephoto/SavePhotoScreen.kt and04-Nature-Album..
MVI 라이브러리 - Orbit with Compose MVI 첫 포스팅에서는 라이브러리 없이 MVI 패턴을 구현해보았다.https://snaildeveloper.tistory.com/140 MVI 패턴스톱워치는 시간과 시작/종료 버튼, 리셋 버튼이 있다.사용자가 시작 버튼을 누르면 시간이 올라가며, 종료 버튼을 누르면 시간이 멈추게 되고, 리셋 버튼을 누른다면 시간이 0으로 초기화 된다.snaildeveloper.tistory.com Orbit 라이브러리를 사용하면 보다 쉽게 MVI 패턴을 구현할 수 있다.https://github.com/orbit-mvi/orbit-mvi GitHub - orbit-mvi/orbit-mvi: A simple MVI framework for Kotlin Multiplatform and AndroidA simple MVI f..
MVI 패턴 스톱워치는 시간과 시작/종료 버튼, 리셋 버튼이 있다.사용자가 시작 버튼을 누르면 시간이 올라가며, 종료 버튼을 누르면 시간이 멈추게 되고, 리셋 버튼을 누른다면 시간이 0으로 초기화 된다. 1. 사용자가 버튼을 클릭함으로써 이벤트가 발생2. 이벤트마다 시간이 흘러가거나, 멈추거나, 초기화가 되는 상태가 생성3. 이 상태를 View에 알려줘 사용자는 스톱워치의 기능을 사용할 수 있게 된다. MVI의 기본 구조는 발생하는 이벤트를 가지고 상태를 관리하고 상태에 따라 UI를 단방향으로 처리하는 것이다.Model : Intent로 부터 전달 받은 이벤트를 처리하여 만든 상태를 View에게 전달View : Model에서 전달 받은 상태를 UI에 적용Intent : View에서 발생한 사용자의 액션, 동작을 Mo..
[Compose] Composable 함수의 데이터 관리 Compose는 Composable 함수를 기반으로 UI를 구성한다. UI를 구성하는 과정에서 다양한 데이터를 저장하고 사용하지만, Composable 함수의 특성 상 기존처럼 변수를 선언한다면 원하는 결과 값을 얻을 수 없다. Recomposition이 일어나면 해당 Composable 함수를 다시 재실행하여 기존의 데이터가 다 초기화되기 때문이다.또한 UI와 직접적으로 연관이 있는 데이터의 경우 값이 변경됨에 따라 Recomposition이 일어나야 하지만 기존의 변수를 사용한다면 값의 변경을 알아차릴 수 없기 때문에 Recomposition 자체가 일어나지 않는다. 그렇다면 Composable 함수에서는 데이터를 어떻게 선언해야 할까?StateComposable 함수가 Recomposition이 되..
Side Effect Compose에서 SideEffect는 Composable 함수 내에서 UI와 별개로 추가적인 작업이 필요한 경우에 사용하는 함수로,데이터 업데이트, 네트워크 통신 등 Composable 함수 외적인 작업들을 예측 가능한 방식으로 제어하기 위해 사용한다.SideEffectLaunchedEffectDisposableEffect만일 SideEffect가 아닌 Composable 함수 내에 그냥 작성을 하게 된다면 Recomposable 될 때마다 다시 실행하지 않아도 되는 코드들이 모두 실행되어 불필요한 자원이 소모될 것이다.따라서 특정 상황에서만 작업이 필요한 경우, 한 번만 작업하면 되는 경우 또는 UI와 별개의 작업이 필요한 경우 등 다양한 작업을 UI와 분리하여 성능과 가독성을 높이고 유지보수를 더욱..
Recomposition(2) - 사용 예시 Compose에서 Recomposition이 발생하는 이유는 다음과 같다.관찰 중인 State가 변경되는 경우Composable 함수의 매개 변수의 값이 변경되는 경우1. State의 변경Compose를 사용하다보면 데이터를 저장하기 위해 State를 사용한다.State의 사용 방법에는 두 가지가 있는데 다음과 같다.val test: MutableState = remember{ mutableStateOf(0) }val test2: Int by remember { mutableIntStateOf(0) } assign의 경우 MutableState 객체를 반환하고, by의 경우 State 객체의 value를 반환한다.@Composablefun ParentCompose(modifier: Modifier = M..
[Coil] 이미지 Preload 이전에 진행했던 프로젝트에서 이미지를 다뤘는데, 지도에서 친구를 선택하면 친구가 찍은 사진이 지도에 표시되는 기능이었다. 다만 네트워크에서 이미지를 가져오려면 위와 같이 2~3초의 로딩이 소요되었다. 네트워크에서 이미지를 가져오는 작업은 많은 리소스가 필요하다. 매번 이미지를 네트워크에서 불러오게 된다면 많은 리소스 사용으로 인해 성능 또한 그만큼 떨어지게 될 것이다.때문에 Coil과 Glide 같은 이미지 라이브러리에서는 네트워크에서 가져오는 작업을 최대한 줄이고자 캐싱을 이용한다.캐싱Coil에서 이미지를 불러올 때 처음으로 메모리 캐시에서 이미지를 찾고, 없으면 디스크 그 다음 네트워크 요청을 수행한다. 실제 Coil로 이미지 로드할 때 Log를 출력해보면ImageRequest.Builder(cont..
정규화 Anomaly1. 갱신 이상IdNameAgeSubject1홍길동20수학2홍길동20과학Update School Set Age = 23 Where Id = 2 위와 같은 상황에서 ID 2번의 나이를 23로 바꾸면 홍길동의 나이가 20살인지 25살인지 알 수 없게 된다.2. 삽입 이상IdNameAgeSubject1홍길동20수학2홍길동20과학3고길동30NULL새로운 학생이 추가될 경우, 수강하는 과목이 없더라도 무엇이든 넣어야 삽입이 가능하다.3. 삭제 이상IdNameAgeSubject1홍길동20수학2고길동30과학홍길동을 삭제하면 수학이라는 과목의 정보도 같이 사라지게 된다.정규화위와 같은 이상 현상 및 데이터 중복을 최소화 하기 위해 일련의 normal forms(NF)에 따라 Relation DB를 구성하는..
데이터베이스 체계화 된 데이터의 집합데이터를 구조화하여 효율적으로 처리할 수 있도록 관리 스키마(Schema)데이터 모델을 기반으로 데이터베이스의 구조를 기술한 것External Schema특정 유저들이 필요로 하는 데이터만 표현그 외의 필요 없는 데이터들은 숨김사용 언어: VDLConceptual Schema전체 DB의 구조를 기술물리적인 저장 구조에 관한 내용은 숨김사용 언어: DDLInternal Schema물리적으로 데이터가 어떻게 표현되는지사용 언어: SDLVDL(View Definition Language) : External Schema를 정의하기 위해 사용되는 언어 대부분의 DBMS에서는 DDL이 VDL 역할까지 수행DDL(Data Definition Language) : Conceptual Schem..
Garbage Collector (GC) 코딩을 하다보면 수 많은 함수 내에서 여러가지 변수와 객체들을 선언 및 생성하여 사용한다.fun main(){ val obj = Something()}class Something{}Java의 객체는 JVM 가상 메모리 영역 중 Heap 영역에 저장이 된다.서버 또는 애플리케이션 등 실행 과정에 있어 수 많은 객체들을 사용하게 되는데 사용 후 더 이상 사용하지 않는, 참조되지 않는 객체들은 메모리 누수(Memory Leak)를 방지하기 위해 개발자가 직접 메모리에서 회수해야 한다.하지만 모든 사람은 실수를 하듯, 모든 객체를 완벽하게 관리하기란 불가능에 가깝다.Java에는 사용하지 않는 객체를 자동으로 메모리에서 회수해주는 Garbage Collector가 존재한다. JVM 메모리다음과 같은 코드를 ..