안드로이드

안드로이드 - 서버연동

베노 2021. 11. 11. 21:35

안드로이드 앱 제작은 채팅앱 기준으로 작성을 한다. 

채팅앱 만들때는 기본적으로 서버가 있어야 하고, 그 서버에서 데이터를 받거나 보내줘서 통신을 한다. 

 

나는 능력이 없어서 서버쪽 개발은 못한다.

물론 서버도 장비가 있어야 한다.

 

가격은 내 몸값보다 더 비싸다.

 

 

 

FIREBASE

이러한 부분을 해결하고자 구글의 서버같은 서비스가 있다. 파이어베이스

파이어베이스는 개발자들의 큰 사랑을 받고 있다. 물론 내 생각

파이어베이스회사가 만든 서비스로 구글이 인수했다. 앱개발자들이라면 아마 들어봤을거다. 

우리는 이 파이어베이스를 이용하여 채팅 앱을 개발 할 거다.

 

파이어베이스는 https://firebase.google.com/ 사이트로 접속할 수 있다. 여기서 계정으로 로그인 하여 프로젝트를 생성하자.

 

 

 

사이트에 접속하면 "시작하기"를 누르고  프로젝트를 추가한다.

 

프로젝트이름은 본인이 편한걸로 하면 된다.

 

 

 

 

 

나는 "Myproject"를 이름 붙였고 Myproject이름 밑 부분에 myproject-dd3eb라는 이름이 있다. 이거는 나중에 이 프로젝트로 호스팅도 가능한데 호스팅 (도메인)주소가 된다. 저 부분을 눌러서 수정이 가능하며 본인이 편한걸로 수정하면 된다.

계속을 누르면 된다

 

 

이 프로젝트에서 Google 애널리틱스 사용 설정 을 해서 프로젝트와 연동한 플랫폼에 추가적인 관리할수있는 기능을 추가한다.

 

 

 

계정은 선택해서 마무리 지으면 된다. 계정은 Default Account for Firebase 는 비추하고 새 계정을 만들면 된다.

 

 

마지막 단계까지 다 했으면 프로젝트가 생성이 된다.

 

 

이게 프로젝트의 메인화면이다. 왼쪽에 메뉴가 많은데 여기서 우리가 사용할거는 앱 만들면서 설명하고, 추가적인건 우리가 사용할 메뉴를 다 사용하고나서 맨 마지막에 설명할거다.

 

 

 

우리가 먼저 사용할 메뉴는 "Remote Config" 메뉴이다.

 

 

 

 

 

 


안드로이드 스튜디오와 파이어베이스 연동


 

이제 만들었던 프로젝트와 안드로이드 스튜디오와 연동을 해서 앱 개발을 하면 된다.

 

 

이 부분에서 가운데쯤 하얀색으로 되어있는  iOS, 안드로이드 모양, </>아이콘이 있는데 안드로이드 아이콘을 누르면 된다.

 

 

 

안드로이드 패키지는 안드로이드 프로젝트에서 만들었던 패키지명. 앱 닉네임은 파이어베이스 프로젝트에서 보이는 닉네임이다.  디버그 서명인증은 안드로이드 스튜디오에서 발급 받아야 한다.

 

 

디버그 서명인증 (SHA-1)

여기서 sha-1은 암호학적 함수들의 모임이다. 안드로이드에서 앱 사용하다보면 민감한 개인정보들이 오고가는데 이때 sha-1을 통해 사용한다. 파이어베이스에서도 이 부분을 사용한다.

 

먼저 안드로이드 스튜디오에서 발급받아야 한다.

 

빨간색 네모부분쪽 Gradle을 누르면 사이드바가 나온다.

여기서 경로대로 가면 된다. My Application -> App -> Tasks -> android -> signingReport

signingReport를 더블 클릭하면 밑에서 뭔가 나오는데 로딩이 끝날때까지 기다리면 된다.

 

 

 

 

빨간부분은 민감한 부분이라...ㅎㅎ

여기서 SHA1값을 복사한 후 붙여놓으면 된다.

 

그런 다음 앱등록을 하면 된다.

하면 파이어베이스 프로젝트가 우리가 입력값 바탕으로 구성파일을 만들어준다. 얘를 다운받자.

 

 

