헤드리스 Oracle Content Management로 Android용 블로그 앱 구축
소개
Java 또는 Kotlin을 사용하는 Android 개발 환경은 Oracle Content Management의 콘텐츠를 소비하는 애플리케이션을 구축하기 위한 강력한 도구입니다. 올바른 콘텐츠 모델을 통해 일반적인 블로그 앱을 구성하는 Android 사용자 인터페이스를 빠르게 구축할 수 있습니다.
이 자습서에서는 Oracle Content Management를 헤드리스 CMS로 활용하여 Kotlin을 사용하여 Android용 간단한 블로그 애플리케이션을 구축합니다. 이 Android 샘플은 GitHub에서 사용할 수 있습니다.
이 자습서는 세 개의 단계로 구성됩니다.
필요 조건
이 자습서를 계속하기 전에 먼저 다음 정보를 읽는 것이 좋습니다.
이 자습서를 따르려면 다음이 필요합니다.
- Oracle Content Management 구독
- 콘텐츠 관리자 롤이 있는 Oracle Content Management 계정
- Android 툴링이 구성된 Windows 또는 Mac 컴퓨터
- 이 자습서에서는 Kotlin을 사용하여 일반적인 Android 개발 개념에 익숙하다고 가정하므로 Kotlin 및 Android 프로그래밍에 대한 기존 지식
구축 중인 솔루션
우리의 블로그 앱은 방문자가 주제로 구성된 블로그 기사를 탐색 할 수있는 세 개의 화면으로 구성되어 있습니다. 첫 번째 화면인 홈 화면은 블로그 주제 목록으로 구성됩니다.
구축 중인 내용을 살펴보려면 Oracle Content Management의 콘텐츠를 소비하는 기본 Android 블로그 애플리케이션인 자습서의 최종 상태를 확인하십시오.
이 자습서 끝에는 홈 화면이 표시됩니다.

두번째 페이지인 항목 화면에는 항목에 속한 각 블로그 문서의 미리보기가 표시됩니다. 개별 항목 화면이 표시되는 방식은 다음과 같습니다.

마지막으로 기사 화면은 블로그의 작성자에 대한 정보를 포함하여 최종 블로그 문서를 렌더링합니다. 다음은 개별 문서 페이지가 표시되는 방법입니다.

계속하려면 Oracle Content Management에 대한 활성 구독이 있어야 하며 콘텐츠 관리자 역할로 로그인해야 합니다.
작업 1: Oracle Content Management 준비
Oracle Content Management 인스턴스가 아직 없는 경우 빠른 시작을 참조하여 Oracle Cloud에 등록하고, Oracle Content Management 인스턴스를 프로비전하고, Oracle Content Management를 헤드리스 CMS로 구성하는 방법을 알아보십시오.
이 자습서에서는 두 가지 방법 중 하나로 콘텐츠 모델을 생성해야 합니다. 빈 저장소를 콘텐츠 유형 및 연관된 콘텐츠로 채우거나 고유의 콘텐츠 모델 및 콘텐츠를 생성할 수 있는 다운로드 가능한 자산 팩이 있습니다.
Oracle Content Management를 준비하려면 다음을 수행합니다.
- 채널 및 자산 저장소를 생성합니다.
- 두 가지 방법 중 하나를 사용하여 콘텐츠 모델을 생성합니다.
- 방법 1: Oracle Content Management 샘플 자산 팩 임포트
- 방법 2: 고유한 콘텐츠 모델 생성
채널 및 자산 저장소 생성
콘텐츠를 게시할 수 있도록 먼저 Oracle Content Management에서 채널 및 자산 저장소를 생성해야 합니다.
Oracle Content Management에서 채널 및 자산 저장소를 생성하려면 다음을 수행합니다.
Oracle Content Management 웹 인터페이스에 관리자로 로그인합니다.
왼쪽 탐색 메뉴에서 콘텐츠를 선택한 다음 페이지 헤더의 선택 목록에서 채널 게시를 선택합니다.

오른쪽 맨 위에서 생성을 눌러 새 채널을 생성합니다. 이 자습서의 목적을 위해 채널 이름을 'OCEGettingStartedChannel'로 지정하고 액세스 권한을 공용으로 유지합니다. 저장을 눌러 채널을 생성합니다.

