본문 바로가기

분류 전체보기

(271)
[Android] Jetpack Compose로 개발하기 개요 이번 포스팅은 을 참고하여 아래 이미지와 같은 메시징 UI를 가진 앱을 Compose를 활용하여 개발하는 예시이다. Composable Functions Jetpack Compose는 Composable Functions으로 이루어진다. 이러한 함수를 사용하면 UI 구성 과정(기존의 xml 방식)에 초점을 맞추는 대신 앱의 UI를 설명하고 데이터의 종속성을 제공하는 프로그래밍 방식으로 앱의 UI를 정의할 수 있다. Add a Text Element 첫번째로 "Hello World"라는 텍스트를 text 요소를 onCreate 내부에 사용하여 표시할 것이다. 그리고 그 과정에서 setContent 블럭을 활용하게 되는데 Composable Functions을 호출하는 액티비티의 레이아웃을 정의한다. ..
[Linux] Crontab으로 작업 스케쥴링 - Certbot 자동 갱신 Crontab Crontab은 Linux에서 특정 작업을 특정 시간에 수행할 수 있도록 하는 작업 스케쥴러이다. 예를들어, Certbot과 같은 SSL 인증서는 3개월마다 갱신이 필요한데 이를 OS가 자동으로 처리할 수 있게 하는 것이 가능하다. Crontab 편집 $ crontab -e Crontab 리스팅 $ crontab -l Crontab 수행 주기 설정 분-시간-일-월-요일 순으로 설정이 가능하다. 요일에서 0과 7은 일요일이고, 1~6이 월에서 토요일이다. 실제 사용 예시 - Certbot 자동 갱신 1. bin 디렉토리에 실행 스크립트 파일을 만든다. $ cd /bin $ vi letsencrypt.sh 2. 다음과 같이 내용을 설정 !/bin/sh /etc/init.d/nginx stop ..
[Android] Jetpack Compose 개요 Jetpack Compose Google에서 발표한 Jetpack 중 Compose는 안드로이드 UI를 XML이 아닌 선언형으로 개발할 수 있는 라이브러리이다. 더 적은 코드와 직관적인 사용법으로 UI 개발이 쉬워진다. Compose를 통해 해결할 수 있는 것 관심사의 분리는 유명한 소프트웨어 디자인 원칙이다. 이를 이해하기 위해선 "결합도(Coupling)"와 "응집도(Cohesion)"을 이해해야 한다. 결합도는 서로 다른 모듈의 유닛 간의 종속성을 의미한다. 응집도는 모듈 내의 유닛 간의 그룹화의 정도를 나타낸다. 유지보수가 쉬운 소프트웨어를 개발하기 위해선 결합도를 낮추고, 응집도를 높혀야 한다. 현대 안드로이드 개발 패턴은 ViewModel을 사용하고 Layout(XML)에서 ViewModel의..
생성자에서 많은 작업을 하는 것은 바람직하지 않은가? 개요 이전 포스팅에서 ViewModel의 생성자에서 많은 작업을 하는 것은 바람직하다는 저자의 코멘트가 있었다. 과연 정말 바람직하지 않은 것인지, 어떤 면에서 문제가 있는지 확인하고자 한다. 해당 포스팉에서는 Is doing a lot in constructors bad? - Stack Overflow의 의견들을 적극 참조했다. 생성자에서 작업 시 발생할 수 있는 문제점 생성자에서 많은 작업을 하는 것은 다양한 문제를 야기할 수 있다. 1. 테스트가 어렵게 만든다. 예를 들어, new를 통해 생성자에서 다양한 객체를 생성한다고 가정하자. 유닛 테스트가 매우 어려워질 것이다. 2. 단일 책임 원칙을 위반한다. 다양한 책임을 가진 많은 코드를 하나의 블록에 넣는 것은 좋지 않다. 3. 생성자의 코드가 일부..
뷰모델(ViewModel)에서 데이터를 로딩하는 다양한 방법 해당 포스팅은 When to load data in ViewModels을 번역한 포스팅입니다. 개요 안드로이드에서 AAC의 ViewModel과 LiveData는 핵심적인 컴포넌트이다. 이를 통해 라이프 사이클을 인지하여 보다 더 안전하고 효율적인 코드를 작성할 수 있게 된다. 이 과정에서 ViewModel 내부에 선언된 LiveData를 Activity가 사용한다. 이 때, ViewModel은 데이터를 로딩하여 LiveData에 세팅하는 적절한 시점이 필요하다. 언제, 어떻게 이를 효율적으로 관리할 수 있을까? Use Case 해당 포스팅에서 사용할 Use Case는 다음과 같다. 책 리스트를 ViewModel에서 사용하고 LiveData를 이용하여 발행한다. class Books(val names: L..
[안드로이드] 태스크(Task)와 백 스택(Back Stack)의 개념과 Launch Mode, Intent Flag 태스크(Task) 태스크는 액티비티 스택에 대한 메타 데이터와 여러 정보의 콜렉션이다. 앱의 런처 아이콘을 클릭하면 안드로이드 시스템에서 실제로 수행하는 일은 재개(resume)할 이전의 기존 작업을 찾는 것이다. 만약 어느 태스크도 찾지 못했다면 새로 시작된 액티비티를 태스크의 백스택의 루트 액티비티로 설정하여 새로운 태스크가 생성된다. 백 스택(Back Stack) 먼저 안드로이드에서 Stack은 액티비티가 순서대로 저장되어 관리되는 공간을 의미한다. 뒤로가기를 누를 경우 최상단의 액티비티를 제거(pop)한다. 혹은 startActivity()를 통해 새로운 활동을 최상단에 추가하여 새 액티비티가 기존의 최상단 액티비티를 가릴 경우 기존 액티비티는 일시 중지된다. 태스크: 다른 앱의 액티비티와의 관계..
[안드로이드] PendingIntent란? PendingIntent PendingIntent는 Intent를 갖고 있는 클래스이다. 기본적으로 다른 애플리케이션(프로세스)에서 PendingIntent를 생성한 앱을 대신하여 액티비티를 실행하는 등 기술한 작업을 수행할 수 있도록 하는게 가능하다. 즉, 다른 앱에 PendingIntent 를 제공하면 다른 앱이 동일한 권한을 소유하는 것 처럼 지정한 작업을 수행할 수 있게 된다. 실제 사용 예시 설명만으로는 이해하기 어려울 수 있으므로 자세한 예시를 들면 다음과 같다. Notification을 생성할 때 PendingIntent를 전달해주어 Notification을 통해 Intent를 실행하도록 하는 것이 가능하다. AlarmManager를 통해 특정 시점에 어떤 작업을 수행해야 할 때 Pendin..
[안드로이드] Retrofit으로 가져온 데이터를 디바이스에 캐싱하기 개요 네트워크가 원할한 환경에서는 HTTP 통신 등을 통해 외부 데이터를 가져오는 것에 제약이 없다. 하지만, 네트워크가 원할하지 않은 경우에도 사용자에게 해당하는 데이터를 제공하여 더 좋은 SW를 작성할 수 있다. 다양한 방법이 존재하지만 그 중 대표적인 것은 캐싱(Caching)이다. 캐싱은 네트워크에서 가져온 데이터를 임시적으로 기기의 일부 공간에 저장하여 필요로 할 때 네트워킹이 아닌 기기의 공간에서 데이터를 가져올 수 있게 한다. 이를 통해 얻을 수 있는 이점은 다음과 같다. 네트워킹이 불가능한 상황에서도 이전에 캐싱된 데이터를 통해 제공 가능 이미 캐싱된 데이터가 있을 경우 굳이 네트워크를 활용하지 않고 조금 더 빠르게 데이터 획득 가능 서버에서 요구되는 트래픽이 줄어드는 효과 안드로이드의 R..