Nuke Olaf - Log Store

[Android] 안드로이드 - Content Provider (컨텐트 프로바이더) 본문

Android

[Android] 안드로이드 - Content Provider (컨텐트 프로바이더)

NukeOlaf 2019. 11. 23. 22:04

안드로이드의 4대 컴포넌트 중에는 '컨텐트 프로바이더'라는 것이 있다.

Content Provider

content는 내용물, provider는 제공자라는 뜻이다.

좀 더 자세하게 단어의 뜻을 알아보자면, 

content : the things that are held or included in something.

provider : a person or thing that provides something.

즉, "무언가에 포함되거나 포함된 내용물들을 제공하는 것"이라고 해석할 수 있다.

 

content provider를 안드로이드에서는 어떻게 정의하는 지 알아보자.

https://developer.android.com/reference/android/content/ContentProvider

" Content providers are one of the primary building blocks of Android applications, providing content to applications. They encapsulate data and provide it to applications through the single ContentResolver interface. A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don't need to share data amongst multiple applications you can use a database directly via SQLiteDatabase. "

컨텐트 프로바이더는 Android 애플리케이션의 기본 빌딩 블록 중 하나이며 컨텐츠를 애플리케이션에 제공합니다. 데이터를 캡슐화하여 단일 ContentResolver 인터페이스를 통해 애플리케이션에 제공합니다. 콘텐츠 공급자는 여러 응용 프로그램간에 데이터를 공유해야하는 경우에만 필요합니다. 예를 들어 연락처 데이터는 여러 응용 프로그램에서 사용되며 콘텐츠 공급자에 저장해야합니다. 여러 응용 프로그램간에 데이터를 공유 할 필요가없는 경우 SQLiteDatabase를 통해 데이터베이스를 직접 사용할 수 있습니다.

" When a request is made via a ContentResolver the system inspects the authority of the given URI and passes the request to the content provider registered with the authority. The content provider can interpret the rest of the URI however it wants. The UriMatcher class is helpful for parsing URIs. "

" ContentResolver를 통해 요청이 이루어지면 시스템은 주어진 URI의 권한을 검사하고 권한으로 등록 된 컨텐츠 제공자에게 요청을 전달합니다. 컨텐츠 제공자는 원하는 나머지 URI를 해석 할 수 있습니다. UriMatcher 클래스는 URI 구문 분석에 도움이됩니다. "

https://acadgild.com/blog/content-provider-in-android

컨텐트 프로바이더는 데이터베이스의 세부 정보를 숨기는 구성요소이다.

응용 프로그램이 여러 응용 프로그램과 데이터를 공유할 수 있게 한다.

즉, 이미지/동영상/텍스트 등의 내 앱이 가지고 있는 컨텐츠 정보를 다른 앱에 제공해주는 역할을 한다.

 

< 컨텐트 프로바이더는 왜 생겨난 것이고, 어떻게 사용하는 것일까? >

http://blog.naver.com/PostView.nhn?blogId=fire5000&logNo=147248830

안드로이드 시스템에서는 각 애플리케이션마다 각각의 DB를 가질 수 있다. 그리고 애플리케이션 내부의 DB는 해당 애플리케이션만 접근이 가능하다. 이러한 접근권한 정책은 보안때문에 생겨난 것이다. 다른 애플리케이션에게 DB가 전부 공개된다면 그만큼 보안이 취약해 질 수 밖에 없기 때문이다. 만약 아무 앱이나 다른 앱의 DB에 접근할 수 있어서, 내 카카오톡 대화 내용을 이상한 앱에서 가져와서 마음대로 쓸 수 있다면? 상상만 해도 끔찍하다. 하지만, 애플리케이션 DB에 접근할 방법이 전혀 없는 것도 문제가 될 수 있다. 애플리케이션끼리 서로 데이터를 공유할 수 없게 되기 때문이다. 나는 인스타그램에 사진을 올리고 싶어도 인스타그램이 내 갤러리 애플리케이션의 DB에 접근 할 수 없으므로 사진을 업로드할 수 없다.

그래서, 안드로이드 시스템은 애플리케이션 내부 DB에 대해 해당 애플리케이션만 접근 가능한 보안성

다른 애플리케이션에서도 DB에 접근할 수 있도록 유연함을 제공하기 위해

컨텐트 프로바이더 (Content Provider) 클래스를 제공한다

그림처럼 외부 애플리케이션이 특정 애플리케이션의 DB 정보가 필요한 경우,

외부 애플리케이션은 Content Resolver를 통해 Uri를 애플리케이션에게 보내고,

해당 애플리케이션의 Content Provider가 Uri를 해석하여 필요한 DB 작업을 하게 된다.

이때, Uri를 전달받은 Content Provider는 기본적인 CRUD(create, read, update, delete)연산을 모두 처리 가능하다.

Content Provider는 필요한 작업을 모두 수행하고, 결과값을 Content Resolver에게 반환해 준다.

 

이렇게, 컨텐트 프로바이더와 컨텐트 리졸버를 사용함으로서 안드로이드는 외부 애플리케이션과 데이터베이스를 공유하면서도, 직접적인 접근을 차단할 수 있다.

Content Provider와 Content Resolver는 Uri로 통신하게 되므로, Content Provider가 사용하는 Uri의 구성요소를 살펴보아야 한다. (참고 : https://developer.android.com/guide/topics/providers/content-providers

https://choidev-1.tistory.com/56

https://unikys.tistory.com/349 

 

[Android(안드로이드) 앱 개발 기초] ContentProvider 앱 간 데이터 공유 기본

* DB로 직접 접근하기 vs ContentProvider 사용하기? : 안드로이드에서는 기본적으로 SQLite를 사용할 수 있도록 API를 다양하게 편리하게 제공해주고 있다. 하지만, 이러한 SQLite는 기본적으로 해당 DB를 생성한..

unikys.tistory.com

 

Comments