구성파일은 이름변경을 하면 안된다.

 

 

해당 파일은 루트, 즉 app경로에 넣어야 한다.

윈도우 파일탐색기를 열어서 "안드로이드 프로젝트" -> app쪽에다가 붙여넣는다.

 

그 다음은 추가적인 구성설정만 하면 된다.

 

Gradle Script쪽에 보면 build.gradle이라는 파일이 2개가 뜨는데 여기 두개의 파일에 설정값을 넣어줘야 한다. 

파일 이름옆에 보면 회색으로 모듈과 프로젝트라고 되어있으니 이 부분을 참고하면 될거같다.

 

 

classpath 'com.google.gms:google-services:4.3.10'  : 복사 후 붙여넣기

 

 

apply plugin: 'com.google.gms.google-services'

implementation platform('com.google.firebase:firebase-bom:29.0.0')
implementation 'com.google.firebase:firebase-analytics-ktx'

사진을 참고하여 복사 후 붙여넣기 하면 된다. 다 했으면 위쪽 파란색부분에 "Sync Now"를 눌러 추가한걸 새로고쳐준다.

 

하다보니 오류가 났다. 구글이 하라는데로 했는데 뭐가 문제임..

 

 

살펴보니 문법오류다.

다른거는 id라고 적혀있는데 밑부분, 구글이 붙여넣으라는게 apply plugin: 으로 되어있다. 얘를 id로 바꾸면 돤다.

 

 

문제없이 빌드가 됬다.

 

아 빌드는 맨 위 초록색 망치가 빌드, 즉 검사? 같은거다. 우리가 한거를 빌드해주는거다,

 

이제 모든 준비는 다 끝났다, 본격적으로 앱 개발에 들어가 보자,

 

 


안드로이드 개발


 

다시 안드로이드 스튜디오로 돌아와서 새로운 엑티비티를 생성하자.

안드로이드에서 새로운 화면을 추가할려면 엑티비티를 추가하면 된다.

 

 

res가 resource의 약어로 이미지, 폰트, 엑티비티를 관리하는 폴더다. 첫번째 옆에 삼각형이 있는 res를 눌러서 엑티비티를 추가하자. res -> layout에서 마우스 오른쪽 클릭 후 "New"를 누르면 된다.

 

엑티비티에서 Empty Activity로 추가한다.

 

 

Activity Name은 본인이 만들어주면 된다.

SplashActivity로 이름을 지어줬다. 

 

 

 

스플레쉬

스플레시는 앱 실행하기전 필요한 데이터를 동기화 할때까지 보여주는거다. 대부분 회사로고 및 앱 로고로 해준다.

네이버앱, 카카오톡 같이 앱을실행하면 바로 뜨는 첫번째가 스플레시이다.

우리도 따라해보자.

 

앱을 만들었으면 아래부분 뭔가뜨는데 이거는 스튜디오에서 자동으로 만들어주는거다. 다 될때까지 기다려주면 된다.

 

그 다음 우리가 만든 스플레쉬를 맨 처음 앱 화면으로 지정 해 줘야 한다. 

 

 

맨 위에 Manifests를 더블클릭 한다.

 

 

매니페스트 파일

안드로이드에서 메니페스트는 여러가지 정보를 담는 파일이라고 보면 된다. 특히 권한, 엑티비티 지정등 해주는거다.

여기서 우리가 만든 스플레시를 수정하자.

 

xml형태로 되어있는데 이거는 디자인부분에서 다시 다뤄보도록 하고 코드를 해석해보자.

<activity>태그는 엑티비티가 만들어지면 자동으로 추가된다. 

<intent-filter>는 인텐트를 통해 어느앱을 사용할것인지 선택하는 태그

<action android:name="android.intent.action.MAIN" />은 이 태그가 들어간 부분을 시작 엑티비티를 지정해준다는것

<category android:name="android.intent.category.LAUNCHER" />은 애플리케이션에서 가장 먼저 싱행되는 엑티비티

 

즉 시작 엑티비티를 지정 해 주고 걔를 먼저 실행해주게 한다는것.

 

우리가 추가했던 Splash를 시작 엑티비티를 지정해주면 된다.

이렇게 수정해 주면 스플레시 엑티비티는 앱 실행했을때 맨 처음으로 나오게 된다.

 

