[Kotlin] WebRTC 예제 따라하기: android studio iguana 라이브러리(libs) 추가 및 hilt 사용

괄괄이·2024년 4월 25일
0

WebRTC with Kotlin

목록 보기
2/4

SFU 서버를 아직 구축하지 않았기에 P2P 방식으로 WebRTC 영상 통화 방을 구현하는 예제를 따라하고자 한다. 아래의 유튜브 영상을 참고한다.
CodeWithKael:Android Video Call With WebRTC and Firebase

WebRTC 개념 아래로 관련 없는 내용이 나옵니다!

  • pass 권장: webRTC 기능 구현에 관심 있는 분
  • 보시면 좋은 분: kotlin 파일에 libray, plugin 등을 libs 객체를 이용하여 추가하는 방법을 알고 싶은 분

🤔 WebRTC P2P, 서버가 필요하다고?


WebRTC는 실시간으로 네트워크 상의 음성, 영상, 데이터 교환을 할 수 있는 p2p(peer to peer) 기술이다.

서로 다른 네트워크 상의 두 디바이스들이 데이터를 주고 받으려면 각 디바이스의 위치를 찾는 방법과 미디어 포맷의 협의가 필요하다.

디바이스끼리 데이터를 교환할 수 있도록 네트워크 위치, 설정, 미디어 포맷등을 알아내는 과정을 시그널링이라 하며 시그널링 서버가 피어 간의 초기 연결을 돕는다.

(참고: 모질라 signalling and video calling)

WebRTC를 p2p로 연결하면 서버와 같은 중간자를 거치지 않는다. 하지만 시그널링 서버는 필요하다!


💫 Android를 Firebase DB와 연결

(1) Android application에 utils를 생성하고 HiltAndroidApp 도입

  • Hilt를 gradle에 추가하는 단계부터 시작한다.

  • 다른 gradle 추가 예제와 내 android studio 내 표현 방식이 다르다. project, app 수준을 살펴보니 아래와 같다.

  • libs 객체는 libs.versions.toml에서 가져와 사용하는 것으로 보인다. (아래 참고)

잠깐 Hilt는?

  • android에서 DI(의존성 주입)을 도와주는 라이브러리
  • 객체 지향 프로그래밍에서 코드 기능을 분리해서 implements로 사용하게 하던 것을 생각하면 된다.
  • 예를 들면, 휴대폰 안에 배터리가 내장되어 있지 않고 꺼내쓸 수 있다. 그 배터리는 리튬 이온 배터리일 수도 있고, 리튬 폴리머 배터리일 수도 있다. 하지만 종류는 바뀌어도 상관 없다. 휴대폰과는 독립적으로 존재해 필요 시에 넣어서 쓰기 때문이다. 이렇게 DI를 통해 코드를 분리해 확장성과 유연성을 챙길 수 있다.

본론으로 돌아가 의존성 챙기기...

공식 문서를 봐도 예전 구조로 보여서 서칭을 했다.
stackoverflow: how to add hilt dependecies on "libs.versions.toml

  • libs.versions.toml에 versions, libraries, plugins를 명시하고 build.gradle(project, app)에서 이를 가져와 사용하는 것이 맞았다!
  • 아래와 같이 작성했다.
[versions]
...
kspVersion = "1.9.20-1.0.14"
hiltVersion = "2.50"

[libraries]
...
hilt-android = { group = "com.google.dagger", name = "hilt-android" , version.ref = "hiltVersion"}
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler" , version.ref = "hiltVersion"}

[plugins]
...
hiltAndroid = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" }
kotlinAndroidKsp = { id = "com.google.devtools.ksp", version.ref = "kspVersion" }
  • 작성 후에 build.gradle에서 가져와 쓴다.
// build.gradle.kts (project)
plugins {
    alias(libs.plugins.androidApplication) apply false
    alias(libs.plugins.jetbrainsKotlinAndroid) apply false
    alias(libs.plugins.hiltAndroid) apply false
    alias(libs.plugins.kotlinAndroidKsp) apply false
}

// build.gradle.kts (app)
plugins {
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.jetbrainsKotlinAndroid)
    alias(libs.plugins.hiltAndroid)
    alias(libs.plugins.kotlinAndroidKsp)
}

dependencies {
	...
        implementation(libs.hilt.android)
    ksp(libs.hilt.compiler)
}
  • 작성하고 나면 빨간줄이 떠서 놀랄텐데 gradle sync 실행하면 없어진다.

이제 HiltAndroidApp annotation 사용 가능!


Application 클래스를 상속받는 MyApplication을 생성했다. Application 클래스는 앱 전체의 생명주기를 관리하고, 앱 전역에서 접근할 수 있는 데이터나 상태를 관리한다.

(2) AndroidManifest.xml에 위를 추가하고, MainActivity를 LoginActivity로 rename하여 ui 폴더로 이동

// AndroidManifest.xml
    <application
    	        android:name=".utils.MyApplication"
                ... />
               
    </application>

AndroidManifest.xml?

  • Android 빌드 도구, Android 운영체제 및 Google play에 앱의 필수 정보를 설명하는 파일.

android:name은 앱이 실행될 때 가장 먼저 실행시키는 class가 된다. 단, Application을 상속받는 클래스여야 한다.

(3) LoginActivity refactor: AndroidEntryPoint

@HiltAndroidApp → Component 생성
@AndroidEntryPoint → Subcomponent 생성


여기까지 따라하며 Android Studio 라이브러리 추가 방법과 Hilt 라이브러리에 대한 개념을 다소 공부했다. 유튜브는 jetpack compose를 사용하지 않고 있다. ui를 포기하고 기능만 구현하면 상관 없을 것 같아 그대로 하려 했다. 하지만 jetpack compose를 사용하지 않으니 코드 구조가 달라져 여건 상 jetpack compose를 사용하는 예시를 찾아 따라하는 게 낫겠다고 판단했다. (현재 kotlin 기초 공식 강의 일부만 본 상태, 프로젝트 진행이 시급하다.)

앞 부분 library 관련 내용은 추후에도 사용할 것 같으니 기록을 남겨둔다!

0개의 댓글