전체 233

Nutri Capture 백엔드 - View에서 INSERT 트리거

#1 개요지금까지의 과정을 통해, ViewModel에서 Model을 참조할 수 있게 되었다. 본 게시글에선 ViewModel에서 Model을 참조하는 이벤트를 구현하고, View에서 해당 이벤트를 Trigger하게 만들어본다. #2 코드#2-1 ViewModel의 이벤트 구현...class NutrientViewModel(private val repository: MainRepository) : ViewModel() {    ...    // (4) View로부터 받은 이벤트 처리    fun onEvent(event: NutrientViewModelEvent) {        when (event) {            ...            is NutrientViewModelEvent.Inse..

Nutri Capture 백엔드 - Model을 ViewModel에 생성자 주입

#1 개요이전 게시글에서 구축한 Room을 ViewModel에 생성자 주입하여, Room(Model)을 참조할 수 있게 만든다. #2 코드 - 이벤트 추가#2-1 이벤트 추가// package com.example.nutri_capture_new.nutrientimport com.example.nutri_capture_new.db.Mealimport java.time.LocalDatesealed class NutrientViewModelEvent { data object InitializeState : NutrientViewModelEvent() data object LoadMoreItemsAfterLastDate : NutrientViewModelEvent() data object Lo..

Nutri Capture 백엔드 - Room의 @DAO, @Database 구현

#1 개요이전 게시글에 이어, Room의 남은 부분을 구현한다. #2 코드#2-1 @DAO// package com.example.nutri_capture_new.dbimport androidx.room.Daoimport androidx.room.Deleteimport androidx.room.Insertimport androidx.room.OnConflictStrategyimport androidx.room.Queryimport java.time.LocalDate@Daointerface MainDAO { @Query("SELECT day_id FROM day_table WHERE day_date = :date LIMIT 1") suspend fun getDayId(date: LocalDate..

Nutri Capture 백엔드 - 새 ERD와 Room의 @Entity 정의

#1 개요#1-1 이전 게시글 폐기ERD에 대해 다뤘던 이전 게시글은 앱의 방향성을 재고한 이 게시글과 상충된다. 따라서 이전에 만들었던 ERD대로 데이터베이스의 스키마를 형성하지 않을 것이다. 새 ERD는 아래와 같다. #1-2 새 ERDmeal_table과 nutrition_info_table이 1 : n 관계인 것처럼 되어있는데 실제로는 그렇지 않다. nutrition_info_table은 meal_table의 기본키를 외래키이자 기본키로 쓰는, 식별 관계의 자식 테이블이기 때문에 1 : 1 관계다. 위 ERD 이미지는 DBeaver를 통해 뽑아낸 것인데 아마 오류가 난 것 같다. 아니면 1..n라는 표기가 1 : 1과 1 : n을 모두 아우르는 표현식일까? 아무튼 그렇다.-- Day 테이블CREA..

디베이터 - 논증

#1 개요논증은 논제에 대한 (찬성 혹은 반대한다는) 증명이다. 이 논증이 얼마나 짜임새있느냐에 따라 발언자의 말에 힘이 실린다. 따라서, 논증의 구조를 잘 파악하고 스킬을 갈고 닦아야 한다. 논제가 토론이라는 건물의 기둥이라면, 논증은 건물을 이루는 벽돌이다. 승리하기 위해선, 부실 공사 없이 벽돌 하나하나 쌓아올려가야 하는 것이다.#2 핵심 논리#2-1 '진실'... 나는 데브라(저자의 동료)와의 설전을 돌이켜봤다. 당시 내 상황이 꼭 우리 시대의 모습을 그대로 보여주는 것만 같았다. 자신이 진실(옳고 그름)이라 믿는 걸 고집스레 붙들고 있으면서도 설득력 있는 논거는 부족한 모습을.진실'이 시험대에 오르고 쉽사리 모호해지는 순간에는 절대 그 진실 자체의 지배력에 의지해서는 안 된다. 이런 시대일수록 ..

책/자기 계발 2024.10.17

Nutri Capture 프론트엔드 - Card

