참고

blog.naver.com/getinthere/221695417720

 

안드로이드 6강 - (1) 서비스

1. 서비스 생명주기2. MP3 플레이어 만들기서비스는 액티비티가 죽어도 명시적으로 죵료하지 않으면 계속...

blog.naver.com

--

 

현재프로젝트

https://github.com/jaybon1/androidwork/tree/master/serviceTest

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

서비스 최초실행시에는 startService(onStartCommand) // 재실행시에는 bindService(onBind) // 종료시에는 unBind

--

 

 

백그라운드 실행, 알림 등

--

 

 

--

 

 

--

 

 

--

 

 

서비스 - 이렇게 생성해야 매니페스트에 등록된다

--

 

 

--

 

 

연습을 위해 함수들에 로그를 입력하자

--

 

 

뷰 세팅

--

 

 

메인액티비티에서 뷰를 연결하고

--

 

 

서비스를 실행해본다

--

 

 

실행해보면 로그에 보인다

--

 

 

서비스엣어 미디어플레이어 레퍼런스 생성 

 

음악을 실행하는 방법 (MyService파일)

 

음악종료시 (MyService파일)

--

 

 

메인액티비티에서 서비스의 레퍼런스를 받을 수 있는 방법이 없다
서비스에서 메인액티비티의 레퍼런스를 받을 수 있는 방법이 없다
서로 제어권이 없다(다른애플리케이션이라고 봐야됨)

---

 

--

 

 

지금 상태는 서비스를 날리는 것이기 때문에 음악 일시정지를 할 수 없다

바인더를 이용해야한다

--

 

 

마샬링

ex) user.java 의 필드가 있다면 직렬화하여 json으로 받아오면된다(메모리를 가져오는 것이아니라 데이터를 가져오는것)
메서드는 문자열로 가져오면 원복이 안된다

이때 마샬링 기법을 사용한다(오브젝트를 들고 오는 것)
서로의 메서드가 동기화 되어있어서 동적인 메서드 사용가능

- MBV(Marshal By Value)

- MBR(Marshal By Reference)

안드로이드에서는 마샬링 대신 AIDL을 사용

https://developer.android.com/guide/components/aidl?hl=ko

 

안드로이드 인터페이스 정의 언어(AIDL)  |  Android 개발자  |  Android Developers

AIDL(Android Interface Definition Language)은 전에 다뤄본 다른 IDL과 유사합니다. 클라이언트와 서비스가 모두 동의한 프로그래밍 인터페이스를 정의하여 프로세스 간 통신(IPC)으로 서로 통신하게 할 수 �

developer.android.com

 클라이언트와 서비스가 모두 동의한 프로그래밍 인터페이스를 정의하여 프로세스 간 통신(IPC)으로 서로 통신하게 할 수 있습니다.

인터페이스를 정의하고 추상메서드를 만든다
그리고 정보만 받아서 바인드하여 사용

메서드를 여러개 만들어도 되지만

메서드 하나만 만들어서 this를 리턴하면 레퍼런스에 접근할 수 있다

--

 

 

 

 

 

 

 

 

 

 

 

 

 

해당 프로젝트

https://github.com/jaybon1/springwork/tree/master/livere

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

 

 

라이브리 회원 가입

https://livere.com/

 

라이브리

간편한 사진/동영상 첨부

livere.com

--

 

 

무료버전 설치

--

 

 

localhost가 안먹히니 참고

--

 

 

--

 

 

--

 

 

--

 

 

--

 

 

--

 

 

테스트

--

 

 

 

 

 

앱 수준 gradle에 글라이드 의존성추가

--

 

 

매니페스트 파일에
인터넷 권한 코드와
ClearTextTraffic 코드를 입력

--

 

 

xml파일에 이미지뷰 세팅

--

 

 

메인액티비티에서 글라이드 코드 입력

--

 

 

테스트 결과

 

 

 

 

 

 

 

 

참고

blog.naver.com/getinthere/221799123006

 

springboot 23강 - AOP + logger(logback-spring.xml), AOP+BindingResult

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V31. 의존성2. AOP 파일 생성(1) c...

blog.naver.com

 

참고

https://blog.naver.com/getinthere/221799123006

 

springboot 23강 - AOP + logger(logback-spring.xml), AOP+BindingResult

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V31. 의존성2. AOP 파일 생성(1) c...

blog.naver.com

 

현재 프로젝트

https://github.com/jaybon1/springwork/tree/master/logTest

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

 

 

--

 

 

밸리데이션 이용

