웹의 기초 개념

웹의 동작 개념

HTML을 받는 경우

  • 브라우저 : 서버 API에 요청을 보내서 받은 HTML 파일을 그려줌

데이터만 받는 경우

  • JSON 형식의 데이터를 받아와서 페이지에 끼우게 됨

클라이언트와 서버

  • 클라이언트 : 우리가 웹사이트를 보는 도구
  • 서버 : 우리가 보는 웹사이트에 뿌려줄 것을 만들어 클라이언트에 전달해주는 역할

 

서버리스(serverless)

  • 서버의 사양, 네트워크 설정 등이 되어있는 서버를 빌려서 사용함
  • 직접 서버를 구축하기 위한 인프라 작업을 하지 않아도 됨

 

DOM (Document Object Model)

  • HTML 단위 하나하나를 객체로 생각하는 모델
  • 트리구조

 


 

Javascript 기초

Class

  • 객체를 정의하기 위한 상태, 함수로 구성
class Cat {
  constructor(name) { //생성자
		this.name = name; 
	}

	showName(){ //함수
		return this.name;
	}
}

class MyCat extends Cat {
  constructor(name, age) {
		super(name); //부모 클래스의 생성자
		this.age = age; 
	}
	
	showName(){ //오버라이딩
		return '내 고양이 이름은 '+super.showName()+'입니다.';
	}
	
	showAge(){
		console.log('내 고양이는 '+this.age+'살 입니다!');
	}
}

let my_cat = new MyCat('perl', 4);
my_cat.showName();
my_cat.showAge();

 

변수 선언

  • var : 함수 단위 변수
  • let : block 단위 변수 (재할당 가능)
  • const : block 단위 변수 (재할당 불가)
function scope(){
	const a = 0;
	let b = 0;
	var c = 0;
	
	if(a === 0){ //block 기준 : 중괄호 {}
		const a = 1;
		let b = 1;
		var c = 1;
		console.log(a, b, c);
	}

	console.log(a, b, c);
}
  • 실행 결과 c만 1로 변하고 a, b는 바뀌지 않음

 

=, ==, ===

  • = : 변수에 값 할당
  • == : 동등 연산자, 유형을 비교하지 않는 등차
  • === : 일치 연산자, 유형도 비교하는 등차
💡
0 == "0" → true 반환 0 === "0" → false 반환

 

Spread 연산자

  • 객체 안에 있는 요소들을 객체 바깥으로 꺼내주는 역할
  • 점 3개 (...) → Spread 문법
let array = [1,2,3,4,5];
let new_array = [...array];

 

Array 내장 함수

1. map

  • 배열에 속한 항목을 변환할 때 사용
  • 변환한 값을 새로운 배열로 만들어줌 (원본 배열은 변화 X)
const array_num = [0,1,2,3,4,5];
const new_array = array_num.map((array_item) => {
	return array_item + 1;
});

2. filter

  • 특정 조건을 만족하는 항목만 골라서 새로운 배열로 만들어줌
const array_num = [0,1,2,3,4,5];
const new_array = array_num.filter((array_item) => {
	return array_item > 3;
});

3. concat

  • 배열과 배열을 합치거나, 배열에 특정한 값을 추가해주는 함수
const array_num01 = [0,1,2,3];
const array_num02 = [3,4,5];
const merge = array_num01.concat(array_num02);
  • concat은 중복 항목을 제거해주지 않음 → Set을 이용하면 가능
