루비앤레일즈는 기본적으로 MVC 패턴을 따르며, 이에 맞춰 웹 서비스가 가능합니다.


Cloud9 에서 프로젝트를 생성 후 간단한 페이지를 작성해 보겠습니다.


작업은 1. 프로젝트 생성 -> 2. 라우트 설정 -> 3. 컴포넌트 생성 -> 4. 컨트롤러 작성 -> 5. 뷰 작성 등으로 진행됩니다.


1. C9 프로젝트 생성


1.1 C9 로그인 후 Workspaces 에서 Create a new workspace 를 선택합니다.



1.2 Workspace 정보 입력 후 Ruby on Rails 템플릿을 선택합니다.



1.3 C9 프로젝트 생성 완료 화면입니다.



2. 환경설정


라우트에 주소규칙을 설정할 수 있습니다. config/routes.rb 파일에 아래를 참고하여 주소규칙을 작성해봅니다.

Rails.application.routes.draw do
  # get "/" => "<<컨트롤러>>#<<액션명>>" # "/" 로 접속시 <<컨트롤러>>의 <<액션명>> 실행
  # get "/" => "member#login" # "/" 로 접속시 member 컨트롤러의 login 액션 실행
  get "/member/login" => "member#login" # "/" 로 접속시 member 컨트롤러의 login 액션 실행
end


3. 컴포넌트 생성


Cloud9 bash 창에서 아래 커맨드로 컴포넌트 생성할 수 있습니다.

rails generate controller <<컴포넌트명>>  #<<컴포넌트명>> 컴포넌트 생성
rails g controller <<컴포넌트명>>  # 위와 동일
rails g controller Member   # Memeber 컴포넌트 생성


실제 컴포넌트 생성 결과입니다.

$ rails g controller Member   # Memeber 컴포넌트 생성
Running via Spring preloader in process 2371
      create  app/controllers/member_controller.rb     # 컨트롤러
      invoke  erb
      create    app/views/member                            # 뷰 경로
      invoke  test_unit
      create    test/controllers/member_controller_test.rb  # 컨트롤러 테스트
      invoke  helper
      create    app/helpers/member_helper.rb           # 헬퍼
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/member.coffee  #자바스크립트
      invoke    scss
      create      app/assets/stylesheets/member.scss   # 스타일시트


4. 컨트롤러 작성


config/routes.rb 에 작성하였던 컨트롤러에 액션을 추가해 보겠습니다.


app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.

class MemberController < ApplicationController
  def login
  end
end


5. 뷰 작성


이제 컨트롤러의 액션에 해당하는 뷰를 작성해 보겠습니다.


app/views/member/login.html.erb 파일을 생성 후 아래와 같이 작성해 봅니다. (파일명을 액션명과 맞춰줘야 합니다.)

<h1>Log In@@@</h1>



6. 결과 보기 및 다양한 출력 방법


지금까지 프로젝트 생성 후 라우트 설정을 하였고, 컴포넌트를 생성하여 컨트롤러와 뷰를 작성하였습니다.


이제 그 결과를 확인해 볼 차례입니다.


아래 C9 Workspace에서 Run Project 를 통해 서버를 구동시켜봅니다.



그리고 서버 구동 후 아래 링크들을 열어 결과를 확인해 볼 수 있습니다.



6.1 그 결과는 아래와 같습니다.



6.2 이번에는 컨트롤러에서 직접 내용을 출력해보겠습니다.


app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.


class MemberController < ApplicationController
  def login
    render text: "Log In!!!"  # 뷰에서 "Log In!!!" 문구 출력
  end
end

그 결과를 확인해봅니다.



6.3 이번에는 뷰 파일명을 달리하여 컨트롤러 액션에서 직접 지정하여 출력해보겠습니다.


app/views/member/test_login.html.erb 파일을 생성 후 아래와 같이 작성해 봅니다.

<h1>Log In Test@@@</h1>


그리고 app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.

class MemberController < ApplicationController
  def login
    render "test_login" # test_login 뷰 지정
  end
end


그 결과를 확인해봅니다.



이렇게 Cloud9 과 Ruby on Rails를 통해 간단하게 페이지를 작성해 보았습니다.


MVC 패턴 중 View 와 Controll 만을 사용하여 만들어 보았습니다. 


생각보다 어렵지 않게 페이지가 만들어 지는 것을 확인할 수가 있네요.


이상 간단 시식을 마칩니다.










'IT > ETC' 카테고리의 다른 글

