1. 로그아웃 기능 추가

- 마이페이지에 로그아웃 버튼 추가

- 파이어베이스 Authentication에서 로그아웃 필요

FirebaseAuth.getInstance().signOut();

- 로그아웃을 진행하면 기존에 실행되던 액티비티를 모두 종료하고 로그인 화면 액티비티만 새롭게 실행하도록 구현이 필요했음

- https://woochan-dev.tistory.com/41 포스팅의 내용을 참고하여 이것을 구현함

- addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) 처럼 인텐트에 flag를 부여할 수 있다는 사실을 알게 되었음

Intent intent = Intent(this, 실행할 액티비티.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)

 

2. 레이아웃 수정

- 일부 페이지 상단바 디자인 통일

- 게시글 작성/수정 페이지 레이아웃 수정

 

3. 메인 화면 랜덤 문구 출력

 

4. 1:1 상담 채팅 마음이 아이콘 추가

- adapter_message_one.xml 레이아웃 수정

 


 

 

마이페이지에 임시로 추가한 로그아웃 버튼을 클릭하면 팝업이 뜨게 되고 "네"를 클릭하면

기존에 실행되던 액티비티 (메인 화면, 마이페이지) 가 실행 종료되고 새롭게 로그인 화면 액티비티가 실행된다.

 

새로운 인텐트를 만들 때 context를 넘겨야하고, 액티비티가 스택처럼 쌓이는데

어떻게 기존 액티비티를 모두 종료시키며, 모두 종료시킨 후에 새로운 액티비티를 생성할 수 있을지가 고민이었다.

구글링해보니 Intent.addFlags() 메소드가 있어 새로 만들 인텐트에 대해 flag를 추가할 수 있었다.

새로운 사실을 알게 되었다!

 

 

지금 주요 기능 자체는 거의 구현이 되었고, 앱의 디자인이나 세부 기능들을 건드리고 있는데

최근에 Dialogflow가 제대로 연동되었기 때문에 이제 챗봇의 인텐트에서 질문 - 응답을 구현하기 시작할 것이다!

1. 게시글 작성 페이지 레이아웃 수정

2. Dialogflow - Android Studio 연결 완료

3. 1:1 상담 채팅 내역 Firebase DB 저장

4. 1:1 상담 채팅 내역 Firebase DB에서 읽어오고 화면에 띄우기

 

 

어제는 정말 감격스러운 날이었다!!😂

 

우리는 1:1 상담 기능을 구현하기 위해서 Google Dialogflow 챗봇 API를 이용하기로 했다.

6월부터 Dialogflow와 관련된 문서를 열심히 구글링해보았는데 검색 결과가 많이 나오지 않을 뿐더러,

특히 Android Studio에서 Dialogflow를 연결하는 방법에 대해 작성한 게시물이 전혀 없는 것이다...

더군다나 Dialogflow를 이용하기 위해서는 GCP(Google Cloud Platform)에서 서비스 계정을 만들고

fulfillment를 제대로 작성해야 하는데 그 과정에서 오류가 굉장히 많이 일어나서 팀원분이 정말 고생하셨었다.

 

그리고 어제! 문제를 모두 해결하였고

앱 화면에 Dialogflow 봇과의 채팅을 띄울 수 있도록 미리 작성해둔 코드를 실행하였는데

화면에 내가 보낸 채팅과, 봇의 답장이 모두 정상적으로 출력이 되는 것이다!! ㅠ_ㅠ

연결이 완료되고 난 후에는 Firebase DB에 저장/조회하는 코드를 빠르게 작성해서

1:1 상담 메뉴에 재접속했을 때 이전의 채팅 내역을 불러올 수 있도록 구현했다.

 

드디어 Dialogflow의 intent와 entities를 구성할 준비가 되었다...

빠르게 공부해서 본격적으로 챗봇 구성을 시작하고 싶다!!

 


게시글 작성 레이아웃을 깔끔하게 수정했다.

 

Dialogflow와 연결되어 정상적으로 채팅 기능을 이용하는 모습❤

 

새벽 시간에 완전 집중해서 개발했다!! 덕분에 많은 진전이 있었다.

슬슬 앱의 디자인적인 요소를 신경써야할거 같아서 폰트나 테마를 수정해봤고

주요 기능인 진단테스트 구현을 하루만에 거의 다 완성해서 좋다.

 

 

1. 로그인 사용자 싱글톤 패턴으로 관리

- 앱 기능 구현할 때 현재 로그인한 사용자 정보를 불러오는 경우가 많이 있는데 이것을 매번 firebase DB에서 불러오는 것이 비효율적이라는 생각이 들었음

- 최초 로그인 또는 앱에 재접속할 때 사용자 정보를 DB에서 불러와서 저장해두도록 함

- 사용자 정보가 필요할 때 해당 객체에 저장된 데이터 이용