const array_num01 = [0,1,2,3];
const array_num02 = [3,4,5];
const merge = [...new Set([...array_num01, ...array_num02])];

 

  • Quiz_Array 내장 함수
    1. 아래 for문을 map으로 바꾸기
    const animals = ["강아지", "고양이", "햄스터", "강아지", "고양이", "고양이", "토끼"];
    
    let count = 0;
    for (let i = 0; i < animals.length; i++) {
    	let animal = animals[i];
    	if (animal === "고양이") {
    		count += 1;
    	}
    }
    console.log(count);
    • 정답
      const animals = ["강아지", "고양이", "햄스터", "강아지", "고양이", "고양이", "토끼"];
      
      let count = 0;
      animals.map((animal) => {
      	if (animal === "고양이") {
      		count += 1;
      	}
      });
      console.log(count);

     

    1. 아래 코드를 filter 이용하도록 바꾸기
    const animals = ["복슬 강아지", "검정 고양이", "노란 햄스터", "강아지", "노랑 고양이", "고양이", "흰 토끼"];
    
    let cats = [];
    for (let i = 0; i < animals.length; i++) {
    	let animal = animals[i];
    	if (animal.indexOf("고양이") !== -1) {
    		cats.push(animal);
    	}
    }
    console.log(cats);
    • 정답
      const animals = ["복슬 강아지", "검정 고양이", "노란 햄스터", "강아지", "노랑 고양이", "고양이", "흰 토끼"];
      
      let cats = [];
      const cats = animals.filter((animal) => {
      	return animal.indexOf("고양이") !== -1;
      });
      console.log(cats);

       

     

    1. 아래 두 배열을 하나로 합치기
    const dogs = ["검은 강아지", "노란 강아지", "흰 강아지"];
    const cats = ["검은 고양이", "복슬 고양이", "노란 고양이"];
    
    const animals = dogs.concat(cats);
    console.log(animals);

     

    1. 딸기는 몇 개일까? (map 이용)
    let fruit_list = ['사과','감','감','배','포도','포도','딸기',
    '포도','감','수박','딸기']
    
    let count = 0;
    for (let i = 0; i < fruit_list.length; i++) {
    	let fruit = fruit_list[i];
    	if (fruit == '딸기') {
    		count += 1;
    	}
    }
    console.log(count);
    • 정답
      let fruit_list = ['사과','감','감','배','포도','포도','딸기',
      '포도','감','수박','딸기']
      
      let count = 0;
      fruit_list.map((fruit) => {
      	if (fruit == "딸기") count += 1;
      });
      console.log(count);

       

     

 


 

React 프로젝트 만들기

NVM(Node Version Manager)

  • Node.js의 버전 관리자
  • 다양한 버전을 마음대로 골라서 설치할 수 있게 해주는 툴
  • 설치된 NVM 버전 확인
nvm --version

 

Node.js 설치하기

  • 설치하기
nvm install [설치할 버전]

 

  • 정상적으로 설치되었는지 확인
nvm ls //nvm으로 설치한 노드 버전 리스트 확인
node -v //노드 버전 확인

 

  • 사용 중인 노드 버전 바꾸기
nvm use [사용할 노드 버전]

 

Yarn 설치하기

  • NPM(Node Package Manager) : 무수히 많은 third-party 패키지를 활용할 수 있게 해줌
  • NPM과 유사한 도구 : Yarn→ 둘 다 프론트엔드 의존성을 관리하기 위한 패키지 매니저
  • → 이미 완성된 패키지를 가져다 쓰기 편리하도록 도와줌
  • NPM으로 Yarn 설치하기
//npm install [옵션] [설치할 패키지 이름]
npm install -g yarn
//-g : 컴퓨터 전체에서 쓸 수 있게 하는 옵션
yarn -v //yarn 버전 확인

 

  • Yarn으로 패키지 설치하기
yarn add [옵션] [설치할 패키지 이름]

 

CRA(create-react-app)으로 시작하는 리액트

  • Yarn으로 CRA 설치
yarn add global create-react-app

 

  • 리액트 프로젝트 만들기
//yarn create react-app [프로젝트 이름]
yarn create react-app week-1

 

  • 리액트 앱(프로젝트) 실행하기
//프로젝트 폴더로 이동한 후 실행
cd week-1
yarn start

 


 

JSX