Copilot 리서칭  (1) 2024.10.17
[SonarQube] SonarQube & Jenkins 이야기  (0) 2020.02.14
[SonarQube] SonarQube 도입기?  (0) 2020.02.07
[Docker] Docker란?  (0) 2018.03.23
Expert Beginner란...  (0) 2018.03.12

내년부터 Google Play Console에 앱을 등록/업데이트시 최신 API를 지정하는 것을 필수 사항이 된다고 합니다.


  • 2018년 8월 : 새로운 앱은 Target API 26 (Android 8.0) 이상.
  • 2018년 11월 : 기존 앱 업데이트시 Target API 26 이상.
  • 2019년 이후 : 매년 targetSdkVersion 올라감. 


이와 더불어 2019년 8월부터 새 앱 등록시 64비트 코드로 등록이 가능하다고 합니다.

(64비트 관련 JNI 미사용시 호환에 크게 문제가 없다고 함. 링크 )


관련 링크들 참조 : 







  

개인적으로 Cloud9 에서 작성한 Ruby On Rails 어플리케이션을 Docker로 돌려보기 위해 작업했던 내용들을 작성해봅니다.


사전에 Cloud9 에서 작업한 Ruby On Rails 프로젝트를 Bitbucket 으로 연결하여 git으로 형상관리를 하였습니다.


본 작업에서는 Docker Image 에서 Bitbucket에 올라간 Ruby On Rails 프로젝트를 clone 하여 사용하는 구조로 만들기로 합니다.

아래 Docker Image를 사용하려 하였으나, Deprecated 라는 내용 때문에 직접 Docker Image를 만들어 쓰기로 하였습니다.


https://github.com/docker-library/rails


1. 먼저 Docker Image를 만들기 위해 Dockerfile을 생성합니다.


FROM ubuntu
 
ENV PATH "~/.rbenv/bin:$PATH"
ENV PATH "~/.rbenv/versions/2.3.0/bin:$PATH"
ENV RAILS_ENV development
EXPOSE 3000
 
# Run upgrades
RUN apt-get -y update
 
# Install basic packages
RUN apt-get -y install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev
 
RUN apt-get install nano
 
#RUN cd
WORKDIR ~
RUN git clone git://github.com/sstephenson/rbenv.git ~/.rbenv 
 
RUN git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build 
 
RUN ls ~/.rbenv
RUN ~/.rbenv/bin/rbenv init -
 
# 루비 설치
RUN ~/.rbenv/bin/rbenv install -v 2.3.0 
RUN ~/.rbenv/bin/rbenv global 2.3.0
 
RUN ~/.rbenv/versions/2.3.0/bin/ruby -v
 
# gem 설정, bundler 설치
RUN echo "gem: --no-document" > ~/.gemrc
RUN ~/.rbenv/versions/2.3.0/bin/gem install bundler
 
# 레일즈 설치
RUN ~/.rbenv/versions/2.3.0/bin/gem install rails -v 4.2.5
RUN ~/.rbenv/bin/rbenv rehash
RUN ~/.rbenv/versions/2.3.0/bin/rails -v
 
# node js 설치
RUN apt-get -y install nodejs
 
# 프로젝트 소스 clone
WORKDIR /app
RUN git clone https://id:pwd@bitbucket.org/<<아이디>>/<<프로젝트>>
 
# bunde install
WORKDIR /app/testror
RUN ~/.rbenv/versions/2.3.0/bin/bundle install
RUN ~/.rbenv/versions/2.3.0/bin/bundle exec rake db:migrate
 
# rails 서버 start
CMD ~/.rbenv/versions/2.3.0/bin/rails s -b 0.0.0.0 -p 3000

위 내용을 간단히 설명하자면 아래와 같습니다.

  1. ubuntu 이미지 기반
  2. 환경변수 설정 후 3000포트 사용 정의
  3. 기본 패키지 업데이트 및 설치
  4. ruby 설치
  5. gem 설정, bundler 설치
  6. rails 설치
  7. node js 설치
  8. Rails 어플리케이션 clone
  9. bundle install 및 db migrate
  10. CMD 명령으로 컨테이너 실행시마다 rails 서버 시작

2. Dockerfile 작성 후 Docker Image 빌드를 합니다.


Dockerfile이 있는 경로에서 아래 커맨드를 실행합니다.

docker build -t ror .


위 커맨드를 간단히 설명하자면 아래와 같습니다.

  1. Docker Image를 build 하겠다.
  2. -t로 이름과 태그 지정(name/tag식으로 tag 안 쓸 경우는 name만). 이름은 ror로 지정
  3. . 으로 빌드 대상 경로 지정. Dockerfile 있는 경로로
  4. 완료 후 docker images 로 이미지 생성 완료 확인
  5. 실패시 docker rmi ≪image name≫ 으로 실패한 이미지 삭제