왼쪽 탐색 메뉴에서 콘텐츠를 선택한 다음 페이지 헤더의 선택 목록에서 저장소를 선택합니다.
![이 이미지는 [콘텐츠] 페이지 머리글의 드롭다운 메뉴에서 선택된 [저장소] 옵션을 보여줍니다. 이 이미지는 [콘텐츠] 페이지 머리글의 드롭다운 메뉴에서 선택된 [저장소] 옵션을 보여줍니다.](./images/repositories.png)
오른쪽 맨 위에서 생성을 눌러 새 자산 저장소를 생성합니다. 이 자습서의 목적을 위해 자산 저장소의 이름을 'OCEGettingStartedRepository'로 지정합니다.

게시 채널 필드에서 OCEGettingStartedRepository 저장소의 콘텐츠를 OCEGettingStartedChannel 채널에 게시할 수 있음을 Oracle Content Management에 나타낼 OCEGettingStartedChannel 채널을 선택합니다. 완료되면 저장을 누릅니다.
![이 이미지는 [게시 채널] 필드에 'OCEGettingStartedChannel'가 있는 저장소 정의 패널을 보여줍니다. 이 이미지는 [게시 채널] 필드에 'OCEGettingStartedChannel'가 있는 저장소 정의 패널을 보여줍니다.](./images/create-repository-2.png)
콘텐츠 모델 생성
다음 단계는 컨텐트 모델을 생성하는 것입니다. 두 가지 방법 중 하나를 사용할 수 있습니다.
- 방법 1: Oracle Content Management 샘플 자산 팩 임포트
- 방법 2: 고유한 콘텐츠 모델 생성
Oracle Content Management 샘플 자산 팩 임포트
이 자습서에 필요한 모든 콘텐츠 유형 및 자산이 포함된 미리 구성된 Oracle Content Management 샘플 자산 팩을 다운로드할 수 있습니다. 원하는 경우 샘플 자산 팩을 다운로드하지 않고 고유한 콘텐츠 모델을 생성할 수도 있습니다.
Oracle Content Management 샘플 자산 팩에서 이 자습서에서 사용 중인 콘텐츠 사본을 업로드할 수 있습니다. 이렇게 하면 컨텐트 유형을 테스트하고 컨텐트를 수정할 수 있습니다. Oracle Content Management 샘플 자산 팩을 임포트하려면 자산 팩 아카이브 OCESamplesAssetPack.zip를 다운로드하고 선택한 디렉토리로 추출합니다.
Oracle Content Management 다운로드 페이지에서 Oracle Content Management 샘플 자산 팩(OCESamplesAssetPack.zip)을 다운로드합니다. 다운로드한 zip 파일을 컴퓨터의 위치로 추출합니다. 추출 후 이 위치에는 OCEGettingStarted_data.zip라는 파일이 포함됩니다.
Oracle Content Management 웹 인터페이스에 관리자로 로그인합니다.
왼쪽 탐색 메뉴에서 콘텐츠를 선택한 다음 페이지 헤더의 선택 목록에서 저장소를 선택합니다. 이제 OCEGettingStartedRepository을 선택하고 최상위 작업 표시줄에서 콘텐츠 임포트 단추를 누릅니다.

로컬 컴퓨터에서 OCEGettingStarted_data.zip을 문서 폴더로 업로드합니다.

업로드가 완료되면 OCEGettingStarted_data.zip을 선택하고 확인을 눌러 콘텐츠를 자산 저장소로 임포트합니다.
![이 이미지는 [확인] 단추가 사용으로 설정된 선택된 OCEGettingStarted_data.zip 파일을 보여줍니다. 이 이미지는 [확인] 단추가 사용으로 설정된 선택된 OCEGettingStarted_data.zip 파일을 보여줍니다.](./images/import-content-3.png)
콘텐츠를 성공적으로 임포트한 후 자산 페이지로 이동하고 OCEGettingStartedRepository 저장소를 엽니다. 이제 모든 관련 이미지 및 콘텐츠 항목이 자산 저장소에 추가되었습니다.

