분류 전체보기
-
[이펙티브 코틀린]가변성을 제한하라전공 도서 리뷰 2022. 6. 4. 00:36
요소가 시간의 변화에 따라 변화하는 경우의 단점 프로그램을 이해하고 디버깅하기 힘들어짐 코드의 실행을 추론하기 어려워짐. 멀티스레드 프로그래밍의 경우 동기화가 필요하다 변경점이 많을 수록 충돌점이 많아진다. 테스트하기 어렵다 변경이 많을 수록 많은 조합을 테스트해야 한다. 상태 변경을 다른 부분에 알려야 할 때도 있다. 가변성 제한 방법 읽기 전용 프로퍼티(val) 완전히 변경 불가능하지 않다. 다른 프로퍼티를 활용하는 사용자 정의 게터로도 정의 가능하다. 정의 옆에 상태가 바로 적히므로 코드의 실행을 예측하는 것이 간단 스마트 캐스트를 활용 가능 가변 컬렉션과 읽기 전용 컬렉션 구분하기 읽기 전용 컬렉션을 가변 컬렉션으로 다운캐스팅하면 안 된다. 읽기 전용 컬렉션 사용 시 장점 한 번 정의된 상태가 유..
-
MVVM 적용기(2)Andorid 2022. 4. 2. 21:26
이전 글에서는 MVVM에 대한 대략적인 개념과 그것을 구현하기 위한 컴포넌트들에 대해 소개하였다. 이번에는 실제 코드를 통해 내가 MVVM을 어떻게 구현했는 지에 대해 보여주려고 한다. 내가 사이드 프로젝트로 시작한 어플에 MVVM을 적용했는데, 일반적으로는 Repository에 Room을 사용해서 내부데이터를 저장한다고 하지만, 내가 사용할 어플에서는 그 정도로 많은 양의 데이터를 저장할 필요가 없었고, 굳이 MVVM을 구현하기 위해서 Room을 사용하는 것 자체가 소 잡는데 닭 잡는 칼을 쓰는 모양새가 되는 것 같아서, 이전에 사용하던 SharedPreperence를 그대로 사용하기로 했다. 서버에 데이터를 요청하는 로직도 Model의 역할로서 같은 Repository에 포함시키도록 했다. objec..
-
MVVM 적용기(1)Andorid 2022. 4. 2. 21:24
내가 기존 회사에서 처음으로 시도해봤던 아키텍처 패턴은 MVP 패턴으로, 데이터 소스에 대한 접근은 Model이 담당하고, 사용자에게 데이터를 보여주는 부분(Activity,Fragment)는 View가 담당하며, 두 사이를 Presenter가 매개하는 형식의 패턴이라고 할 수 있다. 위 패턴을 직접 업무에서 적용하려고 했을 때 발생한 문제는 다음과 같았다. 일반적으로 View와 Presenter를 정의한 인터페이스인 Contract 등을 따로 정의해야 했고, 매번 두 아키텍처 컴포넌트를 변경해야 할 일이 생길 때마다 해당 인터페이스를 무조건적으로 변경해야 하므로 일을 두 번하게 되었다. View에는 데이터를 표시하는 일만 담당시키고, 복잡한 로직은 Presenter에게 위임시켜야 이상적인 MVP 패턴이..
-
[Android]Firebase로 채팅 앱 만들기(6)Andorid 2022. 3. 31. 15:03
이번엔 각 채팅방을 선택했을 때 이동할 채팅방 화면을 만들어보자. 우선 채팅방에 필요한 UI와, 메시지의 배경 레이아웃을 만들어준다. 위는 화면에 필요한 레이아웃에 사용되는 XML이다. 채팅에 사용되는 메시지의 레이아웃이다. background의 배경은 drawable에 corner를 설정하여 둥근 테두리 배경을 생성했다. 나/상대방 구분은 같은 배경에 색상을 변경하여 구분하도록 했다. @RequiresApi(Build.VERSION_CODES.O) class ChatRoomActivity : AppCompatActivity() { lateinit var binding: ActivityChatroomBinding lateinit var btn_exit: ImageButton lateinit var btn..
-
[Android]Firebase로 채팅 앱 만들기(5)Andorid 2022. 3. 31. 14:58
이번에는 새로 채팅할 상대를 추가할 수 있는 검색창을 만들어보도록 하겠다. class AddChatRoomActivity : AppCompatActivity() { lateinit var binding:ActivityAddChatroomBinding lateinit var btn_exit: ImageButton lateinit var edt_opponent:EditText lateinit var firebaseDatabase:DatabaseReference lateinit var recycler_people:RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ..
-
[Android]Firebase로 채팅 앱 만들기(4)Andorid 2022. 3. 31. 14:55
회원가입 페이지와 로그인 페이지도 만들어졌으니, 이제 진입할 홈 화면을 만들 차례다. 나는 카카오톡처럼 채팅방 목록과 함께 새 채팅방을 추가할 수 있는 버튼과 로그아웃 버튼을 표시했다. 전체 레이아웃 코드는 위와 같다. package com.miso.chatapplication.main import android.content.Intent import android.os.Build import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.appc..
-
[Android]Firebase로 채팅 앱 만들기(3)Andorid 2022. 3. 31. 14:53
지난 페이지에서는 채팅 앱에서 참여할 사용자를 추가할 수 있는 회원가입 화면을 만들어보았다. 이제는 만들어진 회원의 계정으로 로그인할 수 있는 로그인 페이지를 만들어야 한다. 먼저 로그인 레이아웃을 만들어준다. 로그인 레이아웃 xml은 위와 같다. package com.miso.chatapplication import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.EditText import android...
-
[Android]Firebase로 채팅 앱 만들기(2)Andorid 2022. 3. 31. 14:50
지난 페이지에서는 안드로이드와 Firebase 간의 연동 설정을 끝냈으니, 이젠 회원가입 페이지를 만들어보도록 하자. 우선 회원가입에 쓸 레이아웃 페이지를 만들어준다. 완성한 모습은 위와 같다. 이제 회원가입을 진행할 Activity를 만들어주자. package com.miso.chatapplication import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com...
-
[Android] Firebase로 채팅 앱 만들기(1)Andorid 2022. 3. 31. 14:20
이직을 위해 구직활동을 하던 중 평소 눈여겨 보고 있던 회사에서 입사 제안이 와서 프로젝트 과제를 수행하게 되었다. 그 과제의 요구조건은 1:1 채팅 앱을 만들어보라는 것이었는데, 서버가 있다는 가정 하에서 진행을 해보라는 것이 내게는 참 막막했다. 그래서 어떻게 구현할 지 곰곰히 생각해보다가, 예전에 졸업작품을 만들 때 썼던 Firebase가 떠올라 검색을 해보니 Realtime Database를 통해 채팅 앱을 만들 수 있는 것 같아 나도 시도해보게 되었다. 그 결과 꽤나 보기좋은 형태의 결과가 나왔고, 이 과정을 글로 공유하고자 한다. 본래 회원가입 기능은 기능 요구사항에 포함되어 있지는 않았으나, 만들어두는 것이 추후 프로젝트 진행에도 편리할 것 같아 만들어보았다. 우선 처음 프로젝트를 시작하기 ..