그 다음 스플레시 디자인을 수정해주면 된다

res > layout > activity_splash.xml 파일을 수정하면 된다.

 

 

화면 수정 xml

xml은 마크업 언어로 html과 같은 과다. xml은 주로 다른 시스템 및 인터넷에 연결된 시스템끼리 데이터를 넘겨주거나 받는걸 해주는 녀석이다. 안드로이드앱은 보통 서버에서 데이터를 넘겨받아서 화면에 할당해줘야 정보를 확인할수있다. 예를들면 회원닉네임, 나이, 성별 등

그래서 xml으로 쓰이는거다.

 

마크업언어로 태그라는 개념이 있다.

 

 


디자인 수정하기


위에서 레이아웃쪽까지 갔으면 사진처럼 뜰것이다.

보통 이렇게 생겼지만 지금은 빈 공간이다. 아까전에 만들때 "Empty Activity"로 했고, 당연히 빈공간이 나오는게 맞다.

여기서 우리가 직접 코딩해주면 된다.

 

이쪽에서 split부분을 눌러준다. 이거는 코딩하면서 디자인이 변경되는걸 실시간으로 볼 수 있다.

 

 

 

 

왼쪽이 코딩, 오른쪽이 디자인 미리보기 이제 스플레시를 기깔나게 꾸며보자.

 

 

먼저 코드를 수정한다.

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashActivity"
    android:background="@color/black">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/veno_white"/>

</LinearLayout>

LinearLayout은 레이아웃의 종류로 수직 및 수평으로 배치해주는 레이아웃이다.

<ImageView은 이미지를 추가해주는 태그로 대소문자를 꼭 구분하자.

android:layout_width="match_parent"은 해당태그의 폭, 가로의 크기를 지정해준다. 보통 옵션을 2개로match_parent wrap_content가 있다.

match_parent은 해당 태그가 있는 부모쪽의 크기에 맞춘다는뜻 부모는 당연히 Linear Layout이다.

wrap_content는 해당 태그의 콘텐츠 길이만큼 맞춘다는거다.

android:src="@drawable/veno_white"/>의 src는 이미지의 경로이다. 경로는 test > app > main > res > drawable쪽이며 이미지 또한 이쪽에 붙여넣으면 우리가 쓸 수 있다.

대충 이렇게 하면 된거같다. 이제 파이어베이스에 있는 "Remote Config"기능을 사용해 보자.

 

안드로이드 스튜디오에서 Tools > Firebase를 누르면 안드로이드에서 사용이 가능한 기능들이 나온다.

 

 

오른쪽부분에 사이드메뉴가 나오는데 여기서 Remote Config를 찾자. 찾아서 누른다음 Set up Firebase Remote Config를 눌러서 파이어베이스와 안드로이드스튜디오와 연동시킨다.

Connect Your app to Firebase는 구성파일을 넣었으면 아마 자동으로 연결이 되어있을것이다. 안되어있다면 연결시키고 프로젝트도 잘 선택하자.

 

Add Remote Config to yout app에서 API를 불러오자.

 

Accept Changes를 눌러서 추가시켜놓자. 추가 및 연동은 스튜디오가 알아서 해 준다.

 

Remote config는 원격으로 앱쪽에 동작을 제어해주는것이다. 내가 이걸 사용하는 이유는 만약 서버에서 점검중이거나, 네트워크쪽에 문제가 생겼을 시 원격으로 막아주는 용도로 사용한다.

 

그래서 메세지를 띄어주는 xml으로 통해 보여준다. 그래서 커스텀으로 해 줘야 한다.

res에서 오른쪽 클릭 후 Android Resourse Diretory를 눌러서 안드로이드 리소스 폴더를 만들어준다.

 

 

리소스 타입을 xml로 지정 한 후 ok를 눌러준다.

그럼 폴더가 만들어지는데 위에서 똑같이 해주는데 추가할때 XML Resource File누른 다음 파일 이름을 본인이 편한데로 해 주자.

난 있어보이기 위해 network_file로 해 줬다.

 

그럼 xml파일이 만들어지는데 아래 내용을 추가해준다.

<?xml version="1.0" encoding="utf-8"?>