--

 

 

--

 

 

밸리데이션 어노테이션 확인

https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html

 

[Spring] Spring Annotation의 종류와 그 역할 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

javax 것을 사용

 

어노테이션으로 밸리데이션 체크

--

 

 

컨트롤러에 테스트 매핑추가

--

 

 

포스트맨 테스트

--

 

 

컨트롤러에서 에러처리

--

 

 

포스트맨에서 확인

--

 

 

AOP 의존성추가

--

 

 

pom.xml에 추가

--

 

 

컨트롤러에서 에러처리 코드를 잘래내기

--

 

 

aop로 바인딩 어드바이스를 하기 위해 패키지와 파일 생성

--

 

 

Around로 처리

--

 

 

로그를 확인하기 위한 로거 생성

--

 

메시지를 띄우기 위해 적어주기

1. 에러가 난 클래스 이름과 메서드이름을 변수에 입력
2. 콘솔에 로그를 남긴다 

--

 

 

--

 

 

이제 AOP로 warn이 뜨는 것만 파일로 낚아채보자

 

 

logback 설정파일 생성

--

 

 

--

 

 

예시코드 - 자신에 맞게 수정하여 사용하자

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

	<root level="INFO">
    	<appender-ref ref="STDOUT" />
    </root>
    
<!--     warn 설정시 warn info debug가 저장된다 -->
    <logger name="com.jaybon.config.aop.warn" level="WARN">
        <appender-ref ref="FILE" />
    </logger>

</configuration>
[출처] springboot 23강 - AOP + logger(logback-spring.xml), AOP+BindingResult|작성자 getinthere

--

 

 

로그 주소

 

콘솔에 뜨는 방식

 

파일명이 바뀌며 폴더를 날짜별로 정리 - RollingFileAppender
LOGS_ABSOLUTE_PATH - 위에서 설정한 로그 주소
maxFileSize - 파일 용량
maxHistory - 로그 개수

 

에러레벨을 설정한다
DEBUG / INFO / WARN / ERROR 순서의 위험도
자신의 위험도 이상의 내용만 뜬다

--

 

aspect파일에서 예외를 발생시키면 

--

콘솔에 로그가 찍히고

--

 

로그파일에 로그데이터가 저장되어 있다

--

 

 

 

 

 

'Server > Spring Boot' 카테고리의 다른 글

spring boot // 웹크롤링 제품리뷰  (0) 2020.08.21
spring boot // livere 사용하기  (0) 2020.08.18
spring boot // 센트리 sentry.io  (0) 2020.08.17
spring boot //구글 애널리틱스  (0) 2020.08.17
spring boot // oauth2  (0) 2020.08.11

 

 

참고

https://docs.sentry.io/clients/java/usage/

 

Manual Usage

 

docs.sentry.io

 

 

해당 프로젝트

https://github.com/jaybon1/springwork/tree/master/googleapp

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

 

 

 

 

로그 분석

DB에 로그를 저장하면 부하가 생기고
파일에 저장하면 보기가 힘들다
웹으로 보는 것이 편하다
(회사에서는 웹포트 이외에는 열지 않기 때문에 확인하기가 불편)

센트리에서 그러한 로그 기록을 관리해준다

 

--

 

 

--

 

 

--

 

 

디펜던시 추가해보자

--

 

 

--

 

 

세팅

--

 

 

--

 

 

--

 

 

키 확인 및 저장

DSN - 서버로 소켓달아서 던지는 것

--

 

 

프로젝트의 언어를 변경하려면

--

 

 

아무 언어나 선택하고 여기에서 other를 선택

--

 

 

문서를 보려면 사용

--

 

 

자바선택

--

 

 

문서에서 아래 코드를 참고하여 커스텀한다

 

아래와 같이 커스텀한다

--

 

 

컨트롤러에서 로그를 남길 부분에 logSimpleMessage사용

--

 

 

--

 

 

테스트용이라 간단히 구현하였다
추후에는 글로벌 익셉션 등에 해당 코드를 적용하여 에러관리를 할 수 있다

 

 

해당 프로젝트

https://github.com/jaybon1/springwork/tree/master/googleapp

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

 

구글애널리틱스

1. 구글애널리틱스 가입(웹/앱)
2. 파이어베이스 프로젝트 추가
3. 애널리틱스 문서 및 콘솔 확인
4. 헤더나 푸터에 애널리틱스 코드 입력
5. 서버에 템플릿페이지 등 생성(테스트를 위해서 여러개만들기)
6. 서버를 켜서 이동해보고 애널리틱스창에서 확인해보기

 

 