JSX란?

  • 리액트에서 뷰를 그리는 방법→ JSX 문법을 이용해서 React 엘리먼트 생성, DOM으로 렌더링시켜서 그리기
  • 자바스크립트 안에서 HTML 태그 같은 마크업을 넣어 뷰 작업을 할 수 있음
const start_half = <div>
	<h1>안녕하세요</h1>
</div>;

 

JSX 규칙

  1. 태그를 반드시 닫기
  1. 반드시 1개의 엘리먼트를 반환하기
return (
	<div className="App">
		<p>안녕하세요</p>
		<input type="text"/>
	</div>
);
  1. JSX에서 자바스크립트 값을 가져오기 위해서는 중괄호를 사용
const cat_name = 'perl';
return (
	<div>
		hello {cat_name}!
	</div>
);
  1. 태그 내에서 클래스 명을 정할 때 class 대신 className을 사용
<div className="App">
  1. 인라인으로 style 넣기
//중괄호를 두 번 쓰는 이유 -> 딕셔너리도 자바스크립트이기 때문
<p style={{color:'orange', fontSize:'20px'}}>orange</p>

//또는 스타일 딕셔너리를 변수로 선언해서 사용
function App() {
	const style = {
		color: 'orange',
		fontSize: 20px'
	};

	return (
		<div className="App">
			<p style={styles}>orange</p>
		</div>
	);
}

 


 

Component

State

  • Component가 가지고 있는 데이터
  • 한 컴포넌트에서만 사용하는 정보를 주로 넣어놓고 생성, 수정하는 데이터

 

Props

  • Component가 부모 Component로부터 받아온 데이터
  • Props로 받은 데이터는 수정할 수 없다

 

함수형 Component

BucketList.js

import React from 'react';

const BucketList = (props) => {
	return (
		<div>
			버킷 리스트
		</div>
	);
}

/*
//또는 이렇게 작성할 수 있다.
function BucketList(props) {
	return (
		<div>버킷 리스트</div>
	);
}
*/

export default BucketList;
  • return을 통해 Component가 뿌려줄 UI 엘리먼트를 반환
  • 함수형 Component를 export하여 다른 컴포넌트에서 이 Component를 사용할 수 있도록 함

 

App.js

import React from 'react';
import BucketList from './BucketList';

function App() {
	return (
		<div className="App">
			<h1>내 버킷리스트</h1>
			<BucketList/>
		</div>
	);
}

export default App;

 

클래스형 Component

💡
class 클래스명 extends React.Component

App.js

import React from 'react';
import BucketList from './BucketList';

class App extends React.Component {
	constructor(props){
		super(props);
		this.state = { //state 정의
			list: ['영화관 가기', '매일 책읽기', '수영 배우기'],
		};
	}

	render() { //render 함수 안에 리액트 엘리먼트 넣기
		return (
			<div className="App">
				<h1>내 버킷리스트</h1>
				<BucketList/>
			</div>
		);
	}
}

export default App;

 

Component간의 데이터 전달

  • 함수형 Component에는 state가 없음 (React hook을 이용하면 state 사용 가능)
💡
<컴포넌트 명 [props 명]={넘겨줄 것(리스트, 문자열, 숫자, ...)}/>

App.js

render() {
	return (
		<div className="App">
			<h1>내 버킷리스트</h1>
			<BucketList list={this.state.list}/>
		</div>
	);
}

 

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가 제대로 연동되었기 때문에 이제 챗봇의 인텐트에서 질문 - 응답을 구현하기 시작할 것이다!

앱개발 종합반 수강을 마치며...

앱개발 종합반을 수강하며 제작한 나만의 꿀팁 앱

수강 계기 및 목적

나는 현재 컴공 4학년에 재학중이고, 앱 또는 웹 개발 프론트엔드 개발자가 되어야겠다고 진로 방향을 생각하고 있었다.

마침 1학기 종강도 했겠다, 방학 때 새롭게 공부를 시작해볼까 했던 터라 "앱개발 종합반"을 신청했다.

 

현재 한이음 프로젝트는 안드로이드 스튜디오를 이용해서 개발을 진행하고 있는데