<defaultsMap>
    <entry>
        <key>loading_phrase</key>
        <value>Fetching config…</value>
    </entry>
    <entry>
        <key>message_caps</key>
        <value>false</value>
    </entry>
    <entry>
        <key>welcome_message</key>
        <value>서버와 통신이 끊겼습니다. 네트워크 상태를 확인 해 주세요.</value>
    </entry>
</defaultsMap>

엔트리 밑 키와 벨류(값)는 서버에서 받아오기 위한걸로 꽤 단순하게 생겼다.

그 다음은 코틀린 파일에서 코드를 작성하자.

 

 

큰일이 났다. 구글에서 하라는데로 했는데 오류가 났다.

빨간색 글씨에 마우스를 대거나 alt+Enter를 누르면 힌트라도 준다

 

 

remoteConfigSettings에 대한 함수를 못찾는거 같다. 아마 임폴트 문제이거나 API문제일 가능성이 크다. API는 build.gradle의 Module이다.

 

맨 마지막줄을 포함시키면 될거같다.

implementation 'com.google.firebase:firebase-config-ktx'

 

 

이사진처럼 빨간색글에 밑줄이 그어져있는데 이거는 함수가 존재한다는 것이다. 이때 alt+Enter를 누르면 임폴트를 추가할수있다.

 

임폴트를 엔터 누르면 정상적으로 인식된다.

 

package com.company.myapplication

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings
import com.google.firebase.remoteconfig.ktx.remoteConfigSettings

class SplashActivity : AppCompatActivity() {
    lateinit var remoteconfig : FirebaseRemoteConfig
    val FIREBASE_TIME : Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        remoteconfig = FirebaseRemoteConfig.getInstance()

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        check_network()
    }
    fun check_network(){
        remoteconfig = FirebaseRemoteConfig.getInstance()
        val configSettings = remoteConfigSettings {
            minimumFetchIntervalInSeconds = 3600
        }
        remoteconfig.setConfigSettingsAsync(configSettings)
        remoteconfig.setDefaultsAsync(R.xml.network_file)
    fetchAction()
    }
fun fetchAction(){
    remoteconfig.fetch(FIREBASE_TIME).addOnCompleteListener(this) { task ->
        if(task.isSuccessful){
            remoteconfig.activate()
        } else {

        }
        show_Message()
    }
}
fun show_Message(){
    val caps : Boolean = remoteconfig.getBoolean("welcome_message_caps")
    val splashMessage : String = remoteconfig.getString("welcome_message")
    val builder : AlertDialog.Builder = AlertDialog.Builder(this)
    if(caps){
        builder.setMessage(splashMessage).setCancelable(false).setPositiveButton("확인") {dialog, which -> finish()}
        builder.create().show()
    }else{
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    }

}}

이제 코드를 쪼개서 분석해볼거다. 쪼갤때는 함수단위로 쪼갤것이다. 이전에 언급한 함수들은 다시 적지 않을거고 새로나온걸로 적을거다.

 

class SplashActivity : AppCompatActivity() {
    lateinit var remoteconfig : FirebaseRemoteConfig
    val FIREBASE_TIME : Long = 0

