애드몹(AdMob) 설정

  • 앱 내에 구글 배너광고를 쉽게 붙일 수 있도록 도와줌
  • 수익 현황 알려줌
  • 일정 수익 이상이 되면 환전 가능

애드몹 광고 종류

  1. 배너 : 앱 레이아웃 일부를 차지하는 광고
  2. 전면 : 전체 페이지 광고 형식
  3. 리워드 : 광고를 본 사용자에게 리워드 제공
  4. 네이티브 고급 광고 : 맞춤설정 광고 (커스터마이징)

애드몹 설치하기

  • Expo에서 구글 애드몹을 지원해준다.
expo install expo-ads-admob
  • app.json 파일에 다음과 같이 추가한다.
"ios": {
      "supportsTablet": true,
      "buildNumber": "1.0.0",
      "bundleIdentifier": "com.myhoneytip.yewon",
      "config": {
        "googleMobileAdsAppId": ""
      }
  },
"android": {
      "package": "com.myhoneytip.yewon",
      "versionCode": 1,
      "config": {
        "googleMobileAdsAppId": ""
      }
  }
  • googleMobileAdsAppId에 대해서는 자신이 애드몹에 추가한 앱 ID를 입력한다.
  • 안드로이드, iOS 모두 앱을 추가해야함

가로 배너 생성

  • 광고 단위 만들기 - 배너 선택

  • 광고 단위 이름 입력

  • MainPage.js에 다음 코드를 추가한다.
import {Platform} from 'react-native';
import {
  setTestDeviceIDAsync,
  AdMobBanner,
  AdMobInterstitial,
  PublisherBanner,
  AdMobRewarded
} from 'expo-ads-admob';
<View>
{Platform.OS === 'ios' ? (
	<AdMobBanner
		bannerSize="fullBanner"
		servePersonalizedAds={true}
		adUnitID="iOS 광고 단위 아이디"
		style={styles.banner}
	/>
) : (
	<AdMobBanner
		bannerSize="fullBanner"
		servePersonalizedAds={true}
		adUnitID="Android 광고 단위 아이디"
		style={styles.banner}
	/>
)}
</View>
  • bannerSize : 배너 크기 조정
  • servePersonalizedAds : 사용자 맞춤 광고 제공 여부
  • adUnitID : 광고 단위 아이디
  • style을 이용하여 스타일 적용 가능

전면 배너 생성

  • Card.js
import {
  setTestDeviceIDAsync,
  AdMobBanner,
  AdMobInterstitial,
  PublisherBanner,
  AdMobRewarded
} from 'expo-ads-admob';
export default function Card({content,navigation}){

    useEffect(()=>{
        Platform.OS === 'ios' ? AdMobInterstitial.setAdUnitID("광고 단위 ID") : AdMobInterstitial.setAdUnitID("광고 단위 ID")

        AdMobInterstitial.addEventListener("interstitialDidLoad", () =>
            console.log("interstitialDidLoad")
        );
        AdMobInterstitial.addEventListener("interstitialDidFailToLoad", () =>
            console.log("interstitialDidFailToLoad")
        );
        AdMobInterstitial.addEventListener("interstitialDidOpen", () =>
            console.log("interstitialDidOpen")
        );
        AdMobInterstitial.addEventListener("interstitialDidClose", () => {
              //광고가 끝나면 다음 코드 줄이 실행!
            console.log("interstitialDidClose")
            navigation.navigate('DetailPage',{idx:content.idx})
        });
    },[])
    const goDetail = async () =>{

      await AdMobInterstitial.requestAdAsync({ servePersonalizedAds: true});
      await AdMobInterstitial.showAdAsync();
    }

    return(
        <TouchableOpacity style={styles.card} onPress={()=>{goDetail()}}>
            <Image style={styles.cardImage} source={{uri:content.image}}/>
            <View style={styles.cardText}>
                <Text style={styles.cardTitle} numberOfLines={1}>{content.title}</Text>
                <Text style={styles.cardDesc} numberOfLines={3}>{content.desc}</Text>
                <Text style={styles.cardDate}>{content.date}</Text>
            </View>
        </TouchableOpacity>
    )
}

앱을 배포하기 위해 필요한 것들

  1. 앱 로고
  2. 스플래시 스크린
  3. 앱 마켓에 올릴 설명 이미지
  4. 앱 버전 관리, 안드로이드, iOS 인증서 관리 등

