목록개인 프로젝트 (10)
성장기록지

개요검색화면 activity를 분리하며 코드를 작성하다 activity가 화면에 그려지지 않고. 로그를 찍어봐도 아무것도 찍히지 않는 현상을 맞이했다.이유를 찾아보니 override fun onCreate(savedInstanceState: Bundle?)위의 코드를 사용하지 않고override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)아래의 코드로 작성해서 벌어진 일이였다.그렇다면 왜 화면에 그려지지 않는지, PersistableBundle이 뭔지 알아보고자 한다. PersistableBundle이란?공식문서에서는 다음과 같이 설명한다.문자열 키에서 다양한 유형의 값으로의 매핑.이 클래스에서 지원하는 유..

이전 글에서 Room 아키텍처에 따라 Entity, Dao, Database를 구성하는 과정을 서술하였다.이번 글에선 어떻게 기능들을 구현하였는지 과정을 작성하도록 하겠다.저번 글은 아래 링크에서 참고 가능하다.https://codinghun.tistory.com/76 Room을 활용한 쇼핑 상품 북마크 기능(Room 구조 구현)쇼핑앱을 구현하며 Room을 통해 로컬 데이터베이스에 상품을 저장하는 기능을 구현하고자 하였다.이전에 공부한 Room의 구조들을 활용하며, MVVM 구조를 깨지 않도록 구현한 과정을 작성하고자 한codinghun.tistory.com 북마크 된 상품 리사이클러뷰에 표시하기 viewmodel에 StateFlow>으로 bookmarkedItems를 구성해둔다.private val _..
쇼핑앱을 구현하며 Room을 통해 로컬 데이터베이스에 상품을 저장하는 기능을 구현하고자 하였다.이전에 공부한 Room의 구조들을 활용하며, MVVM 구조를 깨지 않도록 구현한 과정을 작성하고자 한다. 이전에 내가 학습한 글을 통해 프로젝트 내에 Room의 아키텍쳐대로 구성하고자 하였다.https://codinghun.tistory.com/23 Entity 구성 Entity는 아래와 같이 구성하였다.api호출 결과로 ItemsResponse를 가져오고, 거기서 각 검색 상품마다의 정보를 Item으로 가져왔다.앱 내에서 ShoppingItem만을 사용하므로 Item의 확장함수를 통해 아래 코드와 같이 toShoppingItem으로 Entity로 전환해주도록 하였다.PrimaryKey인 id는 상품의 고유값인..

Room TypeConverter란?안드로이드 로컬 데이터베이스인 Room 같은 경우 컬럼에 List나 Data class를 사용하려 하면 에러가 발생하게 된다.기본적으로 Room은 원시타입(int, short, long ....)과 wrapping 타입만 지원함.이때 Type Converter를 적용하면 에러를 발생시키지 않고 정보를 담을 수 있다. 객체 참조를 허용하지 않는 이유 서버에서는 데이터베이스의 관계를 객체 모델로 매핑하고 지연 로딩(lazy loading)을 사용해도 괜찮다.하지만 안드로이드 앱의 UI 스레드에서는 이런 방식이 문제가 된다.(지연 로딩이란? -> 필요한 순간까지 데이터 로딩을 미루는 방식으로 데이터베이스에서 데이터를 불러올 때 사용하는 전략)UI 스레드는 화면을 그리는데 약..

debounce란?debounce는 이벤트를 그룹화하고 일정 시간동안 이벤트가 발생하지 않으면 가장 마지막 이벤트를 전달한다.'penguin' 이란 단어를 검색한다고 해보자.p -> pe -> pen -> peng -> pengu -> penguin 과 같이 한글자씩 작성하게 될 것이다.별 다른 조치를 하지 않는다면 글자를 쓸때마다 이벤트가 전달되겠지만,Debounce로 일정 시간을 지정해주면 그 시간 동안 이벤트가 발생하지 않을 경우 가장 마지막 이벤트를 전달하게 해준다. 예를 들어 debounce를 0.5초로 설정해주고, penguin이라는 단어에서 한글자 작성하는데 0.3초씩 걸린다면,penguin 단어를 완성 후 0.5초 이후에 이벤트가 전달이 된다. 그림으로 본다면 다음과 같다. 1 ~ 5번의..