 lateinit은 늦은 초기화라고도 불린다. 코틀린언어는 자바와 100%호환이 되며 자바언어를 코틀린으로 변환도 가능하다. 하지만 자바는 null처리가 없고 코틀린에서는 null처리가 있다. 여기서 null이라는건 미확인, 알수없는값이라는거다. 즉 어떤건지 모른다는거다. 아빠가 식탁위에 있는 빵을 가져오라고 명령하면 우리는 빵을 가져와야 하는데 식탁위에는 크림빵, 피자빵이 있다. 빵은있는데 어떤 빵인지 지정을 안해줬기에 우리는 "아빠 어떤빵을 가져가면 되나요?"라고 되묻는데 이때 이걸 NULL이라고 한다. 값이 모르면 안드로이드 시스템에서 null오류를 일으킨다.

lateinit은 null을 지정하지 않고 초기화 해 주는거다.

var이라는 친구와 val이라는 친구가 있는데 얘들은 변수라고 불린다.

변수는 프로그래밍에서 아주많이 소환되고, 많이 사용되고, 없으면 안되는거다. 변수는 어떠한 값을 저장하고 불릴때 사용한다. 그니깐 프로그래밍상 데이터를 저장해야하는데 이름을 붙여줘야 나중에 부를때 쉽게 부를수있고 수정또한 가능하다. 그래서 변수를 선언 해 주고 코딩으로 변수에 값을 저장 시켜준다. 

remoteconfig라는 변수이름을 지정해준다. FirebaseRemoteConfig라는걸 remoteconfig라는 이름을 가진 변수를 지정해준다.

아 여기서 var이랑 val의 차이점도 있다.

var : 이 변수를 선언 한 후 초기화 한 다음 값 변경이 가능하다.

val : var의 반대 개념으로 한번 값을 지정하게 하면 변경이 불가능하다. 변경이 되더라도 애러가 일어난다.

FIREBASE_TIME이라는 변경이 안되는 값을 선언 해 주고 Long타입으로 0을 할당해준다.

Long은 프로그래밍에서 숫자를 나타낸다.

char, float, int 등등이 있다. 

char은 텍스트,

float은 소숫점이 들어간 숫자

int는 자연수

Long은 int와 같은 자연수가 가능하지만 int보다 더 길게 쓸 수 있다. 

즉 갤럭시S5배터리(int) vs 갤럭시 S21 울트라(Long) 배터리

둘중 뭐가 더 좋을까? 당연히 Long이다. 하지만 상황에 맞게 쓰는게 좋다. 가격은 S5가 더 싸니깐.

 