앱개발 종합반의 강의 계획표를 보니 리액트 네이티브를 다룬다고 나와있었다.

 

리액트 네이티브에 대해 찾아보니 안드로이드/iOS를 모두 지원하는 크로스 플랫폼 앱을 제작할 수 있는 프레임워크라고 한다.

만약 나중에 앱 개발자가 된다면 두 개의 플랫폼을 모두 지원하는

크로스 플랫폼 앱 개발을 하는 것이 유리하고 생산적일거라는 생각이 들었다.

 

또한, 프론트엔드 개발자가 되기 위해서는 자바스크립트에 익숙해지고 잘 다룰 줄 알아야한다고 들었다.

앱개발 종합반 1주차 강의에서 자바스크립트의 기초를 잡고

2주차부터 리액트 네이티브 수업이 진행된다고 하기에 (리액트 네이티브가 자바스크립트를 기반으로 하기 때문)

자바스크립트 찐찐 기초밖에 모르는 상태에서 해당 강의를 수강함으로써

자바스크립트와 친숙해지고 그것을 기반으로 하는 프레임워크를 배우고자 하였다.

 

 

배운 점

올해 캡스톤디자인 프로젝트를 하면서 자바스크립트를 조금 다루긴 했으나,

잘 모르는 상태에서 이곳저곳에서 코드를 긁어오니 너무 어렵게만 느껴졌고

자바스크립트에 대한 약간의 거부감(?)이 드는 상태였다.

 

앞서 말한 것처럼 앱개발 종합반 1주차에는 자바스크립트의 기초를 배웠다.

리스트와 딕셔너리 자료구조를 배우고, 이것의 복합 구조가 JSON 데이터의 구조라는 것을 알게 되었다.

JSON이 무엇인지 모르는 상태에서 얼핏 봤을 땐 구조가 복잡해보여서 거부감이 들었는데

강의에서 쉽게 접근할 수 있도록 설명을 해주셔서 그런지 "별거 아니네!!" 라며 자신감을 갖게 되었다ㅋㅋㅋ

그리고 강의명이 앱개발 종합반인만큼, 앱개발 시 자주 사용되는 자바스크립트 문법을 따로 알려주셔서 좋았다.

 

2주차에는 본격적으로 리액트 네이티브 프로젝트를 생성하고 Expo를 사용해보았다.

안드로이드 스튜디오에서 개발을 할 때는 수정사항이 있을 때마다

매번 새롭게 빌드하고 실행해야하기 때문에 꽤나 번거로운 작업이 필요한데

Expo 클라이언트 앱을 이용해서 수정사항이 즉시 화면에 반영되는걸 보고 굉장히 편리하다는 생각이 들었다.

그리고 Expo 자체에서 제공해주는 기능들이 많아서 유용하게 활용할 수 있을 것 같았다.

리액트의 태그는 안드로이드 스튜디오의 레이아웃 xml이, 스타일은 CSS가 생각이 나서 어렵지 않게 받아들일 수 있었다.

 

3주차가 앱개발 5주간의 수업 중 가장 어렵게 느껴졌던 강의이다.

리액트의 기본 개념인 컴포넌트, 속성, 상태 중 상태!!가 처음에는 되게 추상적으로 느껴져서 어려웠는데

앱개발 종합반 수업에서 계속 다루는 나만의 꿀팁 앱 예제를 통해 다행히 이해할 수 있었다.

개인적으로 스파르타코딩클럽 강의에서 제공하는 코드스니펫 기능! 너무 좋은거 같다.

코드스니펫이 없었다면 강의에서 다룬 코드를 일일이 타자치고 있었을텐데

전공 강의를 4년간 들으면서 느낀건데, 무념무상으로 이게 뭔지도 모른채 하염없이 타자치고 있는 것보단

차라리 복붙을 해놓고 해당 코드에 대한 이해를 하는 것이 더 낫기 때문!

 