왼쪽 상단에서 모두 선택을 누른 다음 게시를 눌러 이전에 생성한 게시 채널 OCEGettingStartedChannel에 임포트된 모든 자산을 추가합니다.
![이 이미지는 모든 자산이 선택되고 작업 표시줄에 [게시] 옵션이 표시된 OCEGettingStartedRepository 저장소를 보여줍니다. 이 이미지는 모든 자산이 선택되고 작업 표시줄에 [게시] 옵션이 표시된 OCEGettingStartedRepository 저장소를 보여줍니다.](./images/publish-assets.png)
게시하기 전에 모든 자산을 검증해야 합니다. 먼저 OCEGettingStartedChannel을 선택한 채널로 추가한 다음 검증 버튼을 누릅니다.
![이 이미지는 [검증 결과] 페이지에서 OCEGettingStartedChannel 채널이 [채널] 필드에 추가되고, 검증할 모든 자산 및 [검증] 단추가 사용으로 설정된 모습을 보여줍니다. 이 이미지는 [검증 결과] 페이지에서 OCEGettingStartedChannel 채널이 [채널] 필드에 추가되고, 검증할 모든 자산 및 [검증] 단추가 사용으로 설정된 모습을 보여줍니다.](./images/validate-assets-1.png)
자산이 검증된 후 오른쪽 맨 위에 있는 게시 단추를 눌러 선택한 채널에 모든 자산을 게시할 수 있습니다.
![이 이미지는 OCEGettingStartedChannel 채널이 [채널] 필드에 추가되고 모든 자산이 검증되었으며 [게시] 단추가 사용으로 설정된 [검증 결과] 페이지를 보여줍니다. 이 이미지는 OCEGettingStartedChannel 채널이 [채널] 필드에 추가되고 모든 자산이 검증되었으며 [게시] 단추가 사용으로 설정된 [검증 결과] 페이지를 보여줍니다.](./images/validate-assets-2.png)
완료되면 자산 페이지에서 모든 자산이 게시되었음을 확인할 수 있습니다. 자산 이름 위의 아이콘으로 알 수 있습니다.
![이 이미지는 모든 자산이 게시된 [자산] 페이지를 보여줍니다. 이 이미지는 모든 자산이 게시된 [자산] 페이지를 보여줍니다.](./images/assets-page-with-published-assets.png)
Oracle Content Management 샘플 자산 팩을 임포트한 후 Android에서 블로그 구축을 시작할 수 있습니다.
고유한 콘텐츠 모델 생성
Oracle Content Management 샘플 자산 팩 임포트 대신 고유한 콘텐츠 모델을 생성할 수도 있습니다.
이 자습서에서는 'OCEGettingStartedHomePage'라는 콘텐츠 유형을 사용하여 블로그의 홈 화면을 작성합니다. 이 홈 페이지는 화면에 포함되어야 하는 블로그 항목 목록으로 구성됩니다.

콘텐츠 모델에 대한 콘텐츠 유형을 생성하려면 다음을 수행합니다.
- Oracle Content Management 웹 인터페이스에 관리자로 로그인합니다.
- 왼쪽 탐색 메뉴에서 콘텐츠를 선택한 다음 페이지 헤더의 선택 목록에서 자산 유형을 선택합니다.
- 오른쪽 상단 모서리에 있는 생성을 누릅니다.
- 콘텐츠 유형(디지털 자산 유형이 아님)을 생성하도록 선택합니다. 모든 필수 콘텐츠 유형에 대해 이 작업을 반복합니다.

각각 고유한 필드 세트를 사용하여 네 가지 콘텐츠 유형을 생성합니다.
- OCEGettingStartedHomePage
- OCEGettingStartedTopic
- OCEGettingStartedAuthor
- OCEGettingStartedArticle
첫번째 컨텐츠 유형 OCEGettingStartedHomePage에는 다음 필드가 있어야 합니다.
| 표시 이름 | 필드 유형 | 필수 | 시스템 이름 |
|---|---|---|---|
| 회사 이름 | 단일 값 텍스트 필드 | X | company_name |
| 회사 로고 | 단일 값 텍스트 필드 | X | company_logo |
| 항목 | 다중 값 참조 필드 | X | 항목 |
| 담당자 URL | 단일 값 텍스트 필드 | X | contact_url |
| URL 정보 | 단일 값 텍스트 필드 | X | about_url |
OCEGettingStartedHomePage 콘텐츠 유형 정의는 다음과 같아야 합니다.