구글 애널리틱스 가입(웹 / 앱)

--

 

 

파이어베이스 - 파이어스토어 문서에서 애널리틱스 들어가기

--

 

firebase.google.com/docs/analytics/get-started?authuser=0

 

Google 애널리틱스 시작하기  |  Firebase

이 빠른 시작에서는 앱에 Google 애널리틱스를 추가하고 이벤트 로깅을 시작하는 방법을 설명합니다. iOS Android 웹 Google 애널리틱스는 앱의 사용량과 행동 데이터를 수집합니다. 이 SDK는 다음 두 ��

firebase.google.com

--

 

 

--

 

 

--

 

 

--

 

 

파이어베이스 프로젝트생성 - 애널리틱스 선택

--

 

 

호스팅은 지금은 체크하지 않는다

--

 

 

코드를 템플릿(머스태치)에 입력
(모든페이지에서 쓰려면 헤더에 등록)

--

 

 

--

 

 

테스트용 페이지들을 만들고 서버를 켜서 여기저기 이동해본다

--

 

 

파이어베이스 애널리틱스로 이동

--

 

 

대시보드에 들어오면 기록이 남아있다

--

 

 

'Server > Spring Boot' 카테고리의 다른 글

spring boot // log 남기기 / 파일로 저장하기  (3) 2020.08.17
spring boot // 센트리 sentry.io  (0) 2020.08.17
spring boot // oauth2  (0) 2020.08.11
spring boot // 구글 oauth 설정  (0) 2020.08.11
spring boot // ROLE 만들기  (0) 2020.08.11

 

해당 프로젝트

https://github.com/jaybon1/androidwork/tree/master/mvvmBindingFirestore1

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

뷰모델 구조

 

 

데이터바인딩

 

앱 수준의 gradle에 데이터 바인딩을 허용하는 코드 추가

    // 데이터 바인딩
    dataBinding {
        enabled = true
    }

--

 

 

데이터를 받아올 모델 생성

--

 

 

데이터를 출력할 액티비티를 세팅한다

1. layout으로 바깥을 감싼다
2. 데이터 바인딩을 위해 연결한다
3. 원하는 뷰에 데이터를 연결한다

--

 

바인딩 타입 생성을 위해 리빌드를 해준다

--

 

 

데이터 바인딩을 사용할 클래스에서 데이터바인딩을 한 XML파일의 이름을 파스칼표기법으로 불러보면
아래와 같이 XML파일이름+Binding으로 타입을 불러올 수 있다

1. 데이터바인딩을 위해 변수생성
2. 바인딩 변수를 설정한다 (상위컨텍스트와 mxl레이아웃을 입력한다)
3. 연습용 데이터를 입력한다

--

 

 

테스트
정상적으로 출력된다

--

 

파이어스토어

 

참고

https://ondolroom.tistory.com/745

 

파이어스토어 문서

https://firebase.google.com/docs/firestore/quickstart?authuser=0#%EC%9E%90%EB%B0%94

 

Cloud Firestore 시작하기  |  Firebase

빠른 시작에서는 Cloud Firestore를 설정하고 데이터를 추가한 후 Firebase Console에서 방금 추가한 데이터를 확인하는 방법을 볼 수 있습니다. Cloud Firestore 데이터베이스 만들기 Firebase 프로젝트를 아직

firebase.google.com

 

매니페스트 파일에 인터넷 권한을 설정한다

--

 

 

프로젝트 수준의 gradle에 파이어 스토어 관련 클래스패스를 추가

        // 파이어스토어
        classpath 'com.google.gms:google-services:4.3.3'

--

 

 

앱 수준의 gradle에 파이어스터오 플러그인 추가

// 파이어스토어
apply plugin: 'com.google.gms.google-services'

--

 

 

 

FireStore에 SHA1입력시 사용

--

 

 

프로젝트의 app 안에 fireStore에서 제공한 파일 넣기

--

 

 

파이어스토어에 테스트용 필드 추가

--

 

 

!! 지금 부터 테스트해보는데 오류가 나거나 안된다면 에뮬레이터에서 앱을 지우고 다시 실행해보자

 

 

데이터바인딩 테스트용 코드 주석처리

--

 

 

메인 액티비티에 파이어스토어 레퍼런스 추가

 

onCreate에서 파이어스토어 객체 가져오기(연습)

 

파이어스토어에서 데이터 가져오기 (연습) - 주석처리하자

 

