diff --git a/.DS_Store b/.DS_Store index e4012c0..0054f94 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git "a/2023/11\354\233\224\354\260\250/Version Catalog.md" "b/2023/11\354\233\224\354\260\250/Version Catalog.md" new file mode 100644 index 0000000..e8bc399 --- /dev/null +++ "b/2023/11\354\233\224\354\260\250/Version Catalog.md" @@ -0,0 +1,20 @@ +# VersionCatalog +우리가 평소에 사용하는 라이브러리 관리 기술은 아래와 비슷할 것이다. +> 1. ext를 통한 버전 관리 +> 2. buildSrc를 이용한 버전 관리 +> 3. composite build를 통한 버전 관리 + +하지만 Gradle 7.0 이상 버전부터 추가된 Version Catalog라는 것을 통해 더욱 간편하게 버전관리를 할 수 있게 됐다. + +그래서 Version Catalog가 무엇인지 알아보자면 +Version Catalog는 확장 가능한 방식으로 라이브러리 및 플러그인을 추가하고 유지할 수 있다고 한다. + + 즉, 버전을 bundle 형태로 묶어서 관리할 수 있고, 프로젝트에 여러 모듈이 있는 경우, 라이브러리와 플러그인을 업그레이드 해야 할 때마다 이름과 버전을 개별 빌드 파일에 하드코딩하는 대신, Version Catalog를 생성해놓으면 다른 모듈에서 스튜디오 지원을 활용하여 안전하게 참조하고 더 쉽게 관리할 수 있다. + +1. 하나의 파일로 여러 프로젝트나 모듈의 버전 관리를 통합하여 관리할 수 있다. +2. 공통적으로 사용하는 의존성을 bundle로 묶어서 선언할 수 있다. +3. IDE 상에서 Catalog마다 자동 완성 기능 등의 편리한 요소를 지원한다. +4. 가독성이 향상된다. + + + diff --git "a/2023/9\354\233\224\354\260\250/ComposeState.md" "b/2023/9\354\233\224\354\260\250/ComposeState.md" new file mode 100644 index 0000000..cc7957e --- /dev/null +++ "b/2023/9\354\233\224\354\260\250/ComposeState.md" @@ -0,0 +1,10 @@ +# Compose에서의 상태관리 +## State +기본적으로 어플리케이션에서의 상태(State)는 시간이 지남에 따라 변경될 수 있는 모든 값이다. 이 상태라는 것은 클래스의 변수부터 Room 데이터베이스등 대부분 모든 것을 포함하는 광범위한 정의이다. + +ex. 네트워크 설정을 할수 없을때 뜨는 스낵바, 블로그 게시물, 댓글, 애니메이션 효과 + +--- + +## State & Composition +컴포저블을 업데이트하는 유일한 방법은 diff --git "a/2023/9\354\233\224\354\260\250/DeepLink.md" "b/2023/9\354\233\224\354\260\250/DeepLink.md" index e69de29..9d4b6a3 100644 --- "a/2023/9\354\233\224\354\260\250/DeepLink.md" +++ "b/2023/9\354\233\224\354\260\250/DeepLink.md" @@ -0,0 +1,122 @@ +# DeepLink + +Android DeepLink를 알기 전에 그 전에 기본적인 정의를 알아보자! + +DeepLink는 홈페이지가 아닌 홈페이지 내에 특정 화면에 한 번에 도달할 수 있는 링크라고 한다. + +구글 검색 결과에서 보이는 각종 사이트들은 사실 링크로 연결되어 있다. 예를 들어 검색했을때 나오는 네이버 블로그 글이나 안드로이드 공식 개발자 사이트 글이 있다. + +그중에 네이버 블로그 글을 클릭하게 되면 이동하여 열리는 페이지는 네이버 블로그 공식 홈페이지로 가는 것이 아니라 DeepLink를 통해 자신이 검색한 내용에 대해서 설명되어 있는 개인 블로그로 들어가게 되는데 바로 이런 걸 DeepLink라고 볼 수 있다. + +ex. + +https://www.blog.naver.com <- 일반 링크 + +https://www.blog.naver.com/100sm <- 딥링크 + +![deeplink](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcavr3l%2FbtqWjqhXCfP%2FpFvSKkDL7pGQ0Y7oQQkKik%2Fimg.png) + +그런데 DeepLink라는 개념은 모바일과 웹에서 모두 사용되는 개념이다. + + +웹같은 경우에는 브라우저 상단에 URL이 오픈되어 있어 쉽게 딥링크를 이해할 수 있을 것이다. 하지만 모바일은 보통 URL이 사용자에게 오픈되어 있지 않아서 쉽게 알 수가 없다. + +그렇다면 모바일에서 DeepLink는 어떤 형태로 구현되어 있을까? + +--- + +## 모바일 환경에서의 DeepLink +모바일 환경에서의 DeepLink는 이런식으로 구현되어 있다. + +![DeepLink](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvI6UA%2FbtqV356YlwY%2FhX9Ahrfnn5lTkKbl8vFsj1%2Fimg.png) + +데스크톱이 아닌 모바일 환경에서 네이티브 앱이 아닌 웹사이트를 통해 네이버 웹툰에 들어간 화면이다. 그러면 하단에 앱 설치하기 알람이 올라올텐데 아무래도 모바일 웹보다는 네이티브 앱이 더 사용자에게 좋은 UX/UI 경험을 줄 수 있을 것이다. 이럴 때 앱을 설치하라는 DeepLink를 사용자에게 추천하는 것이다. + +또한 DeepLink를 구현하는 방법에는 여러가지가 있는데 그중 아래의 URL Scheme방식에 대해 알아보겠다. + +## URL Scheme +URL Scheme방식은 Android, iOS 모두 사용 가능한 최초의 DeepLink 수단이다. + +***scheme://host_path*** + +우선 위의 형태로 정의되어 있는 링크들을 URL Scheme이라고 부른다. + +예를 들어 https://www.naver.com 처럼 URL과 market:// 등이 모두 해당한다. + +URL Scheme은 리소스를 구별하기 위한 용도로 사용하기 때문에 우리 앱을 부르는 고유한 수단으로 사용할 수 있다. + +아래의 사진처럼 모바일 기기에서 URL Scheme 링크를 클릭했을때 앱이 캐치하여 반응하게 만들수 있다. + +![URL_Scheme](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwXvN6%2FbtqWdatijyy%2FjtQAPdj6s4Y8dq0RGgbsUK%2Fimg.png) + +우린 Android의 Manifest.xml의 intent filter에 대해서 알고 있을것이다. + +Android의 Activity가 명시적 인텐트가 아닌 암시적 인텐트로 실행되기 위해 사용되는 태그이다. + +![intent_filter](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzqJc8%2FbtqWx5D4hOI%2FxKEC4nK2SVlsN5kksqBsh1%2Fimg.png) + +보면 위의 data 태그에 URL Scheme을 정의할 수 있다. scheme는 mashup, host는 deeplink로 정의하면, +mashup://deeplink 가 우리 앱의 딥 링크로 설정된 것이다. + +## URL Scheme 값 전달 +mashup://deeplink?date=20210206&message=전체 세미나 + +URL 파라미터처럼? 뒤에 매개변수 데이터를 전달하고 앱에서 받는 상황이 있을 수 있다. + +위의 웹툰 DeepLink 예시를 보아도 더복서 웹툰 작가 등등 동일한 DeepLink의 다른 작가를 화면으로 보여주어야 할 때 매개변수가 필요할것이다. + +```kotlin +override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.main) + + val action: String? = intent?.action + val data: Uri? = intent?.data + + if (action == Intent.ACTION_VIEW) { + val date = data?.getQueryParameter("date") //20210206 + val message = data?.getQueryParameter("message") //전체 세미나 + + ... + } + } +``` + +## URL Scheme의 한계점 +URL Scheme 방식의 DeepLink는 마켓 앱의 수가 상대적으로 적었던 시기에는 문제없이 사용할 수 있었지만, +앱 수가 증가하면서 생각하지 못한 문제가 발생하기 시작했다. 바로 앱 Scheme 값이 서로 중복되는 경우에 대한 문제이다. + +![Duplicate](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxIQ9E%2FbtqWx6C4gij%2FirAkEokuf9Z7WMgugtNVlk%2Fimg.png) + +Google Play 스토어 앱은 자신들의 앱에서 market:// 사용 중이었는데, 이후 원스토어와 Galaxy Store도 동일한 URL Scheme를 사용하게 되었다고 한다. + +유명한 앱의 스킴 값을 알아내서 동일한 스킴으로 앱을 배포를 하는 사람들이 늘어나게 되면서 유명한 앱들이 골치 아프게 된 것 이다. + +![App_Scheme](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTH06%2FbtqWc8I7UAc%2F4SK4fvTInjcxQ0aKW5W8i1%2Fimg.png) + + +동일한 URL Scheme을 사용하여 DeepLink를 클릭하게 되면 위와 같은 화면이 보이게 되는데 여기서 사용자가 market:// 에 대한 DeepLink를 통해 열리는 앱을 원스토어로 고정하는 순간 Google Play Store 앱과 Galaxy Store 앱은 이후 딥 링크의 기능을 잃어버리게 된다. + +URL Scheme 방식은 정말 간단한 게 DeepLink를 추가하는 방법이었지만, 간단한 만큼 다른 앱들도 동일하게 추가할 수 있다는 단점이 생겨버린 방식이였다. + +
+
+
+ +## AppLink +--- +위의 URL Scheme의 한계점을 해결하기 위해 나온 AppLink에 대해서 알아보겠다. + +AppLink 2015년도에 Google/IO에서 발표한 기술이다. 바로 이 AppLink가 Scheme값이 중복되는 문제를 해결했다. + +App Link는 http, https로 Scheme를 제한해서 URL Scheme 자체가 하나의 도메인을 나타나게끔 변경했는데 그로 인해 URL Scheme에서 자유롭게 정의했던 market:// 이나 Line:// 형식은 사용할 수 없다. + +예를 들어 스마트폰 브라우저 앱 주소창에 http://naver.com 을 입력하면 네이버 앱이 바로 오픈되어 사용할 수 있게 하는 것이 AppLink라고 보면 편할 것 이다. 안드로이드에서는 Manifest 파일에서 + +![AppLink](https://help.dfinery.io/hc/article_attachments/360052990633/mceclip0.png) + +이렇게 도메인을 등록 가능하다. + +하지만 안타깝게도 앱링크가 아직까지는 완전하지 않다. 모든 앱에서 앱링크 오픈을 지원하는 것이 아니기 때문이다. + +앱링크는 구글에서 만든 앱에서만 동작하고, 구글 이외에 앱에서는 정상적으로 동작하지 않습니다. \ No newline at end of file