실행시 아래와 같은 결과를 확인할 수 있습니다.



$ docker build -t ror .
Sending build context to Docker daemon  16.38kB
Step 1/28 : FROM ubuntu
 ---> 20c44cd7596f
...
Successfully built 840df28a7759
Successfully tagged ror:latest

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ror                 latest              840df28a7759        2 hours ago         842MB


3. Docker Container를 생성 및 실행합니다.


Docker Image 생성 완료 후 아래 커맨드로 컨테이너를 생성 및 실행합니다.


docker run -d --name ror -p 60005:3000 ror


위 커맨드를 간단히 설명하자면 아래와 같습니다.

  1. Docker Image를 build 하겠다.
  2. Docker Container를 run 하겠다.
  3. -d 옵션으로 컨테이너를 백그라운드에서 실행
  4. --name 으로 컨테이너 이름 설정. ror로 설정함
  5. -p 로 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출(<호스트 포트>:<컨테이너 포트>)
  6. ror 이미지로 생성
  7. 실패시 docker rm ror 로 컨테이너 삭제
실행시 아래와 같은 결과를 확인할 수 있습니다.


$ docker run -d --name ror -p 60005:3000 ror
0431b06b76a1978898d3f0cdf44ebda94.......
$ docker logs ror
[2017-12-28 10:40:46] INFO  WEBrick 1.3.1
[2017-12-28 10:40:46] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-12-28 10:40:46] INFO  WEBrick::HTTPServer#start: pid=6 port=3000

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                     NAMES
0431b06b76a1        ror                 "/bin/sh -c '~/.rb..."   2 hours ago         Up 2 hours               0.0.0.0:60005->3000/tcp   ror


위와 같이 하신 후 브라우저에서 locahost:60005 로 연결하시면 Ruby On Rails 프로젝트 동작을 확인할 수 있습니다.


참고로 위 작업을 마친 후 아래 링크도 찾게 되었네요;; 그런데 안해봐서 아래 링크대로는 아직 확인을 못해봤습니다.


https://docs.docker.com/compose/rails/


위 링크를 따라하시다 안되시면 제 포스팅 내용을 참고하시면 될 거 같습니다.

'IT > 각종 환경설정' 카테고리의 다른 글

C9 VNC 사용시 한글 세팅  (0) 2018.03.12
DokuWiki 설정하기  (0) 2018.03.12
TISTORY 포스팅에서 코딩 스타일 입히기  (0) 2017.12.12

백종원의 스테이크 비법 정리본입니다.


1. 시즈닝


1.1 양면에 소금&(굵은)후추가루 넉넉히 뿌리기 (뿌린 후 두드리기)




1.2 칼집 내주기(힘줄 등에)




1.3 양면에 올리브유 바르기(올리브유 없으면 식용유)




1.4 냉장실에 한시간 정도 숙성


2. 시어링


2.1 올리브유는 넉넉히 두르고 연기가 살짝 나려할 때 고기 올리기




2.2 고기 올리고 튀기듯이 굽기(왠만하면 안탐)






2.3 후라이팬을 기울여 옆면도 익혀줌




2.4 탄듯할때까지 굽기


2.5 뒤집은 후 반대쪽도 비슷하게 익히기




2.6 그 뒤에 불을 줄인 후 익히기


2.7 굽기 정도를 생각해서 고기 눌러본 후 꺼내기


  - 엄지+검지를 붙이고 손바닥을 눌러보면 = 레어

  - 엄지+중지를 붙이고 손바닥을 눌러보면 = 미디엄

  - 엄지+약지를 붙이고 손바닥을 눌러보면 = 웰던


3. 레스팅(5~7분)


4. 자르기


내가 보려 정리해보는 도서 목차


핵심만 골라 배우는 안드로이드 스튜디오 3 & 프로그래밍 (닐 스미스/심재철) - Jpub


목차



CHAPTER 1 개요 _ 1


 

CHAPTER 2 안드로이드 스튜디오 개발 환경 구성하기 _ 6


 

CHAPTER 3 안드로이드 스튜디오로 첫 번째 애플리케이션 만들기 _ 28


 

CHAPTER 4 안드로이드 스튜디오 UI 둘러보기 _ 46


 

CHAPTER 5 안드로이드 스튜디오에서 AVD 생성하기 _ 58


 

CHAPTER 6 안드로이드 스튜디오 AVD 에뮬레이터 사용과 구성하기 _ 75


 

