본문 바로가기

전체 글

(271)
[MongoDB] Mongoose에서 트랜잭션 처리 트랜잭션(Transaction) Tansactions let you execute multiple operations in isolation and potentially undo all the operations if one of them fails. This guide will get you started using transactions with Mongoose. 사용 예시: Q&A 게시글 Q&A는 하나의 질문글과 그 질문에 해당하는 답변글로 이루어져있다. 그 둘은 각각 다른 모델이며, 현재 질문글만 생성되어있고 관리자 유저가 해당 질문에 대한 답변을 작성하는 요청을 한다고 가정할 시, 먼저, 트랜잭션을 위한 startSession 객체를 몽구스에서 가져오고, 모델을 import한다. const {s..
[안드로이드] RecyclerView 여러 개의 ViewType 활용하기 개요 카톡 채팅방은 RecyclerView의 구조로 이루어져 있다. 하지만 내부 아이템을 보면 좌측에는 상대방의 채팅, 우측에는 자신의 채팅이 출력된다. 각 채팅의 뷰는 비슷한 모양이긴 하지만 왼쪽, 좌측으로 치우쳐져 있다는 점에서 서로 다르다. 이때, 사용하는게 ViewType을 이용한 View 구분이다. 구현 과정 0. 채팅 데이터 클래스를 정의한다. data class ChatItem( val sender: String, val message: String, val count: Int, val viewType: Int = 0 ) 1. 다음으로 사용하고 싶은 아이템의 레이아웃을 생성한다. 2. 리사이클러뷰 어답터에 getItemViewType을 정의해준다. 여기서 이 함수의 반환 결과로 아이템의 Vi..
[디버깅] ClassNotFoundException: Dex file '/data/app,...' 앱 실행 시 메인 액티비티에 대해 ClassNotFoundException이 발생하는 오류이다. Manifest의 액티비티명, 패지키명도 제대로 작성되어 있고 해당 오류가 발생한다면, 앱 단위의 build:gradle에 다음 컴파일 옵션을 추가해준다. apply plugin: 'com.android.application' android { compileSdkVersion 29 ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
[공유기 설정] 외부 IP에서 서버로 접속 가능하게 설정하기 개요 집에서 사용하는 노트북이나 컴퓨터를 직접 서버로 사용하게 된다면, 외부에서 접속이 가능하게 허용해야 한다. 0. 공유기 관리 사이트 접속 설치된 공유기 IP 주소를 이용하여 설정 사이트에 접속하여 로그인한다. 1. DMZ 설정 DMZ란, De-Millitarized Zone으로 기본적으로 공유기에서 방화벽 기능으로 외부로 접속이 가능하나 외부에서 내부접속이 방화벽에 의해 차단된다. 이는 보안을 위한 기본적인 조치이다. 이를 해결하기 위해 DMZ로 특정 주소를 설정하여 해당 주소로의 접속을 허용해준다. 이를 설정하기 위해, 먼저 터미널을 실행하여 ipconfig 명령을 수행하여 Wi-fi의 IP 주소를 획득한다.(무선 랜 Wi-fi 어답터의 IPv4 주소 사용.) 얻어온 주소를 아래와 같이 DMZ I..
서버 구성 관련 명령어(Ubuntu 18.04, Node.js, MongoDB) $ sudo apt-get update $ sudo apt-get install -y build-essential $ sudo apt-get install curl $ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -- $ sudo apt install nodejs $ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - $ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sourc..
[안드로이드] Repository 패턴 개요 Repository는 MVVM, MVP와 같은 아키텍쳐 패턴을 사용할 때 주로 등장하는 개념이다. 그리고 이 Repository의 사용 이유 역시 관심사의 분리이다. Repository는 데이터, 데이터 소스와 ViewModel(혹은 Presenter) 사이의 종속성을 줄여준다. 이는 유지보수 및 테스트가 쉬워진다는 의미이다. 마치 네트워크의 TCP/IP 5계층과 비슷하다고도 볼 수있다. Repository는 데이터를 캡슐화한다. 그리고 안드로이드에서는 보통 다음과 같은 아키텍쳐를 사용한다. 위처럼 구현하게되면 오직 Repository만 복수의 요소들과 종속되어 있고, activity, ViewModel은 오직 하위 계층 요소 단 한개에만 종속되었음을 볼 수 있다. ViewModel에서는 UI를 업..
[안드로이드] 백그라운드 처리 개요 전 문서에서 백그라운드 처리를 위한 컴포넌트인 Service에 대해 알아보았다. 가장 상위 클래스인 Service는 직접 구현하기 어려워 개발자에게 많은 부담이 되었다. 그래서 생긴게 IntentService이다. 상속받아 구현할 메서드도 적고 별도의 쓰레드를 핸들링하지 않아도 되어서 개발자가 훨씬 사용하기 편해졌다. 하지만 단점은 정확하게 동작하지 않고, 여러 작업을 동시에 처리하는 것이 불가능하다. 심지어 Android 11(API 30)부터는 Deprecated 될 예정이다. JobIntentService JobIntentService는 IntentService를 대체하기 위함이다. 바뀐점은 JobIntentService 안에 구현된 enqueWork()라는 메서드로 서비스를 시작한다. 하지만..
[안드로이드] 서비스(Service) 서비스(Service) 안드로이드의 서비스란 긴 작업을 백그라운드에서 수행하는데 사용되는 UI를 제공하지 않는 컴포넌트이다. 그리고 IPC(Inter-Process Communication; 프로세스간 통신)를 지원한다. 서비스가 사용되는 예시로는 음악 재생, 네트워킹, 파일 입출력, Content Provider와 상호작용 등이 있다. 특별히 중요한 점은 백그라운드에서 수행한다는 말이 메인 쓰레드에서 수행되지 않는 다는 말과 같지 않다는 점이다. 즉, 서비스는 메인 쓰레드에서 수행된다. 그렇기에 음악재생, 네트워킹과 같은 Intensive I/O 작업들은 서비스 내에서 별도의 쓰레드를 생성하여 작업하는 것이 올바르다. 서비스의 세 가지 유형 1. 포그라운드 서비스 포그라운드 서비스는 대표적인 예시로 음..