두번째 컨텐츠 유형 OCEGettingStartedTopic에는 다음 필드가 있어야 합니다.
| 표시 이름 | 필드 유형 | 필요 | 시스템 이름 |
|---|---|---|---|
| 작은 그림 | 단일 값 이미지 필드 | X | 작은 그림 |
OCEGettingStartedTopic 콘텐츠 유형은 다음과 같아야 합니다.

세번째 콘텐츠 유형 OCEGettingStartedAuthor에는 다음 필드가 있어야 합니다.
| 표시 이름 | 필드 유형 | 필요 | 시스템 이름 |
|---|---|---|---|
| 아바타 | 단일 값 이미지 필드 | X | 아바타 |
OCEGettingStartedAuthor 콘텐츠 유형은 다음과 같아야 합니다.

네번째 및 최종 콘텐츠 유형인 OCEGettingStartedArticle에는 다음 필드가 있어야 합니다.
| 표시 이름 | 필드 유형 | 필수 | 시스템 이름 |
|---|---|---|---|
| 게시 일자 | 단일 값 날짜 필드 | X | published_name |
| 작성자 | 단일 값 참조 필드 | X | 저자 |
| 이미지 | 단일 값 이미지 필드 | X | 이미지 |
| 이미지 캡션 | 단일 값 텍스트 필드 | X | image_caption |
| 문서 콘텐츠 | 단일 값 큰 텍스트 필드 | X | article_content |
| 주제 | 단일 값 참조 필드 | X | 항목 |
OCEGettingStartedArticle 콘텐츠 유형은 다음과 같아야 합니다.

콘텐츠 유형을 생성한 후에는 이전에 생성한 저장소 OCEGettingStartedRepository에 해당 콘텐츠 유형을 추가할 수 있습니다.
- Oracle Content Management 웹 인터페이스에 관리자로 로그인합니다.
- OCEGettingStartedRepository로 이동합니다.
- 저장소를 편집하고 자산 유형에서 4개의 새로 생성된 콘텐츠 유형을 모두 지정합니다. Save 버튼을 눌러 변경 사항을 저장합니다.
![이 이미지는 Oracle Content Management의 [저장소 편집] 페이지에서 OCEGettingStartedRepository 저장소와 연관된 새로 생성된 콘텐츠 유형 4개를 보여줍니다. 이 이미지는 Oracle Content Management의 [저장소 편집] 페이지에서 OCEGettingStartedRepository 저장소와 연관된 새로 생성된 콘텐츠 유형 4개를 보여줍니다.](./images/repository-with-asset-types.png)
저장소에 콘텐츠 유형을 추가한 후 자산 페이지에서 OCEGettingStartedRepository 저장소를 열고 모든 콘텐츠 유형에 대한 콘텐츠 항목 생성을 시작할 수 있습니다.