스플래시 스크린

  • assets 폴더 안에 있는 splash.png 이미지 수정

로고 준비

  • assets 폴더 안에 있는 icon.png 이미지 수정

최종 앱 파일 생성

app.json

  • version / ios - buildNumber / android - versionCode → 매번 다르게
expo build:android

permission 코드

"permissions": ["ACCESS_FINE_LOCATION", "ACCESS_COARSE_LOCATION"]

 


내가 제작한 앱에 광고를 넣는 방법과 최종적으로 구글 플레이스토어에 배포하는 방법을 배웠다.

 

광고는 구글 애드몹(Admob) 서비스를 이용하여 앱 메인 화면 하단에 배너 광고를 넣고,

각 꿀팁을 클릭해서 상세 페이지로 넘어가기 전에 전면 광고가 나오도록 했다.

 

애드몹 신청 과정이 꽤나 길긴 했으나, 한번 승인받은 이후에

광고 단위를 새롭게 만드는 방법이나 그것을 앱에 적용하는 방법은 어렵지 않았다.

 

구글 플레이스토어에 배포하기 위해 apk 파일을 만들고 등록하는 과정도 직접 따라해봤기 때문에

추후에 나만의 앱을 제작한다면 이번 수업으로 배운 구글 광고 추가와 배포하는 방법을 적용하면 될 것 같다!

 

 

앱 안에서 나오는 배너 광고와 전면 광고의 모습이다

  • 새로운 Firebase 프로젝트 DB와 안드로이드 스튜디오 연결하기

 

오늘은 회의가 있는 날이었다.

일기장, 게시판 주요 기능 구현은 거의 다 마친 상태에서 앞으로 구현해야할 기능들에 대해 얘기를 나눴고

1:1상담 구현을 위해 필요한 Dialogflow를 연동하기 위해

기존에 사용하던 Firebase 프로젝트가 아닌 Dialogflow와 연동된

새로운 Firebase 프로젝트를 이용하도록 google-service.json 파일을 변경했다.

 

왜인지 모르겠지만 google-service.json 파일을 변경했음에도 불구하고 계속 기존 DB에 연결이 되었다.

이것의 원인을 찾지 못한 채로 회의를 마쳤고 문제 해결 방법을 찾아보았다.

 

내가 찾은 자료는 여러 개의 Firebase DB를 이용하는 방법이었는데

 

https://stackoverflow.com/questions/53189746/what-will-firebase-getinstance-get-if-there-are-multiple-databases

 

What will firebase.getInstance() get if there are multiple databases

I was using a firebase database in my Android app. Now I need to use another database but I want to know for the old versions of my app what will "firebaseDatabase.getInstance" return? Which database

stackoverflow.com

 

 

FirebaseOptions options = new FirebaseOptions.Builder()
        .setApplicationId("앱ID")
        .setApiKey("API key")
        .setDatabaseUrl("DB Url")
        .build();

FirebaseApp.initializeApp(this, options, "이름");

FirebaseApp secondary = FirebaseApp.getInstance("이름");
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondary);​

 

FirebaseOptions와 FirebaseApp.initializeApp을 이용해서 이름을 지정해서 이용하는 것이었다.

이 방법대로 하면 연결은 되긴 하나, FirebaseApp의 디폴트 DB는 기존 DB와 연결이 돼서

이름 부분을 생략하고 FirebaseApp.initializeApp(this, options); 라고 적었더니

java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists! 이런 오류가 발생했다.

 

디폴트 DB를 원하는 DB로 설정하지 않으면

Firebase를 사용하는 모든 java 파일에서 해당 부분을 수정해야했기 때문에

분명 다른 방법이 있을 것이라 생각하고 더 찾아보았다.

 

FirebaseApp.getInstance().delete();

 

이렇게 디폴트 DB를 삭제하면 더이상 오류는 발생하지 않는 것을 확인했지만

google-service.json 파일을 지웠는데도 기존 DB와 연결이 되는 것이 여전히 이해가 되지 않았다.

 

 

그리고 새벽에 팀원분이 우리와 똑같은 문제를 겪고 해결한 사례를 작성한 포스팅 링크를 보내주셨다.

 

https://bamgasi.tistory.com/m/2

 

firebase 프로젝트 변경방법

firebase 프로젝트 변경방법 앱 개발 초기 테스트로 firebase 프로젝트를 생성 후 라이브 시에 새로운 프로젝트로 변경해야 할 일이 생겼다. 이에 대한 변경방법이다. 일반적인 웹프로젝트는 config