 fun check_network(){
        remoteconfig = FirebaseRemoteConfig.getInstance()
        val configSettings = remoteConfigSettings {
            minimumFetchIntervalInSeconds = 3600
        }
        remoteconfig.setConfigSettingsAsync(configSettings)
        remoteconfig.setDefaultsAsync(R.xml.network_file)
    fetchAction()
    }

fun check_network(){은 우리가 함수를 만드는거다. fun을 먼저 선언 하고 함수명을 붙여준다. 본인이 읽거나 쓰기 편한걸로 대충 짓자. 어차피 내 코드는 내가 보는건데

remoteconfig = FirebaseRemoteConfig.getInstance()은 위에서 var로 선언한 변수 remoteconfigFirebaseRemoteConfig.getInstance()라는걸로 초기화 시켜준거다.

val configSettings = remoteConfigSettings {
            minimumFetchIntervalInSeconds = 3600
        }

라는 코드는 싱글톤 객체로 사용하여 인앱 매개변수 기본값을 저장하고 업데이트된 매개변수 값을 백엔드에서 가져오며 가져온 값을 앱에 제공할 시점을 제어합니다. - Google Firebase -

여기서 싱글톤이란 

싱글패턴으로 고정된 메모리 영역을 얻으면서 메모리 낭비를 줄일 수 있다. minimumFetchIntervalInSeconds는 앱에서 몇분동안 값을 가져올것인지에 대한 시간설정이다. 60분동안 5번 요청하면 문제가 될 수 있다. 그래서 기본 3600으로 진행한다.

 

remoteconfig.setConfigSettingsAsync는 세팅이다.

remoteconfig.setDefaultsAsync는 보여줄 xml 즉 디자인부분이다. 우리가 만든걸로 메세지를 보여주는거다.

 

fetchAction()는 함수이다. 내가 꼴리는대로 만드는 함수

fun fetchAction(){
        remoteconfig.fetch(FIREBASE_TIME).addOnCompleteListener(this) { task ->
            if(task.isSuccessful){
                remoteconfig.activate()
            } else {
    
            }
            show_Message()
        }
    }

remoteconfig.fetch()는 매개변수를 가져올때 사용하는거다. addOnCompleteListener는 콜백이다. 

미리 정의되어있는 함수로 addOnCompleteListener는 작업이 완료되면 task가 들어간다.

task는 실행되는 엑티비티를 기록하는것이다.

그 밑에 if문에서 task가 isSuccessful 즉, 성공적으로 완료 되면 if문안에 함수가 실행된다.

 

잘 된다면 show_Message()가 실행된다.

 

fun show_Message(){
    val caps : Boolean = remoteconfig.getBoolean("message_caps")
    val splashMessage : String = remoteconfig.getString("welcome_message")
    val builder : AlertDialog.Builder = AlertDialog.Builder(this)
    if(caps){
        builder.setMessage(splashMessage).setCancelable(false).setPositiveButton("확인") {dialog, which -> finish()}
        builder.create().show()
    }else{
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    }

지정되면 초기화 못하는 변수 val형태로 "caps"라는 이름 변수를 생성한다. Boolean은 참/거짓으로 나타내주는 자료형으로 우리가 서버에서 이것을 활성화 할것인지, 비활성화할것인지 정해주는것이기에 참과 거짓으로 해야한다.

즉 caps라는 변수는 서버에서 참/거짓을 받아와야 하니 Boolean을 지정해주는거다.

 

splashMessage는 왜, 메세지가 나오는것인지 보여줘야하기 때문에 문자열 String으로 나타내준다고 알려주는거다. 이것도 서버에서 가져오는것이기 때문에 String으로 지정

 

builder라는 변수는 알럿다이얼로그 우리가 아는 팝업메세지이다. 안드로이드에서는 이것을 AlertDialog.Builder로 통해 팝업메세지를 만든다. 이것도 커스텀이 가능하다.

if문으로 제어를 해 주면 된다.

if는 "만약 ~~~한다면 뜻으로 주로 어떤 프로그래밍 언어서든 다 쓰이는거다.

if(Veno == 잘생겼다){
	"이건 오류가 나올것이다."
} else {
	"맞는말이다."
}

하다보면 쉬워지는 함수이다.

 

만약 caps가 true면 함수가 실행되는것이다. 

builder라는 변수를 소환시켜 미리 지정해 둔 단축어를 꺼낸다. setMessage는 변수 splashMessage를 적용시키고setCancelable는 취소버튼 즉 팝업창에서 취소버튼을 삭제시킨다. 왜냐 중요공지인데 선택권한을 없애야한다. 강압적으로 가는거지 뭐

setPositiveButton는 확인, 완료버튼이다. 이걸 수정해서 "확인"이라는 글씨를 적어서 사람들이 이걸 누르게끔 심리전을 펼쳐준다. 사실 선택권은 하나지만!

{dialog, which -> finish()}는 확인버튼을 누르면 함수를 실행이다. 별 설명해줄건 없고 finish는 해당 이벤트를 종료시킨다. 이거는 추후 설명

builder.create().show()는 모든 함수를 끝내고 builder라는걸 만들고(create) 보여주는거다(show)

 

startActivity(Intent(this, LoginActivity::class.java))
        finish()

만약 caps가 false 공지메세지를 딱히 띄울게 없다면 else부분으로 넘어간다. else는 if문이 생략되었을때 실행하는거다,

 

startActiivity는 엑티비티 시작으로 새로운 디자인부분으로 넘어가는거다. Intent는 화면 전환이나 앱전환할떄 주로 쓰인다. LoginActivity로 화면전환 시켜 준다. 

finish는 좀 중요한데 안드로이드는 화면전환하면 이전 화면이 누적된다. 불필요한 화면은 삭제해줘야 한다. 뒤로가기를 눌렀을때 누적된 화면들이 계속 나오기 때문이다. 그래서 finish를 통해 이전 화면을 바로바로 삭제 해켜준다. 

 

 

앱에서는 서버연동과 데이터를 받을 준비가 다 되어있다. 이제 서버(FireBase)에서 값을 지정해주면 데이터를 수신하면서 서로 통신하게 된다. 

 

 


FIREBASE 접속


 

 

사이트에서 구성만들기를 누르면 된다.

누르면 옆쪽에 창이 나오는데 여기서 셋팅만 해주면 된다.

 

매개변수는 xml과 아래코드로 적은것과 동일한 message_caps를 붙여넣는다. 

val caps : Boolean = remoteconfig.getBoolean("message_caps")

이거는 파이어베이스(줄여서 파베)에서 신호를 줄때 참/거짓으로 설정한다. ture는 실행 false는 실행취소 여기서는 데이터유형을 부울 즉, 참과 거짓으로 지정해준다.

Description는 설명, Default value는 false로 지정해서 기본값도 준다.

 

저장 버튼을 눌러준다.

 

 

매개변수를 또 추가해준다.

 

이번에는 welcome_message를 지정해준다.

이거는 어떤 메세지를 보여줄것인지에 대한 변수이므로 데이터유형은 문자열로 지정해준다.

 

만약 message_caps가 ture이면 welcome_message를 보여준다. 이것도 저장

 

여기서 변경사항 개시를 눌러서 즉시 개시를 시작한다.

 

 

 

 

 


빌드


이제 다 끝났다. 정상작동하는지 빌드를 통해서 테스트를 한 후 apk를 만들어서 배포하면된다.

안드로이드 앱 빌드 하는 방식은 3가지로 나뉜다.

 

1. 애뮬레이터

2. 본인 폰 및 공기계 

3. 가상화

 

나는 1번과 2번을 추천하고 2번을 강력하게 추천한다.

 

1번 애뮬레이터는 안드로이드 스튜디오에서 지원하는 가상 디바이스

2번은 본인 폰 및 공기계 즉 컴퓨터에 안드로이드 폰을 연결하고 거기에 빌드하는거

3번은 녹스나 블루스택같은 모바일 가상화 프로그램을 사용하는거다 

 

1번은 간편하게 할 수 있다는 장점이지만 얘도 사양을 은근 잡아 먹는다. 본인 컴터 사양이 안좋으면 2번으로 넘어가면 된다.

2번은 컴터와 폰을 연결해서 실제사용하는앱처럼 사용이 가능하며, 앱 출시하기전에도 테스트까지 가능하니 두마리 토끼 잡는다

3번은 1번과 2번이 힘들때 사용하는건데 초기세팅이 어렵다.

 

나는 1번으로 진행한다.

 

안드로이드 스튜디오 애뮬레이터

안드로이드 스튜디오에서 설치하면 된다.

 

 

빨간부분을 누르면 여러 항목이 뜬다

AVD Manager를 눌러서 애뮬레이터를 설정한다.

 

나는 이미 추가한게 있어서 목록에 뜨지만 새로설치한 사람은 없을거다. 왼쪽하단에 Create Virtural Device를 눌러서 새로 만들면된다.

 

여기서 디바이스를 선택하면된다. 지원하는기기는 아마 구글에서 만든 모바일 폰 "픽셀"로 나오는듯 하다.

나는 맨위, 최신 디바이스를 선택했다. 선택했으면 Next를 누른다

 

 

이제 운영체제를 고르면 된다. Download는 설치해야하는것이므로 전부 Download가 뜨면 필요한 운영체제를 선택해서 다운하면 된다.

나는 안드로이드 Q를 선택했다. Next를 누르자

 

이름을 정해주고 가로, 세로 고르면 된다. 뭐 대부분 세로를 하니 나도 세로로 진행

다 끝났으면 Finish를 눌러서 마무리 지으면 된다.

 

창을 끄면 된다.

 

실행버튼을 눌러서 컴파일을 진행하고 애뮬레이터로 오류가 있는지 없는지 보면 된다.

 

 

맨 밑부분에 진행되는게 보이는데 우린 자세하게 보기 위해 Build를 눌러서 현재 진행사항을 보자.

 

잘 돌아간다. 나도 내 인생이 이렇게 잘 돌아갔으면 좋겠다.

 

아마 컴파일 및 빌드가 진행되는 동안 애뮬레이터가 나올것이다. 애뮬레이터가 나온다고 해서 되는게 아니고 진행은 여전히 되는것이기에 조금만 기다리자.

 

만약 아무것도 안뜨면 홈버튼을 눌러서 빠져나오고 최근항목에서 모든 앱을 종료 시키고 본인이 빌드한 앱을 다시 찾아서 실행시키면 된다.

 

 

바탕화면은 무시해줘라....

일단은 정상적으로 실행이 된다. 오류없이 돌아가니 매우 좋다. 이제 파베에서 welcome_message를 true를 바꿔보자

Default value를 ture를 바꾸고 변경사항 즉시 개시를 누르면 된다.

 

ture 확인 한 후 앱 재실행하면 된다.

 

 

잘 작동한다. 파베에서 welcome_message를 변경해도 적용이 되니 이 부분을 야무지게 적으면 될듯.

 

 

 끝으로...

이거를 포스팅하는데 족히 3일 넘게 걸렸다. 코딩도 코딩이기도 하고 무엇보다 제일 중요한건

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

게임이 자꾸 날 유혹한다.

 

레식은 못참지ㅋㅋ