#1 개요스크롤 관련해서는 한시름 놓았다. 본 게시글에선 LazyColumn의 각 아이템을 Card로 감싸고 약간의 디자인적 수정을 할 것이다. 본 게시글까지해서 프론트엔드는 중간 맺음을 할 것이고 다음 게시글부터는 아마 백엔드 구현으로 넘어갈듯 싶다. #2 코드#2-1 (틀 잡기) Card()... @Composable fun NutrientScreen( ... ) { LaunchedEffect(key1 = true) { // State 초기화 ... // ViewModel로부터 받은 이벤트 처리 ... } LaunchedEffect(key1 = viewModel.isInitialized.value) { ... } LazyColumn( ... ) { val dailyMeals = viewModel.nu..

Nutri Capture 프론트엔드 - 스크롤 로직 View에 일임

#1 개요기존에는 무한 스크롤을 위한 암시적 스크롤 로직을 ViewModel과 View과 양분하고 있었다. 본 게시글에서 이 스크롤 관련한 로직을 View에 일임한다. ViewModel은 이제 LazyColumn이 보유할 아이템 리스트의 추가ㆍ제거만 수행하면 될 것이다. #2 코드#2-1 ViewModel에서의 Scroll 관련 코드 삭제...class NutrientViewModel : ViewModel() {    // (1) 화면 표시용 State    ...    // (2) ViewModel용 내부 변수    ...    // (3) View에서 받아 처리할 이벤트    ...    // (4) View로부터 받은 이벤트 처리    fun onEvent(event: NutrientViewMode..

Nutri Capture 프론트엔드 - requestScrollToItem()을 이용한 깔끔한 역방향 무한 스크롤

#1 스크롤 함수 변경#1-1 기존 함수LazyListState.scrollToItem() 및 LazyListState.scrollBy()는, 시스템 상의 제약이 존재한다. 사용자가 화면에 손을 붙인 채로 유지하면 스크롤이 아예 잠겨버리기 때문이다. 이 시스템 상의 제약을 우회하려고 정말 많은 코드를 시도해보았지만, 제대로 작동하기 않았고 작동하더라도 앱이 굉장히 조잡해보이는 모양새였다. #1-2 LazyListState.requestScrollToItem() LazyListState  |  Android Developers developer.android.com그러다 찾은 함수가 LazyListState.requestScrollToItem()다. 다음 Recomposition 때 스크롤이 위치해야하는 ..

Nutri Capture 프론트엔드 - 역방향 무한 스크롤

#1 개요이전 게시글에서 역방향 무한 스크롤을 불완전하게 구현했었다. 문제점은 다음과 같았다.  1 눈에 보이는 Item의 인덱스 중 0이 존재하면, 새로운 Item을 Load했다.  2 이러면 새로 Load된 Item의 인덱스가 다시 0이되면서 동시에 눈에 보이게 된다. 따라서 무한 재귀호출이 발생했었다.  3 이 문제를 해결하려면 새 Item을 Load함과 동시에 스크롤을 조작해야 한다. 그렇게 해서 '새 아이템이 눈에 보이기 전에' 스크롤을 성공시킨다면 무한 재귀호출에서 벗어날 수 있다. 본 게시글에선  3 의 상태를 만드는 걸 목표로 잡는다. #2 코드#2-1 깨알 변경...@Composablefun NutrientScreen( scope: CoroutineScope, snackbarH..

Nutri Capture 프론트엔드 - 무한 스크롤 로직 분리

#1 개요이전 게시글에선 불완전한 무한 스크롤을 구현했었다. 그 불완전함을 보완하는 코드를 작성하기 앞서, 먼저 기존 코드를 교통 정리하겠다. 첫째로는 초기 화면에서 보일 Item을 하나에서 20개로 늘린다. 초기 Item이 하나 뿐이면 아랫 방향 무한 스크롤 로직과 역방향(윗 방향) 무한 스크롤 로직이 동시에 작동하기에 이를 직관적으로 다루기 어렵기 때문이다. 20개라는 숫자는 Item들이 화면을 가득 채울만한 아무 숫자다. 특정 숫자로 하드 코딩하는 게 썩 내키지는 않지만, 일단 지금은 무한 스크롤의 문제를 해결하는 게 급선무다. 나중에 소프트 코딩으로 바꾸겠다. 또, 무한 스크롤 로직이 초기화가 완전히 완료된 후에 작동하도록 만들 것이다. 이를 위해 뷰 모델에 초기화 완료 정보를 담는 Boolean..