bamgasi.tistory.com

 

포스팅을 읽어보면 알겠지만... 그렇다.

안드로이드 스튜디오 Build 메뉴에서 Rebuild Project를 하면 끝나는 것......!!!

 

다행스럽게도(?) 위의 방법을 따라하니 새로운 Firebase DB와의 연결이 제대로 되었다.

json 파일 변경하면 Rebuild 해야한다는건 전혀 몰랐지... 그래서 한참 헤맸는데

그나마 하루 이상 넘기지 않고 문제가 해결돼서 다행이라고 생각하자...

 

내일부터 다시 앱 기능 구현에 집중해야겠다!!

멤버 초대하기

  • GitLab 프로젝트 Settings - Members - Project members - Invite member
  • Maintainer : 해당 프로젝트에 대한 모든 권한을 가지고 있는 최상위 사용자
  • Guest : 가장 낮은 등급의 사용자, 제대로 개발에 참여할 수 없음
  • 최소 Developer 등급이 되어야 개발에 참여 가능 → 등급 변경

 

Fork

  • 원본 프로젝트의 복제본을 만드는 것
  • 복제된 프로젝트를 git clone해서 컴퓨터에 저장, 작업 후 복제된 프로젝트에 push

 

Merge Request (MR)

  • 복제된 프로젝트에서 원본 프로젝트에 merge request를 보냄→ 작업한 내용을 원본 프로젝트에 반영해달라는 의미
  • merge request 승인 또는 거절
  • GitLab 사이트에서 Merge Request 하기
    1. Create Merge Request 클릭
    1. Change branches 에서 Source branch, Target branch 선택
    1. Title, Description 작성
    1. Assignee : MR을 가장 먼저 점검해야할 담당자
    1. Discussion을 통해 MR에 대한 논의 가능
    1. 담당자가 Merge 버튼을 클릭해서 병합함
  • Settings - General - Merge request 에서 Merge method 선택 가능-기본 값은 Merge commit → 항상 커밋 생성
  • -Fast-forward merge : Fast-forward merge가 가능할 때는 따로 커밋을 생성하지 않음

 

git push --force
  • 강제로 GitLab 서버의 커밋 로그를 덮어쓰게 함 (실무에서는 절대 사용 X)
  • Fast-forward merge 옵션을 선택한 후 다시 merge하면 새로운 커밋이 생기지 않음

2021년 1학기 캡스톤디자인 작품으로 코딩 멘토-멘티 스터디 진행이 가능한 웹 사이트를 제작했다.

사이트 이름은 모두의 코딩교실을 줄인 모코(MOCO) 이다.

Eclipse에서 Spring Boot 프로젝트로 개발했고 JSP, CSS, JS를 이용해서 전체 페이지를 구성하였다.

 

나는 전반적인 웹 사이트 레이아웃을 구현하고

로그인, 글 작성/수정/삭제, 그룹 관리, 알림 등의 기능을 구현했다.

 

부트스트랩 프레임워크를 이용해서 반응형 웹을 손쉽게 구현할 수 있었는데

부트스트랩과 직접 만든 CSS간의 충돌이 발생해서 개발 과정에서 혼란을 겪기도 했다.

 

DB의 경우 MySQL과 연동하여 MVC 패턴의 MyBatis 방식으로 이용했다.

 

이렇게 5인 이상의 팀 단위 프로젝트를 진행한 것도,

GitHub를 이용하여 협업을 한 것도 처음이었던 프로젝트라 의미가 있었다.

 

GitHub 👉 https://github.com/nbalance97/mentomenti

 

nbalance97/mentomenti

2021-1 캡스톤디자인. Contribute to nbalance97/mentomenti development by creating an account on GitHub.

github.com

 

메인 화면
로그인 화면
개설된 그룹 목록
가입한 그룹 목록
그룹 개별 페이지
알림 목록 페이지
회원 정보 페이지
수업 - 화면 공유
수업 - 웹 컴파일러

 

브랜치 Branch

  • 특정 커밋을 가리키는 포인터
  • 기본 branch : master
  • HEAD는 master branch를 통해 commit을 가리키고 있음
  • origin/master : GitLab 서버에 있는 master branch

 

브랜치 생성하기

💡
git branch {branch_name}
git branch develop

 

브랜치 전환하기

💡
git checkout {branch_name}
git checkout develop
  • HEAD를 develop 브랜치를 가리키도록 변경

 