작업 2: Android에서 블로그 응용 프로그램 구축
Android 애플리케이션에서 Oracle Content Management 콘텐츠를 사용하려면 GitHub에서 오픈 소스 저장소로 제공되는 Kotlin으로 작성된 Android 블로그 샘플을 사용할 수 있습니다.
참고: Android 샘플 사용은 선택 사항이며 이 자습서에서 사용되므로 빠르게 시작할 수 있습니다. SDK와 호환되므로 Java 또는 Kotlin에서 자체 Android 애플리케이션을 구축할 수도 있습니다.
Android에서 블로그 구축은 다음 단계로 구성됩니다.
- 샘플 저장소 및 Android SDK를 복제하고 SDK를 로컬에 게시합니다.
- Android 애플리케이션 구성
- Oracle Content Management REST API를 사용하여 콘텐츠 인출
샘플 저장소 및 Android SDK를 복제하고 SDK를 로컬로 게시합니다.
Android 블로그 샘플은 GitHub에서 오픈 소스 저장소로 사용할 수 있습니다.
아직 복제하지 않은 경우 먼저 GitHub의 샘플을 로컬 컴퓨터와 GitHub의 Android SDK로 복제해야 합니다.
샘플 코드와 SDK가 있는 경우 샘플 프로젝트에서 Android SDK를 사용하려면 샘플 프로젝트에서 사용할 수 있도록 로컬 Maven 저장소에 SDK를 빌드하고 게시해야 합니다. Android Studio에서 Android SDK 프로젝트를 열고 publishToMavenLocal 작업을 실행하여 SDK를 빌드하고 로컬 Maven 저장소에 게시합니다.
Android Studio에서 Android 샘플 열기
Android 응용 프로그램과 마찬가지로 Android Studio로 가져와 Android 에뮬레이터 또는 장치에서 빌드하고 실행할 수 있도록 해야 합니다. 샘플 코드는 이미 서버 및 블로그 응용 프로그램의 데이터를 얻는 데 사용되는 게시 채널로 미리 구성되어 있습니다.
Oracle Content Management REST API를 사용하여 콘텐츠 인출
콘텐츠 전달을 위한 REST API는 Oracle Content Management에서 게시된 자산에 대한 접근 권한을 제공합니다. 게시된 자산에는 콘텐츠 항목 및 디지털 자산과 해당 표현이 포함됩니다. 이제 콘텐츠 관리를 위한 REST API를 활용하여 콘텐츠를 인출하여 블로그 애플리케이션에서 렌더링할 수 있습니다.
src/.../samples/blog/MainActivity.kt 파일에는 REST API를 호출하는 데 사용되는 ContentDeliveryClient 객체를 생성하는 함수가 있습니다. 아래 함수는 샘플 애플리케이션에서 사용되는 값을 표시하는 함수의 단순화된 버전입니다.
fun createDeliveryClient() {
// preferences for cache
val cacheEnabled = true
// the server url and channel token for blog data
val serverUrl = "https://ocemobile-oce0002.cec.ocp.oraclecloud.com"
val channelToken = "b9ea60be0abf7255934cd2202fcf1314"
val settings = ContentSettings()
if (cacheEnabled) {
// enable caches, using default settings
settings.enableCache(appContext.cacheDir)
}
// SDK: create client API we'll use to make calls
deliveryClient =
ContentSDK.createDeliveryClient(
serverUrl,
channelToken,
settings)
}블로그 샘플 애플리케이션을 채우기 위해 데이터를 가져오는 데 사용되는 핵심 클래스는 "viewmodel" 패키지 아래에 있으며 "Repository"로 접미어가 붙습니다. 예를 들어, HomePageRepository.kt 파일에는 홈 페이지에 표시된 항목 목록을 포함하여 블로그 응용 프로그램의 홈 페이지에 대한 데이터를 가져오는 메소드가 포함되어 있습니다.
홈페이지 데이터
홈 페이지에 모든 데이터를 가져오려면 다음과 같은 여러 데이터 호출이 필요합니다.
- 먼저 홈 페이지 유형과 일치하는 채널의 항목을 질의합니다.
- 그런 다음 각 항목 항목에 대한 세부 정보를 패치(fetch)합니다.
다음은 SDK를 사용하여 홈 페이지의 데이터를 인출하는 함수입니다. 이 함수는 사용된 값을 표시하지만 예제 응용 프로그램 함수는 상수를 사용합니다.
private fun getHomePage(): HomePage {
// SDK: create search request to get home page
val getHomePageRequest = SearchAssetsRequest(ContentApi.deliveryClient)
.type("OCEGettingStartedHomePage") // search by content type
.name("HomePage") // ...and by content name
.linksNone() // do not include links in the response
.fieldsAll() // do include all fields
val searchResult = getHomePageRequest.fetchResult()
// from the search result, only expect a single home page
val contentItems = searchResult.contentItems
// handle situation where no data is returned
if (contentItems.isNullOrEmpty())
throw ContentException(ContentException.REASON.itemNotFound, "No home page found for type")
// get first itme in home page data
val item = contentItems.first()
// convert list of ids into topic list
val topicList = item.getReferenceListIds("topics").map { Topic(it) }
// grab the topic type from one of the references
topicType = item.getReferenceListField("topics").first().value.type
return HomePage(
companyName = item.getTextField("company_name"),
logoImageUrl = item.getDigitalAssetField("company_logo").getThumbnailUrl(),
contactUrl = item.getTextField("contact_url"),
aboutUrl = item.getTextField("about_url"),
topics = topicList.associateBy { it.id }) // convert list to map
}위의 코드에서 SearchAssetsRequest 객체는 요청을 생성하고 fetchResult() 함수는 아래의 요청과 유사한 동기 REST 호출을 수행하여 홈 페이지 데이터를 가져옵니다.
GET content/published/api/v1.1/items?q=(type eq "OCEGettingStartedHomePage" AND name eq "HomePage")?fields=all&links=none&channelToken={channelToken}
항목 페이지
기사 화면에는 지정된 주제에 대한 모든 문서가 표시됩니다. 홈 페이지와 동일한 패턴을 사용하지만 이번에는 항목 ID가 선택된 항목을 참조하는 OCEGettingStartedArticle 유형의 콘텐츠 항목을 검색합니다. 또한 SDK를 사용하여 비동기 메소드 호출을 수행하는 방법을 보여줍니다. 자세한 내용은 ArticlesRepository.kt 파일을 참조하십시오. 하지만 여기에 사용된 패턴과 값을 보여주는 핵심 방법이 있습니다.
// SDK: create search request to get all the articles
// sort by published_date field in descending order
val searchRequest = SearchAssetsRequest(ContentApi.deliveryClient)
.type("OCEGettingStartedArticle") // get "article" type
.fieldEquals("topic", topicId) // match topic id (e.g. drinks, recipes)
.sortByField("published_date") // sort by published date (optional)
.sortOrderDescending(true)
.linksNone() // no need for links (optional)
// SDK: make request to get articles using async callback method
searchRequest.fetchAsync {response ->
// successful SDK call?
if (response.isSuccess) {
// process the list and display in ui
} else {
// handle error case
}
}
문서 페이지
개별 문서 화면에 단일 문서가 표시되지만 화면에는 별도의 콘텐츠 유형인 작성자의 콘텐츠가 포함됩니다. 하나의 콘텐츠 항목과 참조하는 콘텐츠 항목을 인출하려면 아래와 같이 요청 객체를 생성할 때 expand() 메소드를 사용하여 fields.author를 가져오십시오. 세부정보는 AritcleDetailRepository.kt에 있지만 핵심 코드 패턴은 다음과 같습니다.
// make a call to get the article, expanding the "author" field
val request = GetContentItemRequest(ContentApi.deliveryClient, articleId)
.expand("author") // only expand the author field
.linksNone()
// get the article detail as an asynchronous call
request.fetchAsync {response ->
// successful SDK call?
if (response.isSuccess) {
// process the list and display in ui
} else {
// handle error case
}
}
이제 데이터 쿼리가 있으므로 Android 애플리케이션 UI에서 응답을 렌더링할 수 있습니다.
Android ViewModel 클래스
블로그 응용 프로그램은 표준 ViewModel 안드로이드 응용 프로그램으로 구성되어 있습니다. ViewModel가 Android에서 사용되고 Kotlin에서 구현되는 방법을 설명하는 많은 온라인 리소스가 있습니다.
구성요소 구조
응용 프로그램의 각 화면마다 세 가지 핵심 클래스가 있습니다.
- 데이터 구조를 정의하는 ViewModel 클래스
- SDK 호출을 통해 데이터를 인출하는 Repository 클래스
- ViewModel 클래스를 사용하여 UI를 채우는 Fragment 클래스
예를 들어, 문서 목록 화면의 클래스는 다음과 같습니다.
- ArticlesFragment
- ArticlesViewModel
- ArticlesRepository
작업 3: 배치할 응용 프로그램 준비
이제 Android 블로그 애플리케이션을 구축했으므로 Android Studio의 모바일 에뮬레이터 또는 장치에서 테스트하여 문제를 디버깅하고 애플리케이션을 미리 볼 수 있습니다.
결론
이 자습서에서는 GitHub에서 찾을 수 있는 Android용 블로그 응용 프로그램을 만들었습니다. 이 사이트에서는 Oracle Content Management를 헤드리스 CMS로 사용합니다. 블로그 사이트 자습서에 대해 게시된 콘텐츠 채널로 Oracle Content Management를 설정하고 구성한 후 Android 사이트를 설치 및 실행하여 필요한 콘텐츠를 인출하고 사이트를 구축했습니다.
설명서에서 중요한 Oracle Content Management 개념에 대해 알아보십시오.
Oracle Content Management 샘플 페이지의 Oracle Help Center에서 이와 같은 더 많은 샘플을 찾을 수 있습니다.
헤드리스 Oracle Content Management로 Android용 블로그 앱 구축
F80569-01
2023년 5월
Copyright © 2021, 2023, Oracle and/or its affiliates.
주 저자: Oracle Corporation