카테고리 보관물: Android

애드몹(Admob) 사이트 행동: 탐색 조치법

개요

어느 날 안드로이드 앱 하나가 AdMob 프로그램 정책을 준수하지 않아 앱에서 광고 게재가 중지 되었다는 내용으로 메일이 왔습니다. 문제는 사이트 행동: 탐색 이었습니다. 영문으로는 Site Behavior: Navigation 입니다. 앱이 처음 업로드 된 것은 9년전 이었습니다.

처음부터 문제가 있었다는 메일이 왔다면 이해가 되었을 겁니다. 시간이 이렇게나 많이 흘렀는데 사전통보도 없이 광고를 중단 시키는 것은 납득하기 어려웠습니다. 그래도 문제 해결을 해야 하니 이것저것 진행해 보았습니다.

광고 게재 중지 알림 메일 내용
광고 게재 중지 알림 메일 내용

첫번째 조치

역시나 메일 내용과 안내된 링크에서 확인해 보아도 명확하게 어느 지점인지 알 수 없었습니다. 상세하게 알려주면 해결이 쉬울텐데 너무 포괄적으로 안내가 됩니다.

앱내에 있는 버튼들이 하단에 배치되어 있었고 바로 밑에 배너 광고가 있었습니다. 의도하지 않게 사용자가 광고를 터치할 수 있다고 생각되어 광고 위쪽에 여백을 추가해서 검토를 요청했습니다. 결과는 여전히 문제가 있다는 메일이 전송되었습니다.

두번째 조치

여백도 안된다면 아예 버튼의 위치를 바꿔야 겠다는 생각이 들었습니다. 그래서 모두 위쪽으로 버튼을 이동했습니다. 검토를 요청했지만 여전히 해결되지 않았습니다.

세번째 조치

문제가 무엇인지 아무리 생각해 보아도 명확하지 않았습니다. 이리저리 살펴 보던 중 앱 기능 중 검색 부분에 버그가 있다는 것을 발견했습니다. 검색을 했을 때 자료가 없는 경우 목록에 아무것도 나타나지 않았습니다.

자료가 없다는 메시지도 나타나지 않고 이전 상태로 돌아갈 수 있는 방법도 없었습니다. 왜 그런 상태로 등록이 되었는지 필자도 이해가 되지 않았습니다. 아마도 나중에 처리한다고 생각하고 있다가 완전히 잊고 등록을 시킨게 아닌가 추측되었습니다.

검색결과가 없는 경우 검색 결과가 없다는 메시지를 보여주고 검색 전 목록이 다시 나타나도록 수정한 후 다시 검토 요청을 했습니다. 얼마 후 문제가 없다는 메일을 받았습니다.

정책 위반 해결 알림 메일 내용
정책 위반 해결 알림 메일 내용

정리

세번의 시도 끝에 문제를 해결했습니다. 그러나 배너 광고근처에 있는 버튼과 검색관련 부분 중 어떤 것이 원래 원인이었는지는 알 수 없었습니다. 둘다 원인이었는지도 확인할 수는 없었습니다.

광고 관련해서는 광고 영역근처에는 사용자가 터치할 수 있는 항목을 배치하지 않아야 할 것 같았습니다. 사용자가 의도하지 않게 광고를 터치하지 않도록 앱 기능을 수행하는 버튼을 잘 배열해야 겠다는 생각이 들었습니다.

검색관련한 부분은 명백하게 사용자에게 혼란을 야기하는 문제였습니다. 미리 확인하지 못한 필자의 터무니없는 실수였습니다. 앱을 만들 때 모든 기능을 사용자 입장에서 혼란스럽지 않도록 매끄럽게 만들어야 하는 중요성을 다시 한번 깨달았습니다.

해결된 사례

필자가 조치한 사항과는 다르지만 자료를 찾아보다가 해결이 되었다는 내용을 정리해 보았습니다. 오래전 항목도 있고 이 글을 보고계시는 분의 상황과 맞지 않을 수도 있습니다. 하지만 실마리라도 제공할 수 있을 것 같아 남겨둡니다.

  • 앱이 어린이용으로 등록되어 있었는데 18세 이상으로 변경한 후 해결(필자의 경우 원래 18세 이상으로 설정되어 있어 해당되지 않음)
  • 앱 내의 버튼으로 이동되는 링크가 깨져있어 제대로 연결되도록 수정한 후 해결(이 경우가 가장 많았음)
  • http 를 https 로 변경해서 해결
  • 30일 정도 지난 후 아무런 조치없이 해결

해결되지 않은 사례

  • 배너 광고를 전면 광고로 변경했으나 미해결(필자도 전면광고로 전환하려다가 해당내용을 보고 중단)

Android ROOM 자료가 입력된 DB 사용하기

개요

이전에 다루었던 Android ROOM 초기 자료 입력하기 글에서는 적은 양의 자료에만 적용할 수 있습니다. 자료가 많은 경우 텍스트 파일을 읽어 DB에 입력하는 방법을 생각해 볼 수 있습니다. 또 서버에 연결해서 자료를 받아와 입력하는 등 여러가지 방법이 있을 수 있습니다. 그러나 앱에서 처리하게 되면 모든 사용자들이 입력이 끝날 때 까지 기다려야 하는 문제가 있습니다.

DB에 입력되는 자료가 고정되어 있고 양이 많은 경우 개발 시 미리 입력해 놓은 DB를 적용하면 간편합니다. 이번글에서는 그 방법을 알아보도록 하겠습니다.

데이터 미리 채우기

SQLite DB에 자료를 입력하는 방법은 여러가지가 있습니다. 필자는 Android Studio 에 있는 Database Inspector 를 이용해서 다량의 자료를 DB에 입력했습니다. 미리 입력된 DB를 사용하는 방법은 개발자 문서에 잘 설명되어 있습니다.

DB 파일 준비

필자는 에뮬레이터에 저장되어 있는 DB 파일을 Device File Explorer 로 접근해서 로컬 PC에 저장했습니다. 그 다음 Android Studio 에서 assets 폴더를 생성하고 DB 파일을 복사했습니다.

assets 폴더 하위에 추가한 DB 파일
assets 폴더 하위에 추가한 DB 파일

코드추가

DB 초기 생성 부분에 다음과 같이 코드를 추가합니다.

fun getInstance(context: Context): yourDB? {
    if (INSTANCE == null) {
        synchronized(yourDB::class) {
            INSTANCE = Room.databaseBuilder(context.applicationContext,
                yourDB::class.java, "your.db")
                .addCallback(dbCallback)
                .createFromAsset("your.db")
                .fallbackToDestructiveMigration()
                .build()
        }
    }
    return INSTANCE
}

이렇게 하면 미리 자료를 입력해 놓은 DB 파일을 이용하게 됩니다. 앱에서 별도로 자료를 입력하는 과정을 수행할 필요가 없어지게 됩니다. 단, 정의된 Entity 와 미리 자료가 채워진 DB 파일의 구조가 같아야 합니다.

이번글에서는 미리 준비된 DB 파일을 ROOM 을 사용한 프로젝트에 적용하는 방법을 알아보았습니다.