CHAPTER 7 실제 안드로이드 장치에서 애플리케이션 테스트하기 _ 86


 

CHAPTER 8 안드로이드 스튜디오 코드 편집기 _ 98


 

CHAPTER 9 안드로이드 아키텍처 개요 _ 111


 

CHAPTER 10 액티비티와 인텐트 개요 _ 117


 

CHAPTER 11 안드로이드 애플리케이션과 액티비티 생명주기 _ 122


 

CHAPTER 12 액티비티 상태 변화 처리하기 _ 128


 

CHAPTER 13 액티비티 상태 변화 예제 _ 138


 

CHAPTER 14 액티비티 상태를 저장하고 복원하기 _ 150


 

CHAPTER 15 안드로이드 뷰, 뷰 그룹, 레이아웃 _ 158


 

CHAPTER 16 안드로이드 스튜디오 레이아웃 편집기 살펴보기 _ 164


 

CHAPTER 17 안드로이드 ConstraintLayout 개요 _ 177


 

CHAPTER 18 안드로이드 스튜디오에서 ConstraintLayout 사용하기 _ 185


 

CHAPTER 19 안드로이드 스튜디오에서 ConstraintLayout 체인과 비율 사용하기 _ 199


 

CHAPTER 20 ConstraintLayout 예제 프로젝트 _ 209


 

CHAPTER 21 직접 XML 레이아웃 작성하기 _ 224


 

CHAPTER 22 ConstraintSet으로 ConstraintLayout 관리하기 _ 230


 

CHAPTER 23 안드로이드 ConstraintSet 예제 프로젝트 _ 238


 

CHAPTER 24 안드로이드 이벤트 처리 개요 _ 247


 

CHAPTER 25 안드로이드 스튜디오의 Instant Run 사용하기 _ 257


 

CHAPTER 26 터치와 다중 터치 이벤트 처리하기 _ 263


 

CHAPTER 27 안드로이드 제스처 감지 클래스로 일반 제스처 처리하기 _ 272


 

CHAPTER 28 커스텀 제스처와 핀치 인식 구현하기 _ 280


 

CHAPTER 29 안드로이드 프래그먼트 개요 _ 295


 

CHAPTER 30 안드로이드 스튜디오에서 프래그먼트 사용하기 ― 예제 프로젝트 _ 305


 

CHAPTER 31 오버플로 메뉴 생성과 관리 _ 323


 

CHAPTER 32 안드로이드 전환 프레임워크 _ 335


 

CHAPTER 33 beginDelayedTransition을 사용한 안드로이드 전환 _ 348


 

CHAPTER 34 안드로이드 장면 전환 구현하기 _ 355


 

CHAPTER 35 플로팅 액션 버튼과 스낵바 사용하기 _ 365


 

CHAPTER 36 탭 인터페이스 생성하기 _ 379


 

CHAPTER 37 RecyclerView와 CardView 사용하기 _ 393


 

CHAPTER 38 RecyclerView와 CardView 예제 프로젝트 _ 399


 

CHAPTER 39 앱 바와 컬랩싱 툴바 레이아웃 사용하기 _ 411


 

CHAPTER 40 내비게이션 드로어 구현하기 _ 421


 

CHAPTER 41 안드로이드 스튜디오 마스터/디테일 플로 _ 430


 

CHAPTER 42 안드로이드 인텐트 개요 _ 444


 

CHAPTER 43 명시적 인텐트 예제 프로젝트 _ 451


 

CHAPTER 44 암시적 인텐트 예제 프로젝트 _ 463


 

CHAPTER 45 브로드캐스트 인텐트와 브로드캐스트 수신자 _ 474


 

CHAPTER 46 스레드와 스레드 핸들러 _ 488


 

CHAPTER 47 스타트 서비스와 바운드 서비스 개요 _ 499


 

CHAPTER 48 스타트 서비스 구현 예제 프로젝트 _ 506


 

CHAPTER 49 로컬 바운드 서비스 예제 프로젝트 _ 518


 

CHAPTER 50 원격 바운드 서비스 예제 프로젝트 _ 529


 

CHAPTER 51 안드로이드 7의 알림 개요 _ 537


 

CHAPTER 52 안드로이드 7 알림의 직접 응답 구현 _ 550


 

CHAPTER 53 안드로이드 스튜디오에서 Firebase 사용하기 _ 559


 

CHAPTER 54 Firebase 원격 알림 사용하기 _ 567


 

CHAPTER 55 안드로이드 7의 다중 창 지원 개요 _ 575


 

CHAPTER 56 다중 창 예제 프로젝트 _ 585


 