Paging이란?공식문서에는 다음과 같이 작성되어져있다.요약하자면 데이터를 가져올 때 한 번에 모든 데이터를 가져오는 것이 아니라 페이지로 나눠서 가져오는 것을 뜻한다.이때 데이터는 로컬 데이터베이스에 있을 수 있고, 통신을 통해 가져올 수도 있는 것이다. Paging의 장점영어는 어려우니 하나씩 해석해보겠다.페이징 된 데이터의 in-memory 캐싱 -> 앱이 페이징 데이터로 작업하는 동안 시스템 리소스를 효율적으로 사용 가능요청 중복 제거 기능이 기본으로 제공되어 앱에서 네트워크 대역폭과 시스템 리소스를 효율적으로 사용 가능.사용자가 로드된 데이터의 끝까지 스크롤할 때 구성 가능한 RecyclerView 어댑터가 자동으로 데이터를 요청 (무한 스크롤이 구현 가능하다는 뜻.)Kotlin 코루틴 및 F..

부스트캠프 미션이나 프로젝트를 진행하며 네트워크 통신에는retrofit과 Okhttp를 같이 쓰는게 거의 정석처럼 사용되어졌다.이번 프로젝트를 계기로 기술 사용에 대한 근거를 세워보고자 한다.1. HttpURLConnection안드로이드 초창기에는 자바로 만들어진 HttpURLConnection이 네트워크 요청의 표준이었다고 한다.자바에서 기본적으로 제공하는 클래스이기 때문에 호환성 문제도 없고 가볍게 사용할 수 있다는 장점이 있지만,현재 시점에선 다음과 같은 문제들이 있다. 비동기 처리HttpURLConnection은 기본적으로 동기 방식으로 동작한다.즉, 네트워크 요청이 완료될 때까지 메인 스레드가 차단(blocking)된다.실제로 부스트캠프를 하며 httpUrlConnection을 사용해 보았을 때..

적용 계기다음과 같은 배너를 Custom View로 구현하고자 하였다. (현재는 배너 이미지로 대체하였다. 이유는 아래 서술)모델 이미지의 오른쪽 아래를 보면 배너와 같이 라운딩 처리가 되어있는것을 확인하였다.디자인의 요구사항과 똑같이 라운딩 처리를 해주고자 하였다.적용 과정먼저 이미지뷰에 라운딩 처리를 하는 법을 찾기 위해 구글을 검색하였다.사진과 같이 나오는 래퍼런스들은 많지만, 다 만족스럽지 않았다.clipToOutline을 통해 코드에서 동적으로 할당하거나,CardView를 활용하거나 하여 여러모로 불편한 조건들이었다.그러던 중, 부스트캠프 동료에게서 ShapeableImageView를 사용해보라는 말을 들었다! ShapeableImageView 적용하는 법은 간단하다.ImageView를 Sha..

부스트캠프를 통하여 Compose 프로젝트를 진행하였지만, 제대로 된 xml 프로젝트 경험이 없기에, 새로운 프로젝트를 하나 해보기로 결정하였다.쇼핑앱 프로젝트를 진행하려고 마음먹었고, 개인 프로젝트지만 디테일하게 만들어야 한다 생각하여디자인도 볼만하게 만들고, 목업 데이터도 괜찮은 것을 사용하자고 생각하였다. 디자인 선정 과정 - 크몽우선 작성자는 디자인을 엄청 못한다.따라서 디자인 키트를 구매하기로 생각하였다.우선 스마트스토어 할 때 많이 쓰던 크몽을 둘러보았다,하지만 커스텀 UI 이다보니 기본 가격부터 만만치 않았다.아래 첨부 사진처럼 2페이지에 10만원은 가볍게 넘는 경우가 많았다...디자인 선정 과정 - Figma Ui Kit취준생에게는 상당히 부담이 되는 가격이였기에 다른 방법을 찾아보기로 결..
개인 프로젝트 기획mock api 등을 이용한 쇼핑몰 프로젝트로 부스트캠프에서 습득한 이론적 지식을 실무에 가까운 환경에서 적용하고, 새로운 기술적 도전을 통해 안드로이드 개발 역량을 한층 더 성장시키고자 한다. 단순 기능 구현을 넘어 성능 최적화, 사용자 경험 개선과 같은 종합적인 개발 역량을 키우는 것이 목표이다.키워드 검색디바운스를 통한 API 호출 최소화사용자가 검색어를 입력할 때마다 API를 호출하면 불필요한 네트워크 트래픽이 발생한다. Kotlin Flow와 debounce 연산자를 활용하여 입력이 일정 시간 동안 없을 때만 실제 API 호출이 이루어지도록 구현하여 효율적인 API 통신을 구성한다. 검색 결과를 리사이클러뷰로 노출DiffUtil을 활용하여 데이터 변경 시 효율적으로 UI를 업..