파이어스토어에 빨대꼽기(푸시방식)

https://firebase.google.com/docs/firestore/query-data/listen?authuser=0

 

Cloud Firestore로 실시간 업데이트 가져오기  |  Firebase

onSnapshot() 메서드로 문서를 수신 대기할 수 있습니다. 사용자가 제공하는 콜백이 최초로 호출될 때는 단일 문서의 현재 내용으로 문서 스냅샷이 즉시 생성됩니다. 그런 다음 내용이 변경될 때마�

firebase.google.com

 

앱이 처음 켜질때 1번 실행되고
데이터가 변경 되었을 때 한 번 더 실행되었다

--

 

 

모델에 빈생성자를 만들어주어야 빨대가 작동한다
(아래에 나오는 Name name = snapshot.toObject(Name.class);)

--

 

 

빨대가 꽂아졌다면 해당 이벤트 실행시 데이터바인딩을 연동시켜보자

--

 

 

테스트
실행해보면 fireStore에 저장된 데이터가 화면에 출력된다.
(fireStore에서 데이터를 변경하면 자동으로 변경된다.)

--

 

 

MVVM

 

앱 수준의 gradle에 디펜던시를 추가한다
(뷰모델 프로바이더를 호출하기 위함)

    // LifeCycle
    def lifecycle_version = "2.0.0"
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

 

xml에 글자 입력칸과 버튼을 하나 추가하자

--

 

 

메인액티비티에서 테스트용으로 만들었던 파이어베이스 객체를 주석처리하거나 삭제하자

--

 

 

리파지토리를 생성하고 파이어베이스 객체를 생성하는 코드를 입력

(initPush는 빨대꼽기 가동 함수이다. 아래에서 확인)

--

 

 

1. 라이브데이터를 리턴한다.
2. 이름을 변경하는 함수
3. 파이어스토어 빨대꼽기를 실행하는 함수 (push 가동)

--

 

 

뷰모델에 AndroidViewModel을 상속해주고
LiveData를 리턴해주는 구독()함수
이름을 변경해주는 이름바꾸기()함수를 추가해준다.

--

 

 

1. 첫째줄은 뷰모델 프로바이더 객체에서 뷰모델 인스턴스를 얻는 과정이다
뷰모델 인스턴스를 얻은후 뷰모델의 구독함수를 observe 해놓으면 LiveData의 데이터가 바뀔 때마다 onChanged함수가 실행된다.
2. 버튼을 누르면 뷰모델의 이름바꾸기 함수가 실행된다. (뷰모델엔 빨대가 꽂혀있으니 뷰모델의 이름만 바꿔도 옵저버가 발동하여 onChanged가 실행된다)

--

 

 

테스트

이 화면에서는 보이지 않지만, 다른 기기에서도 새로고침 없이 데이터가 바뀌어버린다

 

 

 

 

해당 프로젝트

https://github.com/jaybon1/androidwork/tree/master/getApiTest

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

인터넷 연결을 위해 AndroidManifest.xml 에 아래코드를 추가해준다

<uses-permission android:name="android.permission.INTERNET"/>

--

 

 

구조

--

 

 

앱 수준의 gradle에 레트로핏과 gson 컨버터를 추가해준다(일반 gson과 다르니 참고)

    // 레트로핏
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'

    // gson
    implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.3.0'

--

 

 

데이터를 가져오기위한 간단한 뷰를 짠다

--

 

 

라이엇 api에서 가져온 데이터를 이용해서  http://www.jsonschema2pojo.org/  사이트를 통해 자바 객체로 만든다

 

변환 사이트

http://www.jsonschema2pojo.org/

 

만들어진 클래스

--

 

 

외부에서 데이터를 가져오기 위한 레트로핏2 서비스

--

 

 

아래처럼 하면 매개변수로 주소값을 설정 할 수 있다

--

 

 

mxl파일의 뷰들을 사용하기 위해 가져온다

--

 

 

1. 레트로핏 객체를 생성한다
- 바뀌지 않는 baseUrl 을 입력
- 가져온 데이터를 자바 객체로 만들기 위한 Gson 컨버터 입력

2. RiotService를 만들어준다
3. RiotService에서 데이터를 가져온다
4. 콜백이 오면 조건에 맟춰서 함수가 실행된다
5. response.body()에 담긴 자바객체를 가져온다 / 텍스트뷰에 뿌려준다
6. 통신에 실패할 경우 메시지를 띄운다

--

 

 

테스트

--

 

+ Recent posts