본문 바로가기

분류 전체보기

(271)
[Android] 4. 구글 코드랩 Dagger를 이용한 리팩토링 - Registration Flow 개요 해당 게시글은 구글 코드랩 문서의 번역 게시글입니다. 액티비티에 그래프 주입하기 안드로이드에서 앱이 동작하는 동안 그래프가 메모리에 상주하기를 원하기 때문에 일반적으로 Application 클래스에 Dagger 그래프를 만든다. 이 방식으로 그래프가 앱의 수명주기에 연결된다. 또한 Applicatoin Context를 사용할 수 있다. 장점으로 그래프는 다른 안드로이드 프레임워크의 클래스를 Context를 통해 이용할 수 있으며 테스팅에도 용이하다. 그래프 객체(i.e. AppComponent)를 새로 생성한 custom Application인 MyApplication에 주입하자. MyApplication.kt open class MyApplication : Application() { // App..
[Android] 3. 구글 코드랩 Dagger를 이용한 리팩토링 - Registration Flow 개요 해당 게시글은 구글 코드랩 문서를 번역한 게시글입니다. @Module, @Binds, @BindsInstance annotation 대거에게 Storage를 어떻게 제공해야 하는지 알릴 수 있을까? Storage는 기존 클래스와 다르게 인터페이스이며 따라서 직접 객체화할 수 없다. 따라서 대거에게 UserManager에서 사용할 Storage의 구현체(구상 클래스)를 알려야 한다. 이 경우는 SharedPreferencesStorage이다. 그러기 위해서는 대거 모듈을 활용해야한다. 대거 모듈이란 @Module이 붙은 클래스를 의미한다. 컴포넌트와 유사하게, 대거 모듈은 대거에게 특정 타입의 객체를 어떻게 제공하는지 알려준다. 의존성(객체)들은 @Provides와 @Binds로 정의된다. 따라서 해..
[Android] 2. 구글 코드랩 Dagger를 이용한 리팩토링 - Registration Flow 개요 구글 코드랩 문서를 참조한 게시글 입니다. @Inject annotaction Application Graph를 자동으로 그리게 하기 위해 Dagger는 인스턴스를 어떻게 만들 지 알아야 한다. 한 가지 방법은 클래스의 생성자에 @Inject을 작성하는 것이다. 해당 생성자의 매개변수들은 타입에 맞게 종속성이 된다. RegistrationViewModel.kt class RegistrationViewModel @Inject constructor(val userManager: UserManager) { ... } 위 과정을 통해 어떻게 RegistrationViewModel을 만들어야 할 지 알게 된다. 즉, @Inject는 대거에게 해당 타입의 객체를 어떻게 제공하는지 알려준다. 또한 Dagger는..
[Android] 1. 구글 코드랩 Dagger를 이용한 리팩토링 - 개요 및 셋업 개요 해당 코드랩을 참고하여 작성된 포스트입니다. Application Graph 아래는 최종적으로 생성하고 테스트할 Application Graph이다. 화살표 방향은 객체간의 의존성을 표현한다. $ git clone https://github.com/googlecodelabs/android-dagger 위 프로젝트의 master 브런치가 코드랩 강의의 시작점이다. 해당 앱은 4개의 액티비티 플로우로 구성된다. Registration: 유저가 이름, 비밀번호, 약관 동의를 통해 등록이 가능하다. Login: 유저 정보를 통해 로그인 및 로그아웃이 가능하다. Home: 유저가 입장하고 읽지 않은 notification이 몇 개가 존재하는지 확인할 수 있다. Settings: 유저가 로그아웃 및 읽지 않은..
[Android] Dagger2를 활용한 Dependency Injection 개요 : 의존성 주입이란? 이 글은 구글 코드랩을 참조하여 작성한 글 입니다. 의존성 주입(DI;Dependency Injection)라이브러리는 제어의 역전을 활용하여 개발자가 직접 객체를 제어하는 대신 라이브러리를 통해 의존 관계를 정리해주어 느슨한 결합이 가능하게 한다. 즉 DI의 장점은 다음과 같다. 재사용하기 좋은 코드 쉬운 리팩토링 쉬운 테스팅 먼저 '의존성'이란 한 객체가 다른 객체에 의존한다는 것을 의미한다. 예를 들어 아래는 Car 객체가 Engine 객체에 의존하는 코드이다. class Engine{ private int Fuel = 0 public setFuel(int Fuel){ this.Fuel=Fuel; } public getFuel(){ return Fuel; } } class..
[Flutter] App 라이프 사이클(생명주기) 관찰 개요 Flutter도 여타 안드로이드와 유사하게 앱 고유의 라이프 사이클이 존재한다. 예를 들어, 홈 버튼을 눌러 앱 화면이 더 이상 보이지 않을 때, 다시 앱으로 돌아와 화면이 보이기 시작할 때 등이 존재한다. 여기서의 라이프 사이클은 Stateful Widget에서의 라이프 사이클과 다르다. (Stateful Widget에서의 라이프 사이클은 대표적으로 위젯이 처음 초기화될 때와 위젯이 완전히 제거될 때가 일반적이다.) 라이프 사이클 종류 resumed: 앱이 화면에 다시 보이기 시작하는 경우, 유저의 인풋에 반응할 수 있다. inactive: 앱이 비활성화되고 유저의 인풋에 반응할 수 없다. paused: 앱이 유저에게 보이지 않고, 유저의 인풋에 반응할 수 없으며 백그라운드로 동작한다. (보통 i..
[Node.js] Child Process를 통해 Node.js에서 파이썬 스크립트 파일 구동하기 개요 PyTorch로 훈련시킨 EfficientNet 딥러닝 모델을 Express.js 프레임워크에서 구동시키기 위해 Node.js 상에서 파이썬 파일을 구동할 필요가 생겼다. 코드 아래 Express.js로 작성된 서버에서 POST 요청을 통해 사진 하나가 서버의 upload 디렉토리로 업로드 된다. 이후 'child_process'의 spawn을 통해 python 파일을 수행하게 된다. Node.js 파일 const express = require('express'); const app = express(); const multer = require('multer'); const path = require('path'); const uploader = multer({ storage: multer.di..
[Linux] Vim 에디터를 Vundle로 커스터마이징 기본 셋업 $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim $ sudo apt install universal-ctags $ vi .vimrc .vimrc 내용 et rtp+=~/.vim/bundle/Vundle.vim " :vs -> 창 수직 분할 " ctrl+ww -> 창 이동 " :NERDTree " :term -> 터미널 열기, ctrl+d 닫기 call vundle#begin() Plugin 'VundleVim/Vundle.vim' " 파일 구조 관리 Plugin 'scrooloose/nerdtree' " 태그로 함수 등을 관리 Plugin 'majutsushi/tagbar' " git으로 관리되는 ..