CHAPTER 57 안드로이드 SQLite 데이터베이스 개요 _ 593


 

CHAPTER 58 TableLayout과 TableRow 개요 _ 603


 

CHAPTER 59 안드로이드 SQLite 데이터베이스 예제 프로젝트 _ 611


 

CHAPTER 60 콘텐트 제공자 이해하기 _ 622


 

CHAPTER 61 콘텐트 제공자 구현하기 _ 627


 

CHAPTER 62 구글 클라우드 스토리지 액세스하기 _ 643


 

CHAPTER 63 안드로이드 스토리지 액세스 프레임워크 예제 프로젝트 _ 652


 

CHAPTER 64 비디오 재생 구현하기 _ 666


 

CHAPTER 65 카메라 인텐트를 사용한 비디오 녹화와 이미지 캡처 _ 675


 

CHAPTER 66 런타임 퍼미션 요청하기 _ 683


 

CHAPTER 67 안드로이드 오디오 녹음과 재생하기 _ 693


 

CHAPTER 68 구글 맵 API 사용하기 _ 707


 

CHAPTER 69 안드로이드 인쇄 프레임워크 사용하기 _ 727


 

CHAPTER 70 HTML과 웹 콘텐트 인쇄 예제 프로젝트 _ 738


 

CHAPTER 71 안드로이드 커스텀 문서 인쇄 _ 750


 

CHAPTER 72 안드로이드 지문 인증 구현하기 _ 768


 

CHAPTER 73 서로 다른 안드로이드 장치와 화면 처리하기 _ 787


 

CHAPTER 74 안드로이드 애플리케이션 릴리스하기 _ 793


 

CHAPTER 75 구글 플레이 인앱 결제를 애플리케이션에 통합하기 _ 804


 

CHAPTER 76 안드로이드 스튜디오의 그래들 개요 _ 829


 

CHAPTER 77 안드로이드 스튜디오 그래들 빌드 예제 프로젝트 _ 841


 

찾아보기 _ 853 
 ※ 부록 A, B는 독자들의 이해를 위해 옮긴이가 작성한 특별 부록입니다. 
아래의 사이트에서 예제 프로젝트 파일과 함께 무료로 다운로드받으실 수 있습니다.

 

APPENDIX A 코틀린 핵심 파악하기: 개요와 실습 환경 구축


 

APPENDIX B 코틀린 핵심 파악하기: 구성 요소와 문법


 



'Android개발' 카테고리의 다른 글

[Android] DataBinding Library 3  (0) 2018.06.12
[Android] DataBinding Library 2  (0) 2018.06.12
[Android] DataBinding Library 1  (2) 2018.06.12
[Android] 프로세스(process) 및 스레드(thread)  (0) 2018.06.08
[Android] 서비스 (Service)  (0) 2018.06.08

Android 앱 개발을 하면서 서버와 통신을 위해 네트워크 기능을 쓸 경우가 대다수이다.


기존 네트워크 기능을 위해 HttpURLConnectionHttpClient (OS 6.0 부터 삭제) 등이 쓰여왔고, OS 3.0 (API 11) 이후에 


NetworkOnMainThreadException 를 피하고자 Thread, AsyncTask 등을 사용하기도 했다.


그 후 여러 편의성을 제공하는 통신 라이브러리 들이 등작하였다. OkHttp, Volley (설명), Retrofit ... (라이브러리 비교)


그 중에서 최근까지 많이 쓰이고 있는 Retrofit에 대해서 초간단 맛만 보기로 하자.


0. 준비물 : API, Android Studio, 잠시나마 집중하겠다는 마음가짐.


1. API

직접 준비하기 어려울 경우 공개되어 있는 고마운 API들을 찾아서 사용해보자. 

예를 들면 빗썸 OPEN API 같은... 


연습을 위해 https://api.bithumb.com/public/ticker/{currency}를 사용해보자.


2. build.gradle 설정

dependencies에 retrofit 최신버전을 추가한다. (Gson 사용을 위해 Gson 관련 추가한다.)


dependencies {
    compile 'com.google.code.gson:gson:2.8.2'                 // Gson 사용시
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'     // Gson 처리시
    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'  // String 처리시
    ...
}


3. Data 클래스 

결과 JSON에 맞춰 Data 클래스를 생성하자. (Json to Java Object 서비스)


