MVP Architecture MVP는 Model과 View, Presenter로 나누는 패턴이다. MVC와 비교하여 View와 Model이 서로 존재를 몰라 의존성이 줄어든다. 이말은 쉽게 View와 Model 클래스를 변경, 수정할 수 있고 MVC에 비해 Model 클래스의 유닛 테스트를 쉽게 시도할 수 있다. Model Local DB, Remote DB, sharedPreference .. 등 데이터를 수정, 관리하는 Class Presenter 사용자의 액션을 받아 로직을 처리하고, Model에게 Data 변경을 요청하거나 UI 업데이트하는 로직을 처리하는 Class ViewContract : View and Presenter의 설계 사용자 액션을 Presetner에 떠넘기고, UI 업데이트하는..
최근 Google Architecture MVP Sample project를 참고하여 MVP를 공부하던 도중 Executor의 클래스를 처음 보게 되었다. 그 후 구글링을 통해 네트워크 IO 통신과 디스크 IO 작업, UI 작업등 Background 작업을 위해 해당 클래스가 사용되었고 kotlin의 coroutine이 출시되기 이전 Thread를 유용하게 사용한 방법이었다. - Executor Inferface import java.util.concurrent interface Executor { void execute(Runnable command); } 구조로만 보면 Runnable 객체를 실행하는 단순한 구조이다. 클래스 자체로 어떤 Background 프로세스가 생성되는 것이 아닌 틀만 제공해준..
해당 포스팅의 코드와 설명에 오류가 있다면 댓글로 말해주시면 감사하겠습니다. 며칠 전, 출시 된지 꽤 지난 어플이 사용하던 API 서버 호출 오류로 내부 로직이 꼬여 먹통이 되어 버렸다. 해당 프로젝트는 기능 동작만 생각하던 옛날의 내가 Ctrl + c, Ctrl + v를 수행한 중복 코드도 많고 매우 비효율 적으로 구현한 작품. 다시금 스스로 작성한 코드를 보면서 디자인 패턴의 중요성을 느끼고 가장 기초적인 MVC 패턴부터 적용하기로 마음을 먹었다. Model-View-Controller 패턴 프로젝트의 기능과 비례하게 코드의 양이 늘어난다. 디자인 패턴을 적용하지 않은 프로젝트는 Activity 클래스 파일에 모든 코드가 들어가 있고 해당 클래스 파일의 코드의 수는 몇 천줄이 되어 어떤 한 기능을 수..
Google Cloud Calendar API 설정 Step 1. 구글 콘솔 사이트 들어가기 Step 2. 프로젝트 만들기 Google Cloud Platfrom 에서 프로젝트를 생성해야 해당 Project ID를 통해 Calendar API 등 여러 API를 사용할 수 있습니다. Step 3. 프로젝트 이름을 입력하고 만들기를 눌러주세요. Step 4.라이브러리에서 Google Calendar API 설정 Step 5. 인증정보 만들기 사용자 인증 정보 만들기 위해 OAuth에 대해 사용자에게 동의를 구할 때 나오는 화면을 설정해 주어야 합니다. Google Cloud Platform G Suite 계정이 아니면 내부 User Type 선택이 불가능 하므로 외부로 설정합시다. 동의화면은 외부만 선택이 ..
이 포스팅은 Music Player 재생의 간단한 로직을 FLO 앱 챌린지에 맞춰 개발한 내용에 대해 제 생각을 정리한 글입니다. 부족한 부분이 있으면 댓글로 알려주시면 감사하겠습니다. 멜론 어플을 사용한 유저라면 다른 어플을 사용 중에도 음악이 재생되는 것을 알 수 있을 것이다. 이는 음악이 Service에서 무한히 재생이 되고 있다는 뜻. 보통의 Service는 어떠한 값도 반환하지 않고 서비스를 종료하는 요청 외에 외부 서비스 내 함수에 접근할 수 없다. 그런데 음악이 재생되고 있는 도중 멜론 앱을 다시 키면 현재 재생되고 있는 곡의 정보를 바로 보여준다. 왜? 답은 Bound Services 이다. Service와 Activity의 관계과 서버와 클라이언트 관계가 된 것처럼 Activity는 Se..
Jsoup Jsoup이란 Html을 가져오고 파싱을 도와주는 자바 라이브러리이다. 자바와 완벽히 호환이 되는 Kotlin으로 Jsoup을 사용해보자 implementation 'org.jsoup:jsoup:1.11.3' 파싱할 정보 이번에 파싱할 정보는 등수 별 당첨 인원이다. 당첨 번호의 목록은 api로 제공되지만 순위 별 당첨번호는 제공하지 않기 때문이다. 파싱할 Html 형식을 보면 가져와야할 데이터들은 - - 계층구조에 존재한다. 위와 같은 예로 A>B>C 계층 구조의 태그를 파싱할 때는 공백으로 구분한다. regex table tbody tr code val url = "https://dhlottery.co.kr/gameResult.do?method=byWin" val doc = Jsoup.co..
들어가기 전 Kotlin 1.4.20 Release에서 변경점이 생겼습니다. kotlin extensions plugin이 deprecated 된 점입니다. kotlin extensions plugin에는 synthetic views라는 뷰에 대해 접근하는 코드를 생략해주던 기능이 포함 되어 있었습니다. //Activity or Fragment name.text = "test" 그런데 새로운 버전에서는 dprecated 되었으니 계속 해당 기능을 이용할 수는 없습니다. 다른 대안이 있을까요? ViewBinding란? Android AAC 중 하나로 view의 접근하는 코드를 조금 더 쉽게 작성할 수 있게 도와주는 기능입니다. ex) findViewByID 대신 사용 할 수 있다. Gradle 설정 etc..
위 Activity의 Lifecycle 그림은 대부분 알고 있으실 건데요. 하지만 두 Activity 간의 전환 사이에서 발생하는 Lifecycle 순서는 대부분 모르실겁니다. (어떤 면접관분께서는 실제 면접에서 질문했을 때 지금까지 맞춘 사람을 2명 보았다고 하네요.) 한번 맞춰보실까요?? Q1. 현재 A 엑티비티가 포그라운드 상태입니다. 이때 B 액티비티로 전환될 때, 발생하는 LifeCycle 콜백 함수들을 순서대로 나열해보세요. A:onPause() A:onStop() B:onCreate() B:onStart() B:onResume() 위 순서로 푸셨다면 아쉽지만 정답자에 들어가지 못하셨습니다 ㅠ 정답 A:onPause() B:onCreate() B:onStart() B:onResume() A:o..
안녕하세요 점냥입니다:) 페이징을 구현하려고 할 때, Jetpack Paging 라이브러리를 쓰지 않는 다면 우리는 리스트의 끝을 도달하는 시점을 확인해야 합니다. recyclerview에서는 함수로 쉽게 제공해주고 있습니다! canScrollVertically(int direction) // 수직 상단 하단 감지 canScrollHorizontally(int direction) //수평 상단 하단 감지 수직 기준 direction 값이 1이면 하단 방향 , -1이면 상단 방향 수평 기준 direction 값이 1이면 오른쪽 방향 , -1이면 왼쪽 방향 위 조건을 사용하여 아래처럼 구현할 수 있습니다. myList.setOnScrollListener(new RecyclerView.OnScrollListe..
안녕하세요. 점냥입니다 :) 여러분들은 Kotlin 언어를 알고 있나요? 열심히 Android 공부를 하고 있는 여러분이라면 이미 알고 있겠죠 ㅎㅎㅎ Kotlin은 Google I/O 17년도에서 Android 공식 언어로 지정되었습니다!! 아직 Kotlin을 사용하지 않는 다면 서두르세요. 어느새 Android Develop 사이트 전반적인 코드 샘플들과 공식 유투브에서 Kotlin 언어를 기본으로 사용중인 것을 확인할 수 있습니다. 이 포스팅을 읽고 나서 Kotlin 언어에 대한 흥미가 생기셨으면 좋겠습니다. Kotlin 배경 Kotlin 언어가 나오기 전 Android 플랫폼에서는 C++ 언어도 쓰이긴 했지만, 대다수의 개발자들은 Java 언어를 사용해서 개발했습니다. Java 언어는 JVM에서 동..