모든 log 확인

💡
git log —all —graph
  • —all : HEAD가 가리키는 branch뿐만 아니라 모든 branch를 보겠다
  • —graph : branch와 commit 간의 관계를 그래프 형식으로 보여라

 

브랜치 병합하기

💡
git merge {branch_name}
  • 현재 HEAD가 branch를 통해 가리키고 있는 커밋merge 뒤에 쓴 branch가 가리키고 있는 커밋을 합침

 

git checkout develop
git merge feature-attack
  • 새로운 커밋을 만들지 않고 당기는 경우 → fast-forward merge

 

브랜치 병합 충돌

  • 필요한 코드만 남기고 커밋
  • 새로운 커밋이 생김 → non fast-forward merge

 

GitLab에 push

git push -u origin develop

 

1. 댓글 목록 ListView height 조절

- ScrollView 안에 모든 요소를 넣고 그 중에서 ListView가 있는 구조인데 ListView만 스크롤이 되고 전체 ScrollView는 스크롤이 되지 않는 상태였음

- ListView의 각 item들의 높이를 지정하는 코드를 적용하여 현재는 전체 ScrollView가 스크롤되도록 수정함

- 주의할 점은 firebase DB에서 데이터를 다 읽어온 다음에 height 계산을 해야 제대로 적용된다는 점!!

- https://hayarain.tistory.com/7 해당 포스팅을 참고함

private static void listViewHeightSet(BaseAdapter listAdapter, ListView listView){
    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++){
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }
 
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

 

2. 데이터 추가/삭제 후 기존 데이터가 중복 출력되는 문제 해결

- firebase의 DB에서 데이터를 가져오는데 데이터가 변경되고 난 후에 기존 데이터가 중복 출력되는 문제가 있었음

- 데이터가 변경되면 adapter의 ArrayList를 clear()로 비운 다음에 다시 데이터를 받아오도록 해서 문제 해결

 

3. 댓글 작성 완료 시 키보드 내리기, 댓글창 비우기

- 댓글 등록 기능은 어제 구현했는데 등록되고 나서 키보드가 닫히지 않고 그대로 있었음

- https://sharp57dev.tistory.com/15 해당 포스팅을 보고 참고함

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

EditText input = (EditText)findViewById(R.id.input)
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);	//키보드 내리기

 

4. 댓글 삭제 기능 구현

- CommentAdapter.java에서 각 item의 삭제 버튼에 onClickListener을 추가함

- PostContent.java에서 댓글 삭제할지 다이얼로그를 띄운 후, 네 버튼이 클릭되면 firebase DB에서 삭제하도록 함

 

5. 게시글 최신순 정렬

- 기존에는 가장 오래된 게시글부터 출력되었는데 일반적인 게시판처럼 최신순으로 정렬해야겠다고 생각함

- PostAdapter.java에서 ArrayList에 item을 추가할 때 인덱스 0에 추가하도록 코드를 바꿈으로써 해결

    public void addItem(Post item) {
        //items.add(item);	//기존 코드
        items.add(0, item);
    }

 


 

 

ListView(댓글 영역)만 스크롤되는 것이 아니라 ScrollView 전체가 스크롤된 모습이다.

 

 

댓글을 등록하고 나서 키보드가 자동으로 닫히고

기존에 있던 댓글 데이터가 중복 출력되는 문제가 더이상 발생하지 않는 모습이다.

 

 

작성한 댓글의 삭제 버튼을 클릭하면 다이얼로그가 뜨고

댓글 삭제가 완료되면 바로 화면이 업데이트 된다.

 

 

그리고 가장 최근에 작성된 게시글이 게시글 목록 가장 상단에 있는 것을 확인할 수 있다.

 

이렇게 게시판 주요 기능은 구현을 마쳤다.

익명게시판의 경우 댓글이 없는 대신 공감 기능을 넣을 예정인데

아직 앱 자체에 로그인 기능을 구현하지 않아서 지금은 건드리기 애매한 부분이다.

따라서 게시판 기능은 여기서 마무리하고 나중에 로그인을 구현하고 나서 다시 다룰 예정이다.

1. 게시글 내용 페이지

- 게시글 목록 불러오는 것까지 구현했었는데 이제 각 게시물 카드를 터치했을 때 게시글 세부 내용을 확인하는 페이지로 이동하도록 추가함

2. 게시글 수정 및 삭제