public class BithumbTickerData {
    @SerializedName("opening_price")
    public String openingPrice;
    @SerializedName("closing_price")
    public String closingPrice;
    @SerializedName("min_price")
    public String minPrice;
    @SerializedName("max_price")
    public String maxPrice;
    @SerializedName("average_price")
    public String averagePrice;
    @SerializedName("units_traded")
    public String unitsTraded;
    @SerializedName("volume_1day")
    public String volume1day;
    @SerializedName("volume_7day")
    public String volume7day;
    @SerializedName("buy_price")
    public String buyPrice;
    @SerializedName("sell_price")
    public String sellPrice;
    @SerializedName("date")
    public long date;
}

public class BithumbTicker {
    @SerializedName("status")
    public String status;
    @SerializedName("data")
    public BithumbTickerData data;
}


4. interface 생성

API Method 방식 및 Path에 대해서 정의하자.


    public interface OpenApiService {
        @GET("public/ticker/{path}")
        Call tickerInfo(@Path("path") String path);
    }


5.1. Retrofit 초기화

Retrofit 생성 후 사용할 interface를 통해 서비스를 만들자. (Response를 String 형태로 받고 싶다면 ScalarsConverterFactory 사용)


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.bithumb.com/")
                .addConverterFactory(GsonConverterFactory.create())        // Gson 처리시
                //.addConverterFactory(ScalarsConverterFactory.create())  // String 등 처리시
                .build();
        OpenApiService openApiService = retrofit.create(OpenApiService.class);


5.2. Call 생성

만들어 둔 interface를 호출하는 Call을 생성하자.


        Call tickerInfo = openApiService.tickerInfo("BTC");


5.3. Callback 정의

enqueue() 를 통해 Callback에 대해서 정의하자.


        tickerInfo.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                Toast.makeText(TestMainActivity.this, response.body().toString(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Toast.makeText(TestMainActivity.this, t.toString(), Toast.LENGTH_SHORT).show();
            }
        });


이상으로 간단하게 Retrofit 시식을 마칠까 한다.




Retrofit 로그 보는 법과 Proguard 설정에 대해서 추가한다.


6. 로그 보는 법

build.gradle에 아래와 같이 추가한다.


dependencies {
        compile 'com.squareup.okhttp3:logging-interceptor:3.9.1'
        ...
}


그리고 Retrofit 초기화 하는 부분에 아래와 같이 추가한다.


        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        Retrofit.Builder retrofitBuilder = new Retrofit.Builder().baseUrl(url);

        if(BuildConfig.DEBUG) {
            retrofitBuilder.client(client);
        }

        if(!isString) {
            retrofitBuilder.addConverterFactory(GsonConverterFactory.create());
        } else {
            retrofitBuilder.addConverterFactory(ScalarsConverterFactory.create());
        }
        Retrofit retrofit = retrofitBuilder.build();


기존과 비교했을 때 OkhttpClient 라는 놈을 Retrofit Builder에 추가하는 모습이 보인다.

개인적으로 디버그 모드일때만 로그를 보기 위해 BuildConfig.DEBUG 로 분기 처리를 하였다.

그리고 로그 수준은 아래와 같다.