4주차에는 날씨 서버 외부 API를 불러와서 적용하는 방법을 배웠다.

내가 구현하고자 하는 기능을 구글링해보면 해당 기능 관련 API를 쉽게 찾을 수 있으므로

앞으로 개발할 때 다양한 API와 라이브러리를 활용하면 좋겠다는 생각이 들었다.

그리고 Google Firebase를 앱에 연결하고 스토리지, 데이터베이스를 이용해서 서버리스 아키텍처를 구현해보았다.

 

대망의 5주차! 지금까지 배운 내용을 바탕으로 앱을 개발하고나서

최종적으로 배포하기 위해 구글 광고를 앱 화면에 추가하고 구글 플레이스토어에서 배포하는 방법을 배웠다.

관련 자료를 하나하나 찾아가면서 구현하기에는 꽤나 번거로웠을텐데, 강의를 통해 처음부터 끝까지 차근차근 방법을 알 수 있어서 좋았다.

리액트 네이티브를 더 깊이 학습해서 이번에 배운 내용을 바탕으로 추후에 꼭 앱을 출시해보고 싶다~ 

 

향후 목표

수업 시간에 사용되었던 예제인 '나만의 꿀팁' 앱에 다양한 기능을 추가하여 완성도를 높일 것이고

이것과 별도로 앱개발 종합반에서 배운 내용들을 바탕으로 개인 프로젝트 '스케줄 앱'을 완성해볼 것이다!

 

소감

앱개발 종합반에서 자바스크립트와 친숙해지고 리액트를 기반으로 한 리액트 네이티브를 다뤄보았다.

깔끔한 강의 영상과 강의 자료(노션, pdf)를 보며 학습할 수 있어서 만족스러웠고

슬랙 채널 또는 주말에 있는 즉문즉답 시간을 활용하여 Q&A가 이루어지기 때문에

강의 내용 중 이해가 안되는 부분이나 그 외에 각자 공부하다가 막히는 부분을 물어볼 곳이 있다는 점이

스파르타코딩클럽 강의의 가장 큰 장점이지 않을까 싶다.

 

 

이상 앱개발 종합반 완주 후기 끝~

Dialogflow를 사이트 자체에서 세팅하는 것도 어려운 일이었는데

이것을 앱 화면에 띄우기 위해 Android Studio 내에서 코드를 짜는 것도 역시 어려운 일이었다.

관련 라이브러리가 무엇이 있는지도 모르고 어떤 메소드를 사용해야하고,

어떤 로직을 짜야하는지 너무 막막했기 때문이다.

 

그런 와중에 발견한 한줄기의 빛...!!!!🌟

 

https://youtu.be/zVxDBBCdpfY

 

영상으로 방법도 순서대로 알려주었으며

더보기란에 해당 코드의 GitHub 주소도 나와있어 많은 참고가 되었다!!

 

adapter, helper, interface, model 등 사용하는 파일이 많아 헷갈릴 수 있으나

해당 코드의 작동 원리를 분석하게된 덕분에 각 구성요소의 역할들을 학습할 수 있었다.

챗봇과의 1:1 상담 기능을 구현하기 위해 Google Dialogflow를 사용하려 했는데

구글링을 아무리 해도 관련 자료가 많이 없어 어려움을 겪고 있었다.

(자료가 있더라도 영어로 되어있으며 세팅 방법에 대한 내용은 나오지 않았다.)

 

유튜브에 검색을 해보니 한국인 교수님께서 설명을 해주시는 영상을 발견...!!!

많은 도움이 되었습니다 정말 감사드립니다 교수님...☺

 

https://youtu.be/b9A4fz6RG5A

 

https://youtu.be/QJgthQAGfwA

 

'Google > Dialogflow' 카테고리의 다른 글

Google Dialogflow 챗봇 API 설명  (0) 2021.06.17

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 상담 채팅 레이아웃 구현해서 채팅 입력 시 화면에 채팅 내역 출력

 

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

+ Recent posts