- 작성한 게시글 내용을 수정, 삭제해서 DB에 반영하는 기능을 구현함

3. 댓글 등록

- 게시글에 대한 댓글을 작성할 수 있음

4. 댓글 목록 조회

- Comment.java (model) 과 CommetAdapter.java (viewmodel)을 만듦 (일기 목록, 게시글 목록과 유사한 방식으로 구현)

- 어댑터를 ListView에 연결해서 댓글 목록을 불러오도록 함

 

 

게시글 내용 페이지는 게시글 내용과 댓글 목록, 댓글 입력 부분으로 구성되어있다.

 

문제는 전체를 ScrollView에 넣고 그 중 댓글 목록을 ListView에 넣었는데

ScrollView 자체는 스크롤이 안되고 ListView만 스크롤이 되고 있다...

테스트로 작성한 글은 내용이 짧기 때문에 얼핏 괜찮아보이지만

글 내용이 길어지면 댓글이 나오는 영역이 많이 줄어들기 때문에

이 부분을 어떻게 해결할 수 있을지 더 찾아보아야 한다.

 

 

게시글 수정 및 삭제 기능을 이용할 수 있다.

 

아직은 앱 로그인 기능을 구현하지 않아 수정/삭제 권한을 따로 부여하지 않은 상태인데

나중에 로그인을 구현하고 나서 이 부분을 많이 수정해야할거 같다.

 

 

게시글에 대한 댓글 작성도 가능한데

등록 버튼을 클릭하면 키패드가 닫히도록 수정해야한다.

현재는 등록 버튼을 클릭해도 키패드가 그대로 열려있는 상태이다.

 

그리고 게시글 작성/댓글 작성 후에 출력되는 목록에 버그가 있는데

(기존에 있던 목록) + (기존에 있던 목록) + (새로 추가한거)

이렇게 데이터가 중복돼서 출력되는 현상이다.

로직 실행 순서에 문제가 있는건지 잘 모르겠다.

이것도 구글링을 더 해봐야할듯

 

그래도 오늘 하루만에 CRUD를 모두 다뤄서 뿌듯하다.

앱에 광고를 달기 위해서 구글 애드몹에 가입했다!
구글 애드몹 가입부터 프로젝트 생성하기까지의 절차를 기록하였다.

https://admob.google.com/intl/ko/home/

Google AdMob: 모바일 앱 수익 창출

인앱 광고를 사용하여 모바일 앱에서 더 많은 수익을 창출하고, 사용이 간편한 도구를 통해 유용한 분석 정보를 얻고 앱을 성장시켜 보세요.

admob.google.com


애드몹 사이트에서 가입하기 버튼을 클릭한다.

애드몹에 가입할 계정으로 로그인을 한 후에 가입을 진행하면 되는데
처음에는 학교 계정으로 가입을 시도했다가
생년월일 정보가 입력되어있지 않아서 가입이 안된다고 하는 것이다.
다른 계정들과 비교해보니 학교 계정만 개인정보에서 생년월일을 입력하는 부분이 없더라...
그래서 결국 기존에 있던 다른 계정을 이용해서 가입을 진행하기로 했다.


먼저 국가, 시간대, 결제 통화를 선택한다.


선택하면 이용약관이 나오는데 동의함에 체크하고 넘어간다.


애드몹 계정 생성 자체는 완료되었다.


전화번호를 입력하여 계정 확인을 해야하는데
+82 010-XXXX-XXXX
위의 형식으로 입력해야한다.


문자 메세지로 받은 코드를 입력해서 계정 확인을 완료한다.


가입 후 애드몹 메인 화면에 있는 시작하기 버튼을 클릭한다.


플랫폼과 현재 앱 등록 여부를 선택하고
(사진 생략) 앱 정보를 입력한다.


애드몹에 앱이 추가되었다.


마지막으로 애드몹 사이트 왼쪽에 있는 메뉴들 중 지급에 들어가서
광고를 게재하기 전에 필요한 정보들을 입력한다.


양식에 맞게 입력하고 제출하면 끝!
이렇게 구글 애드몹에 가입하고 프로젝트 추가를 해보았다.


가입 직후에 바로 애드몹을 이용할 수 있는 것은 아니고
구글측에서 계정 인증을 해준 다음 이용 가능하다.
계정 인증은 24시간 내에 보통 완료된다고 나와있는데
나는 신청한지 약 6시간 뒤에 인증되었다고 메일이 왔다!

+ Recent posts