public final class HttpLoggingInterceptor implements Interceptor {
   ...
  public enum Level {
    /** No logs. */
    NONE,
    /**
     * Logs request and response lines.
     *
     * 

Example: *

{@code
     * --> POST /greeting http/1.1 (3-byte body)
     *
     * <-- 200 OK (22ms, 6-byte body)
     * }
*/ BASIC, /** * Logs request and response lines and their respective headers. * *

Example: *

{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     * --> END POST
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     * <-- END HTTP
     * }
*/ HEADERS, /** * Logs request and response lines and their respective headers and bodies (if present). * *

Example: *

{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     *
     * Hi?
     * --> END POST
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     *
     * Hello!
     * <-- END HTTP
     * }
*/ BODY }

위 소스를 보면 로그 레벨은 NONE, BASIC, HEADERS, BODY 로 이루어져 있다. 필요에 따라 설정하면 된다.

- NONE : No logs.

- BASIC : Logs request and response lines.

- HEADERS : Logs request and response lines and their respective headers.

- BODY : Logs request and response lines and their respective headers and bodies (if present).


위와 같이 하였을 때 로그는 아래와 같이 떨어진다.


12-26 17:53:03.411 15500-15624/com.test.testblabla D/OkHttp: --> GET https://api.bithumb.com/public/ticker/BTC
12-26 17:53:03.411 15500-15624/com.test.testblabla D/OkHttp: --> END GET
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: <-- 200 https://api.bithumb.com/public/ticker/BTC (693ms)
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: date: Tue, 26 Dec 2017 08:53:04 GMT
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: content-type: application/json
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: set-cookie: __cfduid=dd24fcf80c27cf456c60e275644e40a0e1514278384; expires=Wed, 26-Dec-18 08:53:04 GMT; path=/; domain=.bithumb.com; HttpOnly
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: access-control-allow-origin: *
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: access-control-allow-methods: *
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: access-control-allow-headers: *
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: set-cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22cf7e414ece7af81b8a35a0cdcaccd317%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.227.62.114%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A12%3A%22okhttp%2F3.9.1%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1514278384%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D4ca3239efcb6f4f81c5c8703401ade3bbef4e9fd; expires=Tue, 26-Dec-2017 10:53:04 GMT; Max-Age=7200; path=/
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: server: cloudflare-nginx
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: cf-ray: 3d32cec0fef194b7-NRT
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: {"status":"0000","data":{"opening_price":"19157000","closing_price":"20632000","min_price":"18853000","max_price":"21400000","average_price":"19977707.8742","units_traded":"26050.76859352","volume_1day":"26050.76859352","volume_7day":"176662.05473862","buy_price":"20620000","sell_price":"20623000","date":"1514278384536"}}
12-26 17:53:04.101 15500-15624/com.test.testblabla D/OkHttp: <-- END HTTP (323-byte body)

참조링크1 : https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor

참조링크2 : https://stackoverflow.com/questions/32514410/logging-with-retrofit-2


7. Progaurd 설정

앱을 실제 signed release apk 만들시 Progaurd 사용하는데, 이때 Retrofit 사용시 아래와 같이 proguard.pro 파일에 추가해준다.


# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions


Retrofit 로그에서 문제가 될시 아래도 추가해 보자.


-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

참조링크1 : http://square.github.io/retrofit/

참조링크2 : https://github.com/square/okhttp

추가로 아래 이슈 발생시 대응에 대한 링크 추가합니다.

- shouldOverrideUrlLoading() 내 처리 및 loadUrl() 후 return true 시 WebView 히스토리 꼬임 현상 등


수정 : https://support.google.com/chrome/forum/AAAAP1KN0B0uMbcDTxbqA4/?hl=en



아래 이슈들이 지난 2017.12.15 자로 업데이트 된 Chrome 63.0.3239.111 버전에서는 해결된 것으로 보입니다.


63버전이지만 위 버전보다 아래일 경우는 아래 이슈 내용을 확인할 필요가 있을 듯 싶네요.


추가로 T멤버십, 원스토어 쪽의 Chrome 63버전 이슈에 대한 공지 링크 붙입니다.


T멤버십 : http://www.tworld.co.kr/normal.do?serviceId=S_ETC_0084&viewId=V_CMN_0076&seq=1712150001


원스토어 : https://dev.onestore.co.kr/devpoc/support/news/noticeView.omp?noticeId=30722




구글 플레이의 업데이트 날짜로 2017.12.13 자로 Chrome 63.x 버전이 업데이트 되었습니다.


점진적 업데이트인지 단말마다 업데이트 버전이 다른 상태입니다.


안드로이드 7.0 이상에서는 Chrome WebView를 사용하고 있었죠. (참조)


하나 63버전 Chrome WebView를 사용한 앱들에서 몇몇 이슈들이 발견되고 있습니다.


- Web 페이지 내의 iFrame 사용시 iFrame에서 Cookie 접근이 안되는 현상 (request header가 날라갔다는 이야기도 있습니다.)


- shouldOverrideUrlLoading() 내 처리 및 loadUrl() 후 return true 시 WebView 히스토리 꼬임 현상 등


관련 링크들.


https://bugs.chromium.org/p/chromium/issues/detail?id=793648


- https://chromium-review.googlesource.com/c/chromium/src/+/827018


https://www.facebook.com/groups/gdg.korea.android/permalink/2030069960555125/


당장 해결책은 설정->앱관리->크롬->사용중지(업데이트 제거) 하여 크롬을 초기버전으로 돌리는 수 밖에 없어 보입니다.


카드사 등을 시작으로 많은 결제 관련 서비스들이 문제가 되고 있으며, 이에 대해 고객에게 크롬 문제점을 가이드하고 있는 것으로 보입니다.


WebView를 사용하는 앱을 서비스하고 계시다면 유의하시기 바랍니다.

역동적인 UI 지원을 할 수 있는 Lottie 라이브러리(2017년 2월에 airbnb에서 출시)에 대해서 초간단히 알아보자.


Android Source 예제 : http://airbnb.io/lottie/android/android.html


Lottie Json 샘플 : https://www.lottiefiles.com/


Lottie는 안드로이드(ICS/API14부터), iOS, 리액트 네이티브, 웹까지 다양한 플랫폼을 지원한다.


다 알아본 것 같다. 이제 돌려보자.


0. 준비물 : Lottie Json 샘플, 잠시나마 집중하겠다는 마음가짐.


Lottie Json 샘플은 Lottie Files 에서 마음에 드는 것을 선택하도록 한다.


원래는 주로 디자이너들이 쓸 것으로 보이는 After Effect 의 출력물인 .aep 파일을 After Effect의 플러그인인 

BodyMovin 을 통해서 json 파일을 뽑아낼 수 있다고 한다. (참조)

하지만 After Effect가 뭔지도 모르는 입장인지라 Lottie Files 에서 샘플을 받아 진행하기로 한다.


1. 샘플 json 파일을 assets 폴더에 넣어준다.




1. build.gradle 에 dependencies에 lottie를 추가한다.

dependencies {
    compile 'com.airbnb.android:lottie:2.3.0'
    ...
}


2. 사용할 xml에 LottieAnimationView를 추가한다.  이 때 json 경로를 넣어도 된다.