2. 게시판 사용자 아이디 반영

- 글 작성 시 현재 로그인한 사용자의 uid를 같이 저장함

- uid를 이용해서 자신이 작성한 게시글만 수정/삭제할 수 있도록 함 (버튼 visibility 설정)

- 댓글 작성 시 현재 로그인한 사용자의 uid를 같이 저장함
- 마찬가지로 uid를 이용해서 자신이 작성한 댓글만 삭제할 수 있도록 함


3. 메인 화면 뒤로가기 버튼 클릭 시 팝업

- 메인화면에서 뒤로가기 버튼을 누르면 아무 메세지 없이 앱이 종료되는 상태였음

- 뒤로가기 버튼을 클릭하면 다이얼로그 팝업이 뜨면서 앱을 종료할지 묻고 "네"를 클릭하면 앱이 종료됨


4. 앱 디자인, 레이아웃
- style.xml을 이용해서 커스텀 폰트 적용, 버튼 기본 스타일 지정

- themes.xml에서 상속받는 테마를 Theme.AppCompat.DayNight.NoActionBar로 변경 (상단바 없앰)
- linear layout로 레이아웃 구현한 페이지들 -> constraint layout으로 다수 변경


5. 진단테스트
- 테스트 문항 데이터는 JSON 파일에 입력했고 assets 폴더에 저장함 (https://lktprogrammer.tistory.com/175 참고)
- 테스트 문항 목록을 recyclerview -> listview로 수정

- listview의 메모리 관리로 인해 스크롤하면 체크한 문항의 체크 표시가 사라지는 현상이 발생함 -> 체크 표시가 사라지지 않도록 코드 추가 작성 (https://kawaiineko.tistory.com/19 참고)
- 프로그레스바와 이미지 이동 애니메이션을 통해 테스트 진행 정도를 나타내도록 함 (프로그레스바 - https://www.youtube.com/watch?v=K5bFv_WDjVY , 이동 애니메이션 - https://www.masterqna.com/android/2980/이미지를-이동시키는-애니메이션을-만드는-방법을-질문합니다 참고)
- 모든 문항을 체크한 경우, 테스트 결과를 계산하고 DB에 저장
- 테스트 결과 화면에 점수를 출력함

 


 

앱 구상할 때 끄적였던 이미지도 간단하게 넣었고 기본 버튼 색에서 벗어나 연두색으로 버튼 기본 색상을 지정했다.

 

게시글, 댓글에 작성자의 이름이 출력되도록 반영했고 자신이 작성한 것만 수정/삭제 버튼이 존재한다.

 

메인 화면에서 뒤로가기 버튼을 클릭했을 때 팝업이 나온다.

 

진단테스트 진행 화면. 진행도에 따라 프로그레스바 값이 변한다.

 

테스트 결과 화면에 선택한 답변에 따라 계산된 점수가 표시된다.

 

1. 1:1 상담 채팅(dialogflow) - 앱 내의 레이아웃 구현
- https://www.youtube.com/watch?v=zVxDBBCdpfY 이 영상에 나온 방법대로 구현

- 메세지 전송 시 화면에 해당 메세지가 출력되는 상태

- 현재 dialogflow 서비스 계정에 문제가 생겨 제대로 작동하지 않고 있음. 이 부분을 고치기 위해 방법 찾아보는 중

 

2. 회원가입 관련

- 사용자 계정 관리는 firebase authentication을 이용해서 구현하기로 했음

- 회원가입을 위해 이메일, 비밀번호, 이름을 입력했는데 오류 발생 (task.IsSuccessful()이 false값을 리턴함)

- 구글링 결과, firebase authentication 자체에서 6글자 이상의 비밀번호만 사용 가능하게 되어있다는 것을 알게 되었음

- 회원가입 진행 코드에서 비번 길이를 확인해서 6글자 이하일때 토스트 메세지로 알리도록 함


3. 로그인 관련

- 앱 최초 실행 시 로그인 화면으로 이동, 회원가입으로 계정 생성 후 로그인 -> 메인 화면으로 이동하도록 함

- 이미 로그인을 한 적 있는 사용자는 로그인 과정 없이 (로그인 유지) 바로 메인 화면으로 이동하도록 구현

 

4. 마이페이지 사용자 정보 조회

- 로그인한 사용자의 이름, 이메일을 마이페이지 프로필에 띄우도록 함

 

이메일과 비밀번호를 입력해서 로그인 진행

 

1:1 상담 채팅 레이아웃 구현해서 채팅 입력 시 화면에 채팅 내역 출력

 

로그인한 사용자의 이름, 이메일 출력

  • 새로운 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하면 새로운 커밋이 생기지 않음

브랜치 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 전체가 스크롤된 모습이다.

 

 

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

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

 

 

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

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

 

 

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

 

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

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

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

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

+ Recent posts