본문 바로가기

전체 글

(271)
[데이터베이스] ISAM과 B+ 트리 ISAM(Indexed Sequential Access Method) ISAM은 트리의 구조가 변경되지 않는 정적 트리이다. 리프 페이지는 연속적으로 할당되어 앞, 뒤의 링크 없이 순차적으로 접근이 가능하다는 점이 특징이자 장점이다. 데이터 삽입 시 overflow page가 생성될 수 있으며 order 개념이 없다. 특징 레코드가 물리적으로 인접해있다. 트리 구조가 변경되지 않는다. 인덱스 레벨의 페이지가 변경되지 않으므로 병행성 제어가 쉽다. ISAM의 삽입과 삭제 좌측은 23,48,41,42를 삽입한 뒤의 모습이고, 우측은 42,51,97을 삭제한 뒤의 모습이다. B+ 트리 동적인 트리로 데이터의 삽입, 삭제에 의해 트리의 구조가 변경될 수 있다. 리프 페이지의 노드들은 앞, 뒤 링크로 연결되어 있..
[안드로이드] 프래그먼트 생명 주기를 활용한 UX 개선 개요 아래와 같은 기존 코드의 경우 뷰가 완전히 생성된 이후 네트워킹 작업을 수행한 뒤 뷰를 갱신하여 UX가 좋지 않았다. 내가 원하는 방향은 네트워킹을 통해 데이터를 전부 가져오고 이 작업이 마무리되고 뷰가 갱신되는 것을 원했다. class BoardFragment : Fragment() { lateinit var repository: Repository lateinit var adapter: PostPageAdapter private val mDisposable = CompositeDisposable() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View..
[데이터베이스] 10. DBMS의 버퍼 관리와 쿼리 비용 추정 DBMS의 버퍼 관리 질의 과정에서 데이터에 접근하기 위해서는 테이블의 레코드들이 실제 물리 메모리의 버퍼 공간에 할당되어야 한다. 물리 메모리는 디스크에 비해 매우 적은 공간이며 이에 따라 적절한 교체 정책이 필요하다. DBMS는 로 이를 관리한다. 이는 메모리 버퍼의 몇 번 프레임에 디스크의 몇 번 페이지를 올렸는지를 의미한다. 특정 페이지가 요청된 경우의 시나리오는 다음과 같다. IF) 해당 페이지가 버퍼에 존재할 경우 -> 바로 반환 ELSE) 해당 페이지가 버퍼에 존재하지 않는 경우 버퍼에서 교체할 프레임을 선택한다. 교체할 프레임이 dirty면 이를 디스크에 기록한다. 요청한 페이지를 디스크에서 버퍼의 해당 프레임으로 로드한다. 각 프레임은 pin count로 얼마나 사용되고 있는 지를 기록하..
[데이터베이스] 9. 인덱스와 인덱스 구조별 비용 추정 인덱스 인덱스란 검색키를 기반으로 효율적인 질의를 돕는 메커니즘이다. 한 테이블의 특정 필드를 인덱스로 설정할 경우 전체 테이블을 full scan하는 것이 아닌 인덱스의 검색키 만으로 스캔하여 빠르다. 다만, 인덱스를 사용할 경우 공간적인 오버헤드가 약간 증가한다. 그리고, 갱신 작업 또한 약간의 시간적 오버헤드가 발생한다. 기존의 경우 해당 테이블의 실제 데이터만 수정하면 되지만, 인덱스가 있을 경우 인덱스의 검색키 또한 바꿔야 하며 그에 따라 인덱스의 구조가 변경될 수 있기 때문이다. 파일 구조에 따른 인덱스의 종류 B 트리 인덱스 B 트리의 구조를 띄는 인덱스로 하나의 노드에 2개 이상의 엔트리가 존재한다. 해당 구조의 특징은 아래와 같다. 범위 탐색에 유리하다. 성능은 트리의 높이에 따라 결정된..
[안드로이드] 프래그먼트 스택 (feat. 네비게이션) 개요 안드로이드에서 뷰나 액티비티와 같은 컴포넌트들은 스택으로 관리된다. A에서 B, C화면 순으로 이동하면 A, B, C 순으로 스택에 남아있고 top은 C를 가리키고 있으며, C가 파괴되면 B로 top이 이동하여 화면에 보이는 방식이다. Jetpack의 네비게이션 컴포넌트에서 스택의 관리는 아래와 같다. 스택에 추가 findNavController().navigate(VIEW) 위는 네비게이션 컨트롤러를 통해 다른 뷰로 이동하는 코드이다. 위 코드가 수행될 경우 백 스택에 현재 뷰가 저장된다. popUpTo, popUpToInclusive 위에서 다른 뷰로 이동할 때 백 스택에서 현재 대상을 팝하도록 선택할 수 있다. 예를 들어, 앱에서 로그인 과정이 있다면 사용자가 로그인했을 때 사용자가 뒤로 버튼..
[안드로이드] RecyclerView 성능 개선 방법 1 OnBindViewHolder에서 바인딩 시 리스너를 반복해서 등록하지 않기 리사이클러뷰는 리스트뷰와는 다르게 재활용을 통해 성능을 개선시킨 라이브러리이다. 재활용 과정에서OnBindViewHolder가 호출되게 되는데 바인딩 과정에서 같은 리스너를 계속 등록하는 것은 성능의 하락으로 이어진다. 따라서, 뷰홀더가 생성될 때 한번만 등록하도록 코드를 리팩토링한다. 뷰홀더에서 View.OnClickListener를 상속받는 방향으로 코드를 수정한다. 기존 코드 package com.bluemap.overcom_blue.adapter import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widge..
[안드로이드] Paging Library 개요 개요 페이징(Paging)은 데이터를 작게 나누어 로드하는 데 적합한 라이브러리이다. 예를 들어, 게시판에 게시글 3000개가 있는데 이를 네트워킹을 통해 한번에 로드한다면 딜레이가 매우 클 것이다. 따라서, 3000개의 라이브러리를 100개 씩 페이지 단위로 나누고 RecyclerView에 해당 아이템들이 거의 소모되기 전에 다시 다음 100개를 로드하는 방식이다. UI의 PagedList에서 ViewModel, Repository를 관찰하고, 만약 보여줄 아이템이 부족해진다면 DataSource에서 다시 DB나 네트워크에 접근하여 데이터를 가져온다. 그 후 이를 관찰하던 결과가 UI에 반영된다. 구성요소 다음은 페이징 라이브러리의 주요 구성요소이다. DataSource 데이터를 작게 나누어 불러온 다..
[Android] 카카오 로그인(v2) 구현 가이드 개요 안드로이드 애플리케이션에서 카카오 로그인(v2)을 구현하는 방법을 소개한다. 기존 Legacy 구현 방법과 다소 차이가 존재한다. 1. Kakao Developers 설정 Application 등록 kakao login 활성화 Android 플랫폼 등록(키해시, 패키지명 등) kakao login에서 Redirect URI 설정(안드로이드의 경우 임의의 URI를 설정하면 된다.) 2. 종속성 추가 및 manifest 수정 build.gradle(project) allprojects { repositories { ... maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/'} } } build.gradle(app) implem..