    <com.airbnb.lottie.LottieAnimationView
        android:id="@ id/animation_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:lottie_fileName="penguin.json"
        app:lottie_loop="true"
        app:lottie_autoPlay="true" />


3. LottieAnimationView에 json 설정 후 동작시킨다. 이 때 Listener를 달아 Animation 이벤트 처리도 가능하다.

        LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
        animationView.setAnimation("rejection.json");
        animationView.loop(true);
        animationView.playAnimation();


생각보다 간단하게 Lottie 를 시식코너 마냥 맛만 볼 수 있었다.

개발 관련된 포스팅을 보다 보면 소스들이 이쁘게 색을 입고 IDE 처럼 차려놓은 것들을 보게된다.

찾아보니 티스토리에서 기본 지원되는 부분은 아니고 SyntaxHighlighter 라는 붙여서 사용하는 것이었다.

생각보다 어렵지 않고 이에 대해 이미 시행착오를 겪고 잘 정리해주시는 고마운 분들이 있다.

그 중 내가 참고했던 한 포스팅을 올려놓는다.


http://sometimes-n.tistory.com/5


추가로 "<", ">" 등의 특수문자를 쓸때 "&lt;", "&gt;" 와 같이 문자열을 치환하여 사용해야한다.

소스 라인을 이리 바꾸는 일 또한 힘든 일이라 아래 서비스 등을 사용하면 도움이 된다.


http://www.elliotswan.com/postable/



---------------------------------------------------------------------------------------------------------------------


더 간단한 방법도 있었다.

android studio 처럼 나오게 하기 위해 찾아보니 있었다......


http://editorizer.tistory.com/190

'IT > 각종 환경설정' 카테고리의 다른 글

C9 VNC 사용시 한글 세팅  (0) 2018.03.12
DokuWiki 설정하기  (0) 2018.03.12
[Docker] Ruby On Rails 이미지 만들기  (0) 2017.12.28

앱 개발을 위해 안드로이드 OS 버전 대응이 필요한 시점들이 있다.


그를 위해 OS 버전별 차이점이 필요한 부분들도 있다.


검색하다 찾은 사이트이다. 


http://socialcompare.com/en/comparison/android-versions-comparison


비록 OS 버전별 사용자 차이점에 치중되어 개발 차이점이 없긴 하지만 아쉬운대로 참고할만 하다.


뒤져보면 이것저것 비교공유한 내용들이 있어 필요시 참고할만 하다.




OS 버전별 분포도도 추가한다.


출처 : https://developer.android.com/about/dashboards/index.html

VersionCodenameAPIDistribution
2.3.3 -
2.3.7
Gingerbread100.4%
4.0.3 -
4.0.4
Ice Cream Sandwich150.5%
4.1.xJelly Bean162.0%
4.2.x173.0%
4.3180.9%
4.4KitKat1913.4%
5.0Lollipop216.1%
5.12220.2%
6.0Marshmallow2329.7%
7.0Nougat2419.3%
7.1254.0%
8.0Oreo260.5%


위 도표는 Android Developer 사이트에서 퍼온 것으로 아래와 같은 내용이 본문에 있다.


"최신 Google Play 스토어 앱을 실행하고 Android 2.2 이상과 호환이 되는 기기를 반영합니다. 데이터의 각 스냅샷은 7일 전까지 Google Play 스토어를 방문한 모든 기기를 나타냅니다."


"2017년 12월 11일까지 7일 동안 수집된 데이터 배포율이 0.1% 이하인 버전은 표시되지 않습니다."


OS 버전 최근동향이 필요할시 참고하면 된다.

+ Recent posts