[go: up one dir, main page]

수많은 새로운 기능과 향상된 기능을 갖춘 Android Studio 2.2가 최근에 출시되었습니다. 새롭게 다시 작성된 통합 APK 패키징 및 서명 단계와 같이, 일부 사항은 Android Gradle 플러그인에서 눈에 띄지 않게 변경되었으므로 놓치기 쉽습니다.

APK Signature Scheme v2

Android 7.0 Nougat에 APK Signature Scheme v2를 새로 도입하면서, 저희는 Android Gradle 플러그인에서 APK를 어셈블하는 작업 방식을 다시 쓰기로 결정했습니다. 인내심을 가지고 이 문서에 설명되어 있는 v2 서명에 대한 매우 상세한 기술 정보를 모두 읽어볼 수도 있겠지만, 여기서는 Android 앱 개발자로서 알아둬야 할 정보만 요약해서 빠르게 파악할 수 있도록 간략히 설명하겠습니다.
  • 무결성을 확인하는 데 사용되는 APK의 암호화 서명이 지금은 ZIP Central Directory 바로 앞에 있습니다.
  • v1에서는 보관처리된 각 파일의 콘텐츠를 압축 해제한 것과 반대로, 여기서는 서명이 계산된 후 전체 APK 파일의 바이너리 콘텐츠에 대해 인증됩니다.
  • APK는 v1 서명과 v2 서명으로 모두 동시에 서명될 수 있으므로, 이전 Android 릴리스와도 호환됩니다.
Android가 APK를 인증하는 방법에 이런 변경 사항을 적용하는 이유는 무엇일까요? 첫째로는 이 새로운 서명 형식의 보안과 확장성을 강화하고, 둘째로는 성능 향상을 위해서입니다. 이 새로운 서명은 기기에서 인증하는 시간이 크게 단축되므로(비용이 많이 드는 압축 해제 불필요) 앱 설치 시간이 더 빨라집니다.

하지만 이 새로운 서명 구성표로 인해 APK 생성 프로세스에 새로운 제약 조건이 적용됩니다. v1에서는 압축되지 않은 파일 콘텐츠만 인증되었으므로, APK 서명 후에도 상당히 많은 콘텐츠를 수정할 수 있었습니다. 즉, 파일을 이리저리 옮기거나 심지어 다시 압축할 수도 있었죠. 실제로, 빌드 프로세스에 포함된 zipalign 도구가 정확히 그런 작업을 수행했습니다. 이 도구는 런타임 성능 향상을 위해 알맞은 바이트 경계에 ZIP 항목을 맞추는 데 사용되었습니다.

v2 서명은 애플리케이션 패키지를 구성하는 파일을 개별로 인증하지 않고 패키지 자체를 통째로 인증하므로, 서명 후에는 zipalign을 더 이상 실행할 수 없습니다. 그게 바로 압축, 정렬 및 서명 작업이 지금은 단 하나로 통합된 빌드 프로세스 단계에서 이루어지는 이유입니다.

빌드 프로세스에 어떠한 식으로든 APK 파일을 변조하거나 후처리하는 사용자 설정 작업이 있는 경우에는 해당 작업을 중지하세요. 그렇지 않으면 v2 서명이 무효화되어 APK가 Android 7.0 이상 버전과 호환되지 않을 위험이 있습니다.

개발자들이 (명령줄 등을 통해) 수동으로 서명하고 정렬하는 방식을 선택한다고 가정하고 Android SDK에 apksigner라는 새로운 도구를 제공합니다. 이 도구는 v1 및 v2 APK 서명 및 인증 기능을 모두 제공합니다. 참고로, v2 서명을 사용하는 경우 apksigner를 실행하기 전에 zipalign을 실행해야 합니다. 또한, JDK에서 제공되는 jarsigner 도구는 Android v2 서명과 호환되지 않으므로 v2 서명을 유지하려면 이 도구를 사용해 APK를 다시 서명할 수 없다는 점에 유의하세요.

Android Gradle 플러그인을 사용하여 빌드할 때 v1 또는 v2 서명을 추가하지 못하게 하려는 경우에는 build.gradle의 signingConfig 섹션에 다음 줄을 추가하면 됩니다.

v1SigningEnabled false
v2SigningEnabled false

참고: 두 가지 서명 구성표는 모두 Android Gradle 플러그인 2.2에서 기본적으로 사용됩니다.


더 작은 APK를 위한 릴리스 빌드

저희는 이번 기회에 패키지 작성 도구를 다시 작성할 때 릴리스 APK의 크기를 일정 수준 최적화했으며, 이에 따라 Play Store에서 다운로드 속도를 높이고 델타 업데이트 크기를 줄여 기기에서 낭비되는 공간을 줄이는 성과를 얻었습니다. 다음은 저희가 수행한 몇 가지 변경 사항입니다.
  • 애플리케이션 패키지 내 파일들이 정렬되어 APK간의 차이가 최소화됩니다.
  • 모든 파일 타임스탬프와 메타데이터는 0으로 처리됩니다.
  • 레벨 6 및 레벨 9 압축이 모든 파일에 대해 병렬로 검사되어 가장 적합한 압축 레벨이 사용됩니다. 즉, L9이 크기 면에서 거의 이점이 없다면 성능 향상을 위해 L6가 선택될 수 있습니다.
  • 네이티브 라이브러리가 압축되지 않고 페이지가 정렬된 상태로 APK에 저장됩니다. 이에 따라 Android 6.0 Marshmallow의 android:extractNativeLibs="false" 옵션이 지원되며, 이를 통해 애플리케이션은 기기에서 더 적은 공간을 사용할 뿐만 아니라 Play Store에서는 더 작은 업데이트를 생성할 수 있습니다.
  • Play Store 업데이트 알고리즘을 더욱 효과적으로 지원하기 위해 Zopfli 압축은 사용되지 않습니다. Zopfli로 APK를 다시 압축하지 않는 것이 좋습니다. 여전히 프로젝트에서 PNG 파일과 같은 개별 리소스를 사전에 최적화하는 것이 좋습니다.
이렇게 변경함으로써 사용자가 속도가 연결 속도가 느리거나 성능이 떨어지는 기기를 사용하는 상황에서도 정상적으로 앱을 다운로드하고 업데이트할 수 있도록 릴리스를 가능한 한 작게 만드는 데 도움이 됩니다. 하지만 디버그 빌드는 어떨까요?


설치 속도를 높이기 위한 디버그 빌드

앱을 개발할 때는 반복 주기, 즉 코드를 변경하여 빌드하고 연결된 기기나 에뮬레이터에 배포하는 과정을 빠르게 유지하고 싶으실 겁니다. Android Studio 2.0부터는 이 모든 단계를 최대한 빠르게 진행할 수 있도록 노력하고 있습니다. Instant Run을 통해 이제는 런타임 중에 변경된 코드와 리소스만 업데이트할 수 있으며, 그와 동시에 새 에뮬레이터는 멀티프로세서를 지원하고 더욱 빠른 APK 전송과 설치가 가능하도록 ADB 속도를 높여 줍니다. 빌드 기능 개선을 통해 그 시간을 훨씬 더 단축할 수 있으며, Android Studio 2.2에서 디버그 빌드를 위한 증분식 패키징과 병렬 압축 기능을 도입할 예정입니다. 대상 기기 밀도와 ABI를 위한 선택적인 리소스 패키징 등의 다른 기능과 더불어, 이 기능 덕분에 훨씬 더 빠르게 개발 작업을 수행할 수 있을 것입니다.

주의: Instant Run용으로 생성되었거나 디버그 빌드를 호출하여 생성된 APK 파일은 Play Store에 배포할 수 없습니다! 이 파일에는 Instant Run을 위한 추가 기기 코드가 포함되어 있으며 빌드를 시작할 때 연결되어 있던 기기를 제외한 기타 기기 구성의 리소스는 빠져 있습니다. Android Studio의 Generate Signed APK 명령어나 assembleRelease Gradle 작업을 사용하여 생성할 수 있는 APK의 릴리스 버전만 배포해야 합니다.

게시자: Wojtek Kaliciński, Android 디벨로퍼 어드보케

Firebase에 개발자가 멋진 앱을 더 쉽게 빌드할 수 있게 해주는 기능 일체가 포함되어 있다는 사실을 알고 계셨나요?

우리가 한동안 "게임" 대신 "앱"에 대한 얘기를 해왔다는 사실을 눈치채셨을지 모르겠군요. 그건 여러분이 Swift, 자바 또는 Objective-C로 앱을 작성하는 한 Google의 모바일 라이브러리가 훌륭하게 작동하기 때문이에요.

문제는 대부분의 게임 개발자들이 C++에서 자체 게임 엔진을 빌드하거나 인기가 많은 타사 게임 플랫폼(예: Cocos2D 또는 Unity)을 사용해 모바일 게임을 구동하고 있다는 사실입니다. 현재로서는 베타 버전으로 사용할 수 있는 C++ 버전의 Firebase 라이브러리를 구축한 상태인 데 반해, Unity 개발자들은 구식의 Firebase 데이터베이스 플러그인을 사용하는 상태로 남아 있습니다.

지금까지도 말입니다! Google의 많은 엔지니어들이 수고를 아끼지 않고 여러분이 계속해서 피드백을 주신 덕분에 Firebase 플랫폼의 훨씬 더 많은 기능을 포함하는 Unity SDK를 새로 출시하고 공식적으로 지원하게 되었습니다.

이것이 Unity 개발자에게는 어떤 의미일까요? 저희가 5월에 발표했던 새로운 Firebase 기능 중 많은 기능을 이제 활용할 수 있게 되었다는 의미랍니다. 즉, 다음과 같은 기능들이죠.

Firebase Analytics: 게임 내에서 발생하는 이벤트를 기록하는 분석 패키지로, 무료로 무제한으로 사용할 수 있습니다. 이 기능으로 게임 플레이어가 더 이상 나아가지 못하는 곳이 어딘지, 잠재고객이 시간이 지남에 따라 어떤 식으로 증가하는지, 또는 각국의 플레이어가 프리미엄 통화를 주로 어디에 쓰는지 알 수 있죠. 이 모든 것은 Firebase Analytics를 사용해 쉽게 기록할 수 있고, BigQuery와의 통합을 통해 작업하는 도중에 훨씬 더 정교한 데이터 마이닝을 실행할 수 있습니다.

Firebase 실시간 데이터베이스: 앱 데이터가 모든 기기에 걸쳐 보통 수백 밀리초 내에 마법처럼 동기화되는 데이터베이스입니다. 이는 사용자의 저장된 게임을 기기 간에 동기화하거나 턴 방식의 보드, 카드 또는 전략 게임을 구동하는 데 도움이 될 수 있으므로, 게임 내 채팅 기능과 같이 거의 실시간에 가까운 기능에 유용합니다. 즉, 멀티플레이어 슈팅 게임이나 MOBA를 구동하는 데 이 기능을 사용하고 싶진 않을 겁니다. 저는 게임 개발자들을 잘 알고 있어요. 그래서 '실시간'이 실제로 의미하는 바에 대해 좀 더 분명하게 짚어봐야 할 필요가 있답니다. ;)

동적 링크: 플레이어를 게임의 어떤 요소로 안내하거나(플레이어가 게임을 설치한 경우) Play Store/App Store로 이끌기 위해(플레이어가 게임을 설치하지 않은 경우) 사용할 수 있는 모바일 딥 링크입니다. 저는 게임 개발자가 동적 링크를 활용할 수 있는 최고의 사용 사례는 동적 링크를 사용해 인앱 공유를 가능하게 하는 것이라고 생각해요. 동적 링크를 사용하면 게임의 어떤 레벨을 재생하여 공유하거나 플레이어의 멋진 새 캐릭터/요새/사용자가 생성한 콘텐츠로 연결해 주는 링크를 공유할 수 있습니다. 이 모든 작업을 수행하는 자체 인터페이스를 빌드하고 싶은 생각이 없다면 Firebase 초대를 통해 멋진 형식의 이메일이나 SMS 메시지 안에 동적 링크가 패키징되어 자동으로 생성되도록 할 수도 있습니다.

인증: "휴우~ 전 정말이지 게임을 만드는 데만 집중하고 싶은데 인증 시스템을 빌드하느라 시간을 다 써버리는 것 같아요"라고 말하는 게임 개발자는 지금까지 없었습니다. Firebase 인증을 사용하여 앱을 개발하면 Facebook, Google, Github 등 제3의 공급자 서비스를 이용하던 사용자가 더욱 쉽게 여러분의 앱에 로그인할 수 있도록 하거나 맞춤 사용자 이름 및 비밀번호 시스템을 더욱 쉽게 만들 수 있습니다.

클라우드 메시징: Firebase 클라우드 메시징을 사용하면 단일 엔드포인트를 통해 iOS 기기와 Android 기기로 모두 알림을 보낼 수 있습니다. 또한, Firebase 알림 패널을 통해 알림을 보낼 수도 있습니다. 즉, 개발팀에서 기술 담당자가 아닌 팀원이라도 맞춤 서버 코드나 curl 호출 작성에 대한 염려 없이 알림을 보낼 수 있습니다.

원격 구성: 이 기능을 사용하면 클라우드에서 게임의 값을 업데이트할 수 있습니다. 솔직히 말해, 이는 게임과 관련해 제가 가장 흥미를 느끼는 기능입니다. 타워 방어 게임을 설계한 사람이면 누구나 하나의 유닛에서 압도적인 하나의 기록이 전체 게임의 균형을 무너뜨릴 수 있다는 점을 알고 있을 겁니다. 원격 구성에서는 클라우드에서 이러한 값을 변경한 후 Firebase Analytics를 사용해 이러한 변경이 기대하는 결과를 가져다 줄지 확인할 수 있습니다. 원격 구성을 사용하면 전문가 플레이어와 같은 특정 사용자 그룹에 사용자 설정 값을 제공할 수도 있습니다.

Android 기기와 iOS 기기에 이 라이브러리를 직접 사용할 수 있지만, 관련 팀에서 친절하게도 Windows, macOS 및 Linux용 스텁 메서드에 추가해 두었으므로 데스크톱도 대상으로 하는 게임인 경우 많은 조건 코드를 추가하는 문제를 걱정할 필요가 없습니다. 여담으로, SDK의 실시간 데이터베이스 부분은 Unity 편집기 내에서 직접 작동하여 테스트와 디버그 작업이 좀 더 훌륭하게 이루어집니다.


Unity용 Firebase SDK를 직접 시험해 보세요! 바로 여기서 사용할 수 있으며, 개발자가 꽤 멋진 게임을 더 쉽게 빌드할 수 있게 해주는 기능이 전부 포함되어 있습니다.

Todd Kerpelman 디벨로퍼 어드보케

▶ 원문 링크


요즘 인공 지능과 관련된 흥미진진한 일들이 많이 일어나고 있습니다. 그래서 스스로 머신 러닝 기술을 한번 다루어 보려는 사람들도 많습니다. 저희는 엔지니어든, 취미로 하는 사람이든, 학생이든, 단순히 호기심 넘치는 사람이든 상관없이, 누구라도 인공 지능 기술을 더 쉽게 다루어 볼 수 있도록 도움을 드리고 싶습니다. 하지만 때로는 이제 막 인공 지능 기술을 접하는 사람들이 꽤나 두려움에 휩싸일 수도 있습니다.

그게 바로 저희가 A.I. Experiments라고 하는 사이트를 만든 이유입니다. 이 사이트에서는 누구라도 인공 지능 기술과 관련된 실습을 통해 간단히 실험해보고 나름대로의 실험 환경을 만들 있는 리소스를 제공합니다.



이런 실험을 통해 머신 러닝이 이미지, 그림, 언어, 소리 등과 같은 모든 종류의 것들을 어떻게 이해하는지 알 수 있습니다. 이런 실험은 웹 개발자, 음악가, 게임 디자이너, 새 소리 연구가, 데이터 시각화 전문가 등 각기 다른 관심 사항을 가진 사람들이 고안한 것으로, 참여한 모든 이가 머신 러닝을 사용하는 방법에 대한 각자의 아이디어를 제공하고 있습니다.

또한, 코드 작성자도 자신만의 실험을 더욱 쉽게 만들어 볼 수 있도록 하고 싶습니다. 저희가 특별히 선보이는 많은 프로젝트는 Cloud Vision API, Tensorflow 및 머신 러닝 커뮤니티에서 얻을 수 있는 기타 라이브러리 등, 누구라도 사용할 수 있는 도구를 사용해 빌드한 것입니다. 이 사이트에는 제작자들이 자신의 작업 방식을 설명하는 동영상과 함께, 시작하는 데 도움이 되는 오픈소스 코드로 연결해 주는 링크가 포함되어 있습니다. A.I. Experiments 웹 사이트에 들러 자신이 직접 만든 결과물을 제출하거나 다른 사람들이 올려둔 것을 살펴시기 바랍니다.

머신 러닝으로 어떤 일을 할 수 있는지 더 심층적으로 알고 싶으면 Google Arts & Culture에서 동료 개발자들의 새로운 실험을 확인해 보세요.

Alexander Chen, Creative Lab

▶ 원문 링크


Google 웹마스터 센터는 귀하에게 도움이 되길 바라며 지난 몇 주간 Accelerated Mobile Pages에 대한 수많은 세부사항을 정리했습니다. 다음의 주제를 다룹니다.

또한 웹마스터 포럼에서 Google 검색에서 AMP 사용을 시작하는 것에 대한 몇 가지 AMP 질문을 확인했습니다. 도움을 드리고자 Google 웹마스터 센터에서 확인한 가장 일반적인 질문 몇 가지를 정리해 보았습니다.


질문: 웹사이트의 AMP 페이지 제작을 고려하고 있습니다. 장점이 무엇인가요? 어떤 사이트와 페이지에 AMP가 적합한가요?

사용자는 빠르고 수월하게 로드되는 콘텐츠를 좋아합니다. AMP 형식을 사용하면 사용자가 모바일 기기에서 콘텐츠를 사용하고 몰입할 의향을 높여줄 수 있습니다. 연구에 따르면 사용자 중 40%가 로드에 3초 이상 걸리는 사이트를 떠납니다. The Washington Post는 AMP를 적용한 결과 기사 로드 시간이 88% 감소하고 모바일 검색결과에서 재방문하는 사용자 수가 23% 증가했습니다.

AMP 형식은 뉴스, 레시피, 영화 목록, 제품 페이지, 리뷰, 동영상, 블로그 등 모든 정적 웹 콘텐츠에 유용합니다.

질문: 이미 문제를 해결했는데도 Search Console에 AMP 페이지 오류가 기록됩니다. 왜 아직도 오류가 표시되나요?

간단히 답변하면 Search Console에 AMP 페이지 변경사항이 업데이트될 때까지 약 1주가 걸립니다. 더 자세한 답변은 Google 웹마스터 트렌드 분석 담당자 John Mueller가 Search Console 지연 문제에 대해 공유한 자세한 게시물을 참조하세요.

질문: AMP 페이지가 Google 검색에 표시되지 않습니다. 어떻게 하나요?

유효한 AMP 페이지만 Google 검색에 표시됩니다. AMP HTML 웹 유효성 검사 도구Chrome 또는 Opera 확장 프로그램을 사용하여 AMP 페이지의 유효성을 검사하거나 크론 작업과 같은 좀 더 자동화된 프로세스를 통해 새 콘텐츠가 모두 유효한지 확인합니다.

AMP 페이지에 schema.org 구조화된 데이터를 포함하는 것을 전반적으로 권장하며(JSON-LD 추천) 이는 특히 뉴스 게시자에게 중요합니다. 유효한 마크업 속성을 포함하는 뉴스 콘텐츠는 Google 검색 결과의 주요 뉴스 섹션에 표시될 수 있습니다. 구조화된 데이터를 테스트하려면 구조화된 데이터 테스트 도구를 사용해 보세요.

여기에서 해결되지 않은 질문이 있으면 아래의 댓글이나 Google 웹마스터 Google+ 페이지에 의견을 공유해 주세요. 자유롭게 웹마스터 도움말 포럼에 글을 게시하셔도 좋습니다.

게시자: Tomo Taylor, AMP 커뮤니티 관리자

▶ 원문 링크


Firebase 인증은 Google, Facebook, Twitter 및 GitHub를 통해 매우 쉽게 인증을 수행할 수 있도록 하는 페더레이션 ID 공급자를 지원합니다. 예를 들어, 웹 앱에서 Firebase 사용자가 Google로 로그인하는 데 필요한 모든 사항은 다음과 같습니다.

var google = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(google);

하지만 어떤 경우에는 사용자가 다른 ID 공급자를 이용하여 Firebase 앱에 로그인할 수 있도록 하고 싶을 수도 있습니다. 예를 들어, 사용자가 Instagram API를 사용해 Instagram 사진을 공유할 수도 있도록 할 계획인 경우에는 특히 Instagram이 훌륭한 대안이 될 수 있습니다.
Firebase가 기본적으로 지원하지 않는 ID 공급자도 이용할 수 있으나, 이 경우 약간 더 많은 코드 및 서버가 필요합니다. 그러면 Instagram 로그인을 Firebase 웹 앱에 통합하는 데 필요한 단계를 살펴봅시다. Instagram은 로그인에 OAuth 2.0을 사용하므로, 이 게시물은 LinkedIn과 같은 다른 OAuth 2.0 ID 공급자를 적용하는 데도 틀림없이 도움이 될 것입니다.


디자인 개요

Instagram은 앱을 승인하고 Instagram 사용자의 ID를 포함하는 사용자 데이터에 액세스하기 위한 주요 경로로써 OAuth 2.0을 지원합니다. 이 경우, 사용자가 OAuth 2.0 인증 코드 흐름을 거치고 앱에 액세스 권한을 부여하도록 해야 합니다. 다음은 OAuth 2.0 흐름의 진행 방식입니다.

우선, Instagram의 승인 엔드포인트로 사용자를 리디렉션해야 합니다. 그러면 Instagram에서는 사용자에게 개발자의 앱에 대한 액세스 권한을 부여하도록 최초 요청 시 동의 작업을 팝업 창을 통해 수행합니다.

사용자가 앱을 승인한 후에는 인증 코드와 함께 도메인으로 다시 리디렉션됩니다. 서버 쪽에서는 Instagram 앱의 사용자 인증 정보를 사용하여 액세스 토큰을 얻기 위해 인증 코드를 교환할 수 있습니다. 인증 코드를 교환하는 프로세스에서 Instagram은 사용자 ID도 반환합니다. LinkedIn 등의 다른 OAuth 2.0 공급자를 이용하는 경우에는 가끔 추가적인 요청이 필요하기도 합니다.
서버에서 Instagram 사용자 정보를 가져온 후 Firebase 맞춤 인증 토큰을 생성합니다. 사용자는 이 토큰을 통해 signInWithCustomToken 메서드를 사용하여 웹 앱에서 Firebase에 로그인할 수 있습니다.
클라이언트에서 Firebase 프로필을 업데이트할 수 있도록 표시 이름, 사진 URL 등, Instagram에서 가져온 사용자 프로필 정보도 전달해보겠습니다. (참고: Instagram은 사용자의 이메일을 제공하지 않으므로 이메일 정보가 없는 Firebase 계정을 가지게 될 텐데, 그래도 괜찮습니다.) 작업을 마쳤으면 팝업을 닫습니다. 그러면 이제 사용자가 Instagram 계정에서 가져온 프로필 데이터로 Firebase에 로그인됩니다.


실제로 빌드해 봅시다!

이제 좀 더 세부적으로 들어가서, 이 통합의 핵심 요소를 구현하는 방법을 살펴봅시다. Node.js에서 백엔드를 작성해볼게요.


Instagram으로 앱 등록

웹 앱에 Instagram 인증 흐름을 시작하는 버튼을 추가해야 합니다. 이를 수행하려면 먼저 OAuth 2.0에 필요한 앱 사용자 인증 정보를 가져올 수 있도록 애플리케이션을 Instagram Developers 콘솔에 등록해야 합니다.
Instagram 앱 구성에서 http://localhost:8080/instagram-callback(테스트용) 및 https:///instagram-callback(프로덕션 도메인)을 유효한 리디렉션 URI로 허용 목록에 추가했는지 확인하세요. Instagram 클라이언트 ID클라이언트 비밀번호는 따로 잘 적어두세요. 나중에 필요하니깐요.

클라이언트 ID와 비밀번호를 가져오려면 앱을 등록하고 콜백 URL을 허용 목록에 추가하세요. 이는 모든 OAuth 2.0 공급자 이용 시 진행해야 하는 일반적인 단계입니다.


Instagram의 OAuth 2.0 구성

서버에서 OAuth 2.0 프로토콜의 세부 정보를 숨기는 데 도움이 되는 simple-oauth2 패키지를 사용하겠습니다. 이 패키지를 설정하려면 Instagram 클라이언트 ID와 비밀번호, 그리고 Instagram의 OAuth 2.0 토큰 및 승인 엔드포인트와 같은 몇 가지 값을 제공해야 합니다. 다음은 Instagram에 사용해야 하는 값입니다.
// Instagram OAuth 2 setup
const credentials = {
 client: {
   id: YOUR_INSTAGRAM_CLIENT_ID, // Change this!
   secret: YOUR_INSTAGRAM_CLIENT_SECRET, // Change this!
 },
 auth: {
   tokenHost: 'https://api.instagram.com',
   tokenPath: '/oauth/access_token'
 }
};
const oauth2 = require('simple-oauth2').create(credentials);


Instagram 인증 흐름 시작

서버에서 사용자를 Instagram의 동의 화면으로 리디렉션하는 URL 핸들러를 추가하세요. 이 작업의 일부로, 사용자가 Instagram 인증 흐름을 거친 후 다시 리디렉션되는 경로인 리디렉션 URI를 입력해야 합니다. 이 경우에는 /instagram-callback을 콜백 핸들러 경로로 사용하겠습니다.

app.get('/redirect', (req, res) => {
  // Generate a random state verification cookie.
  const state = req.cookies.state || crypto.randomBytes(20).toString('hex');
  // Allow unsecure cookies on localhost.
  const secureCookie = req.get('host').indexOf('localhost:') !== 0;
  res.cookie('state', state.toString(), {maxAge: 3600000, secure: secureCookie, httpOnly: true});
  const redirectUri = oauth2.authorizationCode.authorizeURL({
    redirect_uri: `${req.protocol}://${req.get('host')}/instagram-callback`,
    scope: 'basic',
    state: state
  });
  res.redirect(redirectUri);
});

또한, 세션 고정 공격을 피하기 위해 OAuth 요청의 상태 매개변수에 임의의 문자열을 전달하고 이를 HTTP 쿠키로도 저장합니다. 이를 통해 반환되는 상태 매개변수를 쿠키에 저장된 매개변수와 비교하고 흐름이 앱에서 발생했는지 확인할 수 있습니다.

클라이언트에서 다음과 같이 팝업을 트리거하는 버튼을 추가하세요.

function onSignInButtonClick() {
  // Open the Auth flow in a popup.
  window.open('/redirect', 'firebaseAuth', 'height=315,width=400');
};

사용자가 로그인 버튼을 클릭하면 팝업이 열리면서 Instagram 동의 화면으로 리디렉션됩니다.

사용자가 승인하면 code URL 쿼리 매개변수에 전달된 승인 코드와 앞서 전달한 state 값과 함께 /instagram-callback URL 핸들러로 다시 리디렉션됩니다.


액세스 토큰을 얻기 위한 승인 코드 교환

사용자가 콜백 URL로 다시 리디렉션되면 다음을 수행하세요.
  • 상태 쿠키가 상태 URL 쿼리 매개변수와 동일한지 확인하세요.
  • 인증 코드를 교환하여 액세스 토큰을 얻고 Instagram에서 사용자 ID를 검색하세요.
app.get('/instagram-callback',(req, res) => {
  // Check that we received a State Cookie.
  if (!req.cookies.state) {
    res.status(400).send('State cookie not set or expired. Maybe you took too long to authorize. Please try again.');
  // Check the State Cookie is equal to the state parameter.
  } else if (req.cookies.state !== req.query.state) {
    res.status(400).send('State validation failed');
  }

  // Exchange the auth code for an access token.
  oauth2.authorizationCode.getToken({
    code: req.query.code,
    redirect_uri: `${req.protocol}://${req.get('host')}/instagram-callback`
  }).then(results => {
    // We have an Instagram access token and the user identity now.
    const accessToken = results.access_token;
    const instagramUserID = results.user.id;
    const profilePic = results.user.profile_picture;
    const userName = results.user.full_name;

    // ...

  });
});

이제 이 구현의 OAuth 2.0 관련 부분을 마쳤으므로, 다음으로 할 일은 대부분 Firebase와 관련된 일입니다.

다음으로, Firebase 맞춤 인증 토큰을 생성하고, 맞춤 인증 토큰으로 사용자를 로그인시키고 Firebase 사용자 프로필을 업데이트할 HTML 페이지를 제공합니다(이에 대해서는 나중에 자세히 설명함).

app.get('/instagram-callback', (req, res) => {

    // ...

  }).then(results => {
    // We have an Instagram access token and the user identity now.
    const accessToken = results.access_token;
    const instagramUserID = results.user.id;
    const profilePic = results.user.profile_picture;
    const userName = results.user.full_name;
      
    // Create a Firebase custom auth token.
    const firebaseToken = createFirebaseToken(instagramUserID);

    // Serve an HTML page that signs the user in and updates the user profile.
    res.send(
        signInFirebaseTemplate(firebaseToken, userName, profilePic, accessToken)));
  });
});


맞춤 인증 토큰 생성

Firebase 맞춤 인증 토큰을 생성하려면 서비스 계정 사용자 인증 정보를 사용하여 Firebase를 설정해야 합니다. 그러면 이런 토큰을 만드는 데 필요한 관리 권한이 부여됩니다. 서비스 계정 사용자 인증 정보 파일을 service-account.json으로 저장해야 합니다.

const firebase = require('firebase');
const serviceAccount = require('./service-account.json');
firebase.initializeApp({
  serviceAccount: serviceAccount
});

맞춤 인증 토큰은 간단히 만들 수 있습니다. Instagram의 사용자 ID를 기반으로 사용자의 uid를 선택하기만 하면 됩니다.

function createFirebaseToken(instagramID) {
  // The uid we'll assign to the user.
  const uid = `instagram:${instagramID}`;

  // Create the custom token.
  return firebase.auth().createCustomToken(uid);
}

(참고: 서비스 계정 사용자 인증 정보는 안전하게 지켜야 하므로, 맞춤 토큰은 항상 서버 쪽에서 생성해야 합니다.)

맞춤 토큰을 생성했으면 Firebase에 로그인하는 클라이언트에 이를 전달할 수 있습니다.


맞춤 토큰을 사용하여 로그인

이 시점에서 서버는 팝업 창 내에서 실행되는 HTML 페이지를 제공하며 다음 작업을 수행합니다.
  • 나중에 Instagram API에 액세스해야 하는 경우 Instagram 액세스 토큰을 실시간 데이터베이스에 저장합니다. (참고: 사용자만 읽을 수 있도록 하는 보안 규칙을 사용해야 합니다.)
  • Firebase 사용자의 이름과 프로필 사진을 업데이트합니다.
  • 사용자를 로그인시키고 팝업을 닫습니다.

기본 Firebase 앱을 사용하는 대신 임시 Firebase 앱 인스턴스를 사용하여 프로필을 업데이트하는 것도 하나의 묘책입니다. 그러면 사용자의 프로필이 업데이트되기 전에 기본 페이지에서 인증 리스너가 트리거되지 않도록 차단됩니다.

app.get('/instagram-callback', (req, res) => {

    // ...

    // Serve an HTML page that signs the user in and updates the user profile.
    res.send(
        signInFirebaseTemplate(firebaseToken, userName, profilePic, accessToken)));
  });
});

function signInFirebaseTemplate(token, displayName, photoURL, instagramAccessToken) {
 return `
   <script src="https://www.gstatic.com/firebasejs/3.4.0/firebase.js"></script>
   <script src="promise.min.js"></script><!-- Promise Polyfill for older browsers -->
   <script>
     var token = '${token}';
     var config = {
       apiKey: MY_FIREBASE_API_KEY, // Change this!
       database URL: MY_DATABASE_URL // Change this!
     };
     // We sign in via a temporary Firebase app to update the profile.
     var tempApp = firebase.initializeApp(config, '_temp_');
     tempApp.auth().signInWithCustomToken(token).then(function(user) {
    
       // Saving the Instagram API access token in the Realtime Database.
       const tasks = [tempApp.database().ref('/instagramAccessToken/' + user.uid)
           .set('${instagramAccessToken}')];
  
       // Updating the displayname and photoURL if needed.
       if ('${displayName}' !== user.displayName || '${photoURL}' !== user.photoURL) {
         tasks.push(user.updateProfile({displayName: '${displayName}', photoURL: '${photoURL}'}));
       }
  
       // Wait for completion of above tasks.
       return Promise.all(tasks).then(function() {
         // Delete temporary Firebase app and sign in the default Firebase app, then close the popup.
         var defaultApp = firebase.initializeApp(config);
         Promise.all([
             defaultApp.auth().signInWithCustomToken(token),
             tempApp.delete()]).then(function() {
           window.close(); // We’re done! Closing the popup.
         });
       });
     });
   </script>`;
}

사용자가 팝업에서 기본 Firebase 앱에 로그인된 후 인증 상태 리스너가 기본 페이지에서 트리거됩니다. Firebase에서는 인증 상태가 여러 탭 간에 공유된다는 점을 기억하세요. 사용자 프로필 정보를 표시하고, 실시간 데이터베이스, Firebase 저장소 등을 사용할 수 있습니다.


직접 시험해 보세요!

저희는 개발자 여러분이 시험해 볼 수 있는 데모 앱을 https://instagram-auth.appspot.com/에 만들어 두었습니다.

이 샘플은 오픈소스입니다. Github(https://github.com/firebase/custom-auth-samples)에서 관련 리소스를 자유롭게 살펴보시기 바랍니다.


Android와 iOS는 어떠냐고요?

지금까지 이 글에서 보여드린 코드는 웹 앱에서 작동하는 코드입니다. Instagram 인증을 Android 또는 iOS 앱에 추가하는 데는 몇 가지 기법이 있으며 이 게시물에서는 이에 대해 다루지 않을 것이므로 계속해서 새로운 소식이 있는지 눈여겨보시기 바랍니다!


다 되었습니다!

다른 ID 공급자에 대한 샘플을 찾고 있거나 이를 통합하는 데 문제가 있는 경우 댓글을 쓰거나 GitHub 리포지토리 문제를 사용하여 알려주시면 저희가 성심껏 도와드리겠습니다!

▶ 원문 링크

전 세계적으로 디지털 정보를 공유하는 데 있어 해결해야 할 주요 문제는 컴퓨터가 텍스트를 표시할 수 없는 경우에 나타나는 빈 상자(⯐)를 의미하는, 소위 '두부(tofu)' 문제입니다. 이러한 두부 문제는 혼란과 커뮤니케이션 장애를 일으키고 사용자 환경을 저해할 수 있습니다.

5년 전, Google은 Noto, 즉 'No more tofu(두부 문제 방지)'라고 하는 글꼴 프로젝트를 통해 이 문제를 해결하는 작업에 착수했습니다. 오늘날, Google의 오픈소스 Noto 글꼴 모음은 유니코드 표준에 포함된 모든 기호에 대해 아름다우면서도 일관된 디지털 활자를 제공하여, 800개가 넘는 언어와 110,000자가 넘는 문자를 지원합니다.

캡션: Noto 글꼴에서 지원하는 110,000자 이상의 문자 중 몇 가지 샘플입니다.


Noto 프로젝트는 Google Android 및 ChromeOS 운영체제의 필요로 시작되었습니다. 시작할 당시에는 이 문제가 얼마나 심각한지 인식하지 못했습니다. 따라서 수백 개의 언어를 대상으로 디자인 및 기술적인 측면에서 테스트를 수행해야 했으며, 특정 스크립트의 경우 전문가의 전문 지식이 필요했습니다. 예를 들어, 아랍어의 경우 각 문자에는 그 다음에 오는 텍스트에 따라 달라지는 4개의 문자 모양(즉, 문자가 취할 수 있는 모양)이 있습니다. 인도어의 경우, 문자 모양이 주변 텍스트에 따라 재정렬되거나 두 개로 분할될 수 있습니다.

이러한 중요한 목표를 실현하기 위해 Monotype, Adobe 및 자원 봉사 검토자로 구성된 훌륭한 네트워크를 포함하여 활자 및 글꼴 디자인 부문의 전문가와 협력해 왔습니다. 매일 사용되는 공통 언어에서 '두부 문제를 방지'하는 것을 뛰어넘어 Noto는 디지털화를 통해 자주 사용되지 않는 언어에 대한 기록과 문화를 유지할 목적으로도 사용됩니다. 새로운 문자가 유니코드 표준에 도입될 때 마다 Google은 이 문자를 Noto 글꼴 모음에 추가할 예정입니다.

Google은 이 글꼴 모음과 함께 개방성, 접근성, 혁신을 구현하는 데 최선을 다하고 있습니다. 전체 Noto 글꼴 모음, 디자인 소스 파일 및 글꼴 구성 파이프라인을 아래 링크에서 무료로 이용할 수 있습니다. 국경과 문화의 벽을 뛰어넘어 서로 나누고 소통하는 정신으로 즐겁게 이용해 보시기 바랍니다!

게시자: Xiangye Xiao 및 Bob Jung, 국제화
▶ 원문 링크

Firebase 호스팅에서 HTTP/2를 사용할 수 있게 되었다는 반가운 소식을 전해드립니다. HTTP/2는 HTTP 프로토콜의 최신 버전으로, 전 세계 브라우저중 77%가 이미 지원하고 있습니다. 웹 개발자에게는 다음과 같은 흥미로운 장점이 있습니다.
  • 단일 커넥션을 통해 여러 개의 요청을 전송할 수 있습니다. HTTP/2를 사용하면 여러 리소스를 묶을 필요성이 적어집니다.
  • HTTP/2는 바이너리 프로토콜이기 때문에 헤더를 압축할 수 있고 데이터를 더욱 효율적으로 전송할 수 있습니다.
  • 서버는 주도적으로 클라이언트에 콘텐츠를 "푸시"할 수 있습니다.
이 모든 점을 고려하면, 상당한 성능 이점은 물론이고 네트워크 속도가 느린 모바일 기기에서 웹 애플리케이션의 로드 속도를 빠르게 향상 시킬 기회가 생깁니다.

HTTP/2는 새롭게 프로비저닝되는 사용자 정의 도메인뿐 아니라 모든 *.firebaseapp.com 트래픽에도 사용할 수 있습니다. Firebase에서 맞춤 도메인을 이미 구축한 경우 아래의 맞춤 도메인 마이그레이션 섹션을 참조하십시오.

Firebase 호스팅에 HTTP/2 활용하기

아무 것도 하지 않아도 Firebase 호스팅에 HTTP/2를 활용할 수 있습니다! 사용자 브라우저가 지원하기만 하면 HTTP/2가 자동으로 제공됩니다. 하지만, HTTP/2에 맞게 최적화하려는 경우에는 염두에 두어야 할 몇 가지 모범 사례가 있습니다.
  1. 단일 연결을 사용하여 동시 요청을 다중 송신할 수 있기 때문에 많은 리소스를 함께 연결하기 위한 이점은 더 이상 없습니다. 브라우저는 리소스 캐시 작업을 훌륭하게 수행하므로, 실제로는 변경 빈도가 더 낮은 파일을 더 많이 제공하는 것이 좋습니다. 여기서 더 많은 파일은 수십개의 파일을 의미합니다. 수백 개의 파일을 처리하면 여전히 상당한 오버헤드를 수반할 수 있으므로 주의해야 합니다.
  2. 자산을 여러 도메인에 "분할"할 필요가 없습니다. Firebase 호스팅은 이미 빠른 CDN을 사용하기 때문에 HTTP/2를 사용하면 동일한 도메인에서 모든 파일을 제공하는 데 유리합니다.
  3. 따라서 필요한 자산만 로드하시기 바랍니다! 왕복 횟수가 더 적으므로 애플리케이션 셸을 부트스트랩하는 데 필요한 파일만 로드하도록 최적화해야 합니다. 다른 리소스는 사용자 상호 작용을 바탕으로 필요에 따라 로드되어야 합니다.
위에 명시된 지침은 꼭 지켜야 하는 규칙은 아닙니다. 성능 최적화를 할 때와 마찬가지로 어떤 최적화 조합이 앱의 요구 사항을 가장 잘 충족하는 결과를 제공하는지 다양하게 테스트해야 합니다.

서버 푸시 테스트

Firebase 호스팅은 Link 헤더를 사용하여 HTTP/2 서버 푸시를 시험적으로 지원합니다. 서버 푸시를 사용하면 초기 요청 수행 시 서버가 추가 리소스를 위한 콘텐츠를 자동으로 전송할 수 있습니다. 서버 푸시의 가장 일반적인 용도는 페이지가 로드될 때 연결된 자산(예: JavaScript 또는 CSS 파일)을 전송하는 것입니다.

Firebase 호스팅에 서버 푸시를 구성하려면 다음과 같이 Link 헤더를 firebase.json 구성에 추가해야 합니다.
{
  "hosting": {
    "headers": [
      {
        "source": "/",
        "headers": [{"key": "Link", "value": "</js/app.js>;rel=preload;as=script,</css/app.css>;rel=preload;as=style"}]
      },
      {
         "source": "/users/*",
        "headers": [{"key": "Link", "value": "</js/app.js>;rel=preload;as=script,</css/app.css>;rel=preload;as=style;nopush,</css/users.css>;rel=preload;as=style"}]
      }
    ]
  }
}


여기서는 루트 경로에서 /js/app.js와 /css/app.css를 미리 로드하고, /users/*와 일치하는 경로에서 /css/users.css를 추가로 미리 로드하는 데 서버 푸시를 사용합니다. 브라우저 캐시에 이미 있을 가능성이 큰 파일에 대해서는 (두 번째 예제의 app.css에 대한 지시문과 같이) nopush 지시문을 사용하여 HTTP/2 푸시를 사용하지 않고 자산을 미리 로드할 수 있습니다.

서버 푸시는 아직 초기 단계이므로 다음과 같이 명심해야 할 사항이 몇 가지 있습니다.
  1. Link 헤더를 설정하는 데 와일드카드를 사용하는 경우 주의해야 합니다. 리소스가 그 자체를 미리 로드하도록 설정하면 안 됩니다.
  2. 서버 푸시는 성능과 대역폭 사용 간에 균형을 맞추는 기술입니다. 즉, 브라우저에서 이미 캐싱된 자산을 푸시할 경우 불필요한 데이터를 전송하게 됩니다. 푸시되는 자산을 성능에 중요한 작은 자산으로 유지하도록 노력하고, 사용자가 휴대기기에서 추가 데이터에 대한 비용을 지불해야 할 수 있다는 점을 알고 있어야 합니다!
  3. 미리 로드하기 기능은 푸시를 사용하지 않고도 탁월한 성능을 제공하는 데 유용합니다! ;nopush를 미리 로드 Link 헤더에 추가하면 브라우저는 서버 푸시 없이 자산을 미리 로드합니다. 이는 브라우저에 이미 캐싱되어 있을 수 있다고 생각하는 자산에 유용합니다.
저희는 HTTP/2가 최초의 로드 환경을 개선할 잠재력이 얼마나 될지 무척 기대되며, 서버 푸시를 단순하고 안정적이며 사이트에 효과적인 것으로 만들어줄 더 많은 방법을 강구하고 있습니다.

맞춤 도메인 마이그레이션

HTTP/2로 마이그레이션하면서, 저희는 SSL 인증서를 SNI(Server Name Indication)로 전환하는 중입니다. SNI는 계속해서 인프라를 더욱 안정적으로 확장할 수 있도록 해주며, 전 세계 98% 브라우저에서 지원됩니다. 이러한 변화는 사용자 트래픽에 영향을 미칠 가능성이 있으므로, 2016년 12월까지 기존의 맞춤 도메인을 자동으로 전환하지 않을 계획입니다.

2016년 8월 11일 이전부터 Firebase 호스팅에 맞춤 도메인을 보유한 분이라면 DNS 레코드를 업데이트해야 HTTP/2를 이용할 수 있습니다. dig <your-site>.firebaseapp.com을 실행하여 SNI로 이미 전환되었는지 확인할 수 있습니다. 결과에 s-sni.firebaseapp.com이 표시되면 사이트가 이미 마이그레이션된 것입니다.

CNAME을 사용하는 경우 마이그레이션하려면 s-sni.firebaseapp.com을 가리키도록 DNS를 업데이트해야 합니다. A 레코드를 사용하는 경우에는 다음과 같이 업데이트하십시오.

151.101.1.195
151.101.65.195

DNS를 변경하고 그 변경 내용이 전파되면 사이트가 HTTP/2로 구동될 것입니다! 올해 말까지 모든 Firebase 호스팅 트래픽을 HTTP/2와 SNI로 전환할 예정입니다. 따라서 SNI가 사용자에게 어떤 영향을 미칠지 걱정된다면 지원 사이트를 방문하시기 바랍니다.

Firebase 호스팅과 관련된 저희의 목표는 모든 이가 PWA(Progressive Web Apps) 개발의 모범 사례를 자유롭게 활용하도록 하는 것입니다. HTTP/2는 이런 목표를 향한 여정에서 거치는 또 하나의 단계이며, 여러분이 이를 활용하여 무엇을 빌드할지 정말 기대됩니다!

▶ 원문 링크


Google I/O에서 저희는 고품질 모바일 VR(가상 현실)을 지원하는 플랫폼인 Daydream을 발표하고 개발자 여러분이 Daydream용 앱을 만들 수 있도록, 개발 도구를 공개했습니다. 그 후로, 저희 팀은 피드백을 수집하고, 이를 바탕으로 고품질 VR 앱과 서비스를 만들 수 있는, 효율적이고 강력한 개발자 도구를 제공할 수 있도록 계속해서 노력해 왔습니다.


저희는 Daydream을 지원하는 Google VR SDK 1.0에 대한 베타 시험이 완료되었음을 발표하게 되어 매우 자랑스럽게 생각하며, 현재 Daydream 개발자 사이트에서 정식 Google VR SDK 1.0을 다운로드할 수 있습니다. 업데이트된 SDK로 일반적인 VR 개발 작업을 간소화할 수 있습니다. 개발자는 Daydream 지원 휴대폰과 헤드셋을 위한 몰입형 모바일 VR 애플리케이션을 만드는데 데 집중할 수 있습니다. SDK는 입체 영상 구현을 위한 통합 비동기식 재투영(integrated asynchronous reprojection), 고성능 공간 오디오 및 Daydream 컨트롤러를 사용한 상호 작용을 지원합니다.

Google VR SDK 1.0을 사용하여 훨씬 더 쉽게 개발 작업을 시작할 수 있도록 하기 위해, 저희는 이미 익숙한 게임 엔진과 도구를 사용할 수 있도록 Unity 및 Unreal과 제휴했습니다. 또한, 설명서 전문, 참조 샘플 앱 및 가이드를 게시하여 사이트를 업데이트했습니다.

기본 Unity 통합

이번 릴리스에서는 Unity에 기본적으로 통합된 Daydream을 선보입니다. 이를 통해 Daydream 개발자는 VR 렌더링에 Unity의 최적화된 기능을 모두 활용할 수 있습니다. 또한, 헤드 추적, 딥 링크 및 간편한 안드로이드 매니페스트 구성과 같은 기능도 추가로 지원합니다. 많은 Daydream 실행 앱이 이미 이런 최신 통합 기능과 연동되고 있으며, 지금 새로운 Unity 바이너리(여기)와 Daydream 플러그인(여기)을 다운로드할 수 있습니다.

기본 UE4 통합

저희는 UE4 기본 통합을 더욱 개선했으며, 이는 개발자가 더욱 향상된 프로덕션 수준의 품질을 제공하는 Daydream 앱을 빌드하는 데 도움이 될 것입니다. 이 최신 버전에는 편집기에서 Daydream 컨트롤러 지원 기능, 넥 모델(neck model), 새로운 렌더링 최적화 기능 등이 추가되었습니다. UE4 개발자는 여기에서 소스를 다운로드할 수 있습니다.


지금 시작하세요.

초기 Daydream 지원 휴대폰 및 헤드셋이 이번 가을에 출시될 예정이지만, 지금 바로 Google VR SDK 1.0과 DIY 개발자 키트를 사용하여 고품질의 Daydream 앱 개발을 시작할 수 있습니다.

저희는 또한 Daydream을 위한 훌륭한 콘텐츠를 빌드하는 더욱 많은 개발자와 긴밀하게 작업할 수 있도록 현재 DAP(Daydream Access Program) 참가 신청을 받고 있습니다. DAP 참가 신청을 하려면 Daydream 앱 제안서를 제출하시기 바랍니다.

Daydream 플랫폼을 위한 콘텐츠를 만들 때는 앱이 모든 Daydream 지원 휴대폰과 헤드셋에서 아무런 문제 없이 원활하게 작동해야 한다는 점에 유의하세요. Daydream은 이제 막 시작되었으므로 함께 협력하여 새로운 몰입형 대화식 VR 환경을 빌드하는 데 도움을 드릴 수 있게 되기를 고대합니다. 곧 제공될 Daydream 지원 휴대폰 및 Daydream 헤드셋과 컨트롤러에 대한 추가 정보에 계속 관심을 가져 주세요.

▶ 원문 링크

현재 Google Play 개발자 지원팀에서는 채팅/이메일 2가지 채널을 통해 개발자 콘솔 및 정책 관련 이슈에 대한 상담을 지원하고 있습니다. 새로 업데이트된 'Google Play 개발자 지원팀에 문의하기' 페이지를 방문하시면 지원되는 모든 채널에 대한 정보와 운영 시간을 확인할 수 있으며, 페이지 내의 링크를 통해 채팅/이메일 상담 신청이 가능합니다.

채팅의 경우 개발자 콘솔, 도움말 센터, 혹은 Google Play 개발자 지원팀 문의 페이지 등 다양한 소스의 링크를 통해 바로 실시간 상담을 시작할 수 있습니다. 한국어 채팅은 공휴일을 제외하고 월요일부터 금요일까지 10~12시, 13~18시에 운영됩니다. 영어 채팅은 GMT(그리니치표준시) 기준으로 월요일 9시부터 금요일 23시 59분까지 운영됩니다. 


Google Play 개발자 지원팀에 문의하기 [링크]


    게시자: Google Play 개발자 지원팀

    지난 2016년 10월 5일부터 기업용 Gmail 사용자를 대상으로 계정 보안 기능이 강화되었습니다. Google Apps 도메인을 사용 중인 사용자가 비밀번호를 변경하면, Gmail 기반 인증을 통해 발급받은 OAuth 2.0 토큰이 자동으로 해지 됩니다. 따라서, 해당 토큰을 사용하는 앱은 새로운 토큰을 발급받아야 하며, 그렇지 않으면 사용자 메일 수신함에 접근할 수 없게 됩니다. 이는 사용자가 Gmail 관련 토큰이 무효가 되는 시점 이후에 비밀번호를 변경하는 경우에만 적용됩니다.

    개발자는 애플리케이션이 해지된 토큰으로 인해 발생하는 HTTP 400 또는 401 오류를 처리하도록 수정하고, 사용자가 OAuth 흐름을 다시 진행해 앱을 다시 인증할 수 있도록 요청해야 합니다. 작년 말에 저희는 이와 비슷하지만, 더욱 광범위한 인증 범위에 영향을 미치는 보안 정책 관련 변경 계획을 발표한 바 있습니다. 그 이후에 저희는 앱 고객을 대상으로 한 이런 변경 계획을 바로 진행하는 대신, 위에서 설명한 것처럼 영향력이 덜한 업데이트를 개발하는 작업에 착수했습니다.

    토큰이 해지된다는 것은 무슨 의미입니까?

    해지된 OAuth 2.0 토큰으로는 더는 사용자 정보에 접근할 수 없습니다. API 호출 시, 해지된 토큰을 사용하면 오류가 발생합니다. Google API에 접근하는 애플리케이션은 실패한 API 호출을 처리하도록 수정해야 합니다.

    토큰 해지 그 자체는 새로운 기능이 아닙니다. 사용자는 예전부터 항상 보안 점검 메뉴에서 애플리케이션에 대한 접근을 해지할 수 있었고, Google Apps 관리자는 관리 콘솔에서 동일한 작업을 수행할 수 있습니다. 또한, 장기간 사용되지 않은 토큰은 항상 만료되거나 해지되었습니다. 다만, 보안 정책을 강화되어, 애플리케이션이 인식하는 해지된 토큰의 비율이 커질 수 있습니다.

    어떤 API와 범위가 영향을 받습니까?

    관리자와 최종 사용자가 느낄 혼란을 최소화하면서, 보안상의 이점을 달성하기 위해, 저희는 이 정책 변경을 이메일 범위에만 적용하고 Apps Script 토큰은 제외하기로 했습니다. Google Apps Marketplace를 통해 설치된 앱에도 토큰 해지가 적용되지 않습니다. 이 변경 사항이 적용되면 Apple Mail 및 Thunderbird와 같은 타사 메일 앱(물론, 하나 이상의 메일 범위를 포함하는 다중 범위를 사용하는 다른 애플리케이션도 해당함)에서 비밀번호를 재설정한 경우 새 OAuth 2.0 토큰이 부여될 때까지 데이터 액세스가 금지됩니다. 개발자 애플리케이션은 이 시나리오를 감지하여 애플리케이션이 계정 데이터에 접근하지 못하게 되었음을 사용자에게 알리고 OAuth 2.0 흐름을 다시 진행하도록 요청해야 합니다.

    모바일 메일 애플리케이션도 이 정책 변경에 포함되었습니다. 예를 들어, iOS에서 기본 메일 애플리케이션을 사용하는 사용자는 비밀번호가 변경된 경우 해당 Google 계정 자격 증명을 사용하여 다시 인증해야 합니다. 모바일 환경에서 실행되는 타사 메일 앱 역시 사용자가 자신 계정의 비밀번호를 재설정하는 경우, 다시 사용자 인증 과정을 거쳐야합니다. iOS 및 Android에서 실행되는 Gmail 앱도 동일한 방식으로 동작합니다.

    내 토큰이 해지되었는지 어떻게 확인할 수 있습니까?

    수명이 짧은 액세스 토큰과 수명이 긴 새로 고침 토큰 둘 다, 사용자가 비밀번호를 변경하면 해지됩니다. 해지된 액세스 토큰을 사용하여 API에 접근하거나, 새 액세스 토큰을 생성하면 HTTP 400 또는 401 오류가 발생합니다. 애플리케이션이 라이브러리를 사용하여 API를 사용하거나 OAuth 흐름을 처리하는 경우, 예외로 발생할 가능성이 큽니다. 예외의 원인을 판단하는 자세한 방법은 라이브러리 관련 문서를 참조하십시오.

    참고: HTTP 400 오류는 다양한 원인으로 발생할 수 있으므로, 해지된 토큰으로 인해 발생하는 400 오류의 페이로드는 다음과 유사할 것이라 예상할 수 있습니다.
    {
      "error_description": "Token has been revoked.", 
      "error": "invalid_grant"
    }

    내 애플리케이션에서 해지된 토큰을 어떻게 처리해야 할까요?

    토큰이 해지되는 것이 오류 상황이 아니라, 정상적인 상태라고 생각해야합니다. 애플리케이션은 이런 상태를 예상하고 감지해야 하며, UI는 토큰을 복원할 수 있도록 최적화되어야 합니다.

    애플리케이션이 제대로 작동하도록 하려면 다음 작업을 수행하는 것이 좋습니다.


    • API 호출과 토큰 새로 고침 근처에 해지된 토큰을 감지할 수 있는 오류 처리 코드를 추가합니다.
    • 해지된 토큰을 감지하면 사용자가 애플리케이션을 다시 인증할 수 있을 때까지 Google API 액세스를 이용하는 모든 애플리케이션 기능을 비활성화합니다. 예를 들어, Google API와 데이터를 동기화하는 반복적인 백그라운드 작업이 영향을 받을 수 있으므로 이런 작업을 모두 일시 중단합니다.
    • 사용자에게 액세스가 해지되었음을 알리고 해당 리소스에 대한 액세스를 다시 인증하도록 요청합니다.
      • 앱이 사용자와 직접 상호 작용하는 경우 사용자에게 이메일을 보내거나 다음에 애플리케이션을 열 때 알림을 표시하는 등의 방법으로 다시 인증하도록 요청해야 합니다.
      • 하지만, 앱이 사용자와 관계없이 독립적으로 실행되는 경우(이를테면 Gmail API를 사용하는 백그라운드 앱) 이메일이나 기타 메커니즘을 통해 사용자에게 알려야 합니다.
      • 액세스를 다시 인증할 수 있는 간소화된 UI를 제공합니다. 사용자가 애플리케이션을 탐색하여 원래 설정을 찾도록 하지 마십시오.
      • 해지된 토큰은 토큰이 해지된 방법에 상관없이 유사한 오류 메시지를 표시합니다. 따라서 비밀번호 변경으로 인해 토큰이 해지되었다고 가정하고서 메시지를 표시하면 안 됩니다.

    애플리케이션이 증분 인증(Incremental authorization)을 사용하여 동일한 토큰에서 범위를 늘려나가는 경우 지정된 사용자가 활성화한 기능과 범위를 추적해야 합니다. 최종 결과로서, 앱이 여러 범위에 대해 인증을 요청하고 획득했으며 그 중 하나 이상이 메일 범위인 경우 해당 토큰이 해지됩니다. 이는 처음에 승인된 모든 범위에 대해 다시 인증하도록 사용자에게 요청해야 한다는 뜻입니다.

    많은 애플리케이션이 백그라운드 또는 서버 간 API 호출을 수행할 목적으로 토큰을 사용합니다. 사용자는 당연히 이 백그라운드 작업이 안정적으로 계속될 것이라 여깁니다. 이번 정책 변경은 그러한 앱에도 영향을 미치므로 재인증을 요청하는 프롬프트 알림이 훨씬 더 중요해집니다.

    자세한 내용과 전체 메일 범위 목록은 도움말 센터 문서 및 FAQ를 참조하시기 바랍니다. 앞으로 정책에 추가해야 할 추가 범위가 있다면 미리 알려드리겠습니다. 관련 세부 사항이 확정되면 바로 알려드리겠습니다.

    게시자: Michael Winser(Google Apps 제품 책임자), Wesley Chun(Google Apps 디벨로퍼 어드보케)

    ▶ 원문 링크

    Firebase 원격 구성에서 제가 가장 좋아하는 기능 중 하나는 다양한 사용자 그룹에 각각 다른 콘텐츠를 제공할 수 있는 기능입니다. 예를 들어, 개발자의 앱에서 많은 돈을 지출해온 사람들을 위해 홈페이지의 디자인을 바꾸어 보여줄 수 있습니다. 또는 조깅을 즐기는 사람에게는 그에 맞는 피트니스 앱의 한 부분을 강조하고, 웨이트 트레이닝을 하는 사람 역시 그에 맞는 피트니스 앱의 다른 부분을 강조할 수 있습니다.

    원격 구성이 처음 출시된 이후 지금까지 줄곧, 개발자는 다양한 Firebase Analytics 잠재고객에 속한 사람들에게 각각 알맞은 콘텐츠를 제공함으로써 매우 정교한 사용자 타겟팅을 실현할 수 있었습니다.

    하지만 최근에 들어, 원격 구성에서 사용자 속성이 각각 다른 사람들에게 그에 맞는 데이터 세트를 전송할 수 있게 되어, 이 기능의 유용성이 훨씬 더 커졌습니다.

    아마 이렇게 말씀하실지도 모르겠군요. "잠깐만요. 저는 이미 잠재고객에 속한 사용자 타겟팅을 통해 단순한 사용자 속성이 아니라 더욱 정교한 타겟팅을 수행할 수 있어요. 그런데 이게 뭐가 더 좋다는 건가요?"라고 말이죠.

    맞아요. 사실입니다. 잠재고객 기능은 많은 다양한 이벤트와 사용자 속성으로 정의할 수 있는 사용자로 구성된 그룹을 생성할 수 있도록 지원함으로써 개발자에게 매우 강력하고 구체적인 사용자 타겟팅을 제공합니다. 예를 들어, "내 게임에서 레벨 5를 깬 왼손잡이 캐나다인"이라는 잠재고객을 생성할 수 있습니다.1

    하지만 잠재고객에는 원격 구성 내에서 사용하기 더 어렵게 만들 수 있는 두 가지 제한 사항이 있습니다.

    첫째, 50명의 잠재고객으로 제한되고 이 잠재고객은 Firebase 내에서 Analytics 보고서를 실행하거나, Google 애드워즈를 통해 리마케팅 캠페인을 빌드하는 등의 다른 타겟팅에 이런 동일한 잠재고객을 사용할 수도 있는 사람들과 공유됩니다. 이로 인해 여러 개의 더 작은 임시 사용자 그룹을 생성하거나 조직의 다른 사람들이 사용 중일 수 있는 기존 잠재고객을 편집하기가 더 어려워집니다.

    둘째, 잠재고객 기능이 현재 작동하는 방식으로는, 사용자가 일단 잠재고객에 들어가면 절대로 빠져나올 수 없습니다. 리마케팅 캠페인에 잠재고객을 이용하는 개발자의 일반적인 마케팅 담당자에게는 이것이 바로 정확히 기대하는 바겠지만, 원격 구성의 목적에 비춰볼 때는 이 점이 때때로 문제가 될 수 있습니다.

    개발자가 출시한 게임을 시작했지만 아직 레벨 10을 끝내지 못한 사람들로 구성된 "Newbies"(초보자) 잠재고객을 생성하고 싶은 경우를 상상해 봅시다. 이 그룹에서 잠재고객을 생성하려고 하면, 게임을 시작한 모든 사람들이 이 잠재고객에 추가됩니다. 하지만, 그 중에서 레벨 15나 레벨 20에 도달한 사용자도 이 잠재고객 그룹에 계속 남게 됩니다. 근본적으로 처음 생성한 잠재고객 그룹이 "모든 플레이어"가 포함된 잠재고객 그룹이 되어버리는 것입니다.

    그것이 바로 제가 원격 구성에서 사용자를 타겟팅할 때 제 콘텐츠를 맞춤설정하는 한 가지 방법으로서 사용자 속성을 사용하는 쪽을 선호하는 이유입니다. 사용자 속성을 사용하면 소규모 일회성 타겟팅 그룹을 많이 생성할 수 있으며, 이를 통해 기존의 잠재고객을 사용하는 경우보다 조금 더 동적으로 타겟팅 그룹을 생성할 수 있습니다.

    예를 들어, 피트니스 앱을 개발했는데 사용자가 즐기는 피트니스 액티비티에 따라 각각 다른 홈페이지 이미지를 제공하고 싶다고 해봅시다. 각 사용자가 즐기는 운동을 사용자 속성으로 저장해 두었으면 해당 속성을 바탕으로 새 조건을 생성하여 이를 쉽게 설정할 수 있습니다.



    그런 다음 이런 조건을 바탕으로 각기 다른 홈페이지 이미지를 표시할 수 있습니다.


    이러한 방식으로, 6개의 서로 다른 조건을 손쉽게 생성하여 위에서 말한 Firebase Analytics 잠재고객 "제한" 문제를 해소할 수 있습니다.2

    또는 게임을 개발했는데 사용자가 현재의 레벨을 기준으로 게임의 동작을 바꾸고 싶어 하는 경우를 생각해 봅시다. 이 경우 해당 레벨을 사용자 속성으로 저장한 후 이들 계층을 기준으로 각기 다른 여러 조건을 생성하여 이 작업을 수행할 수 있습니다. 예컨대, 레벨 4와 레벨 10 사이에 있는 플레이어로 이루어진 "중간" 계층을 생성할 수 있는 것이죠.

    그리고는, 이 플레이어들에게 각자 다른 일일 보너스를 줄 수 있습니다.


    사용자 속성에 따라 각기 다른 계층에 사용자가 배치되므로 사용자의 레벨이 올라가면 원격 구성이 사용자 레벨에 따라 각각 다른 값을 자동으로 제공합니다. 또한, 각각에 대해 새로운 잠재고객을 생성할 필요가 없습니다.

    또한, 이런 그룹을 나중에 변경하기도 쉽습니다. 나중에 중간 계층이 레벨 6부터 포함되도록 결정하면, Firebase 제어판에서 이를 변경할 수 있으며, 이렇게 변경한 사항은 즉시 원격 구성으로 전달됩니다.


    갑자기 아주 특별한 플레이어를 위해 게임의 동작을 변경해야 한다고 결정할 경우 네 번째 계층을 추가할 수도 있습니다.


    기본적으로, 사용자 속성은 문자열로 저장되며, 이는 "정확히 일치" 또는 "포함"과 같은 문자열 비교를 실행할 수 있다는 의미입니다. 사용자의 상위 3가지 피트니스 액티비티를 파이프로 구분된 문자열(예: yoga|interval_training|running)로 저장한 경우 피트니스 액티비티가 문자열 "running"을 포함한 모든 사용자를 타겟팅하여 "All runners" 조건을 생성할 수 있습니다.

    하지만 위의 playerLevel 예제에서 수행한 것처럼 수치 비교를 실행할 수도 있습니다. 예상할 수 있는 바이지만, 원격 구성은 문자열을 숫자로 변환합니다. 즉, "42"는 42로 계산되고, "3.14159"는 3.14159로 계산되는 식입니다. 하지만 정수나 부동 소수점 숫자로 변환되지 않는 문자열(예: "Level_42")을 사용한 수치 비교는 항상 실패합니다.

    사용자 속성을 타겟팅할 수 있는 기능은 비교적 새로운 기능이므로, 이를 아직 사용해 보지 않았다면 한번 사용해보세요. 원격 구성 패널로 가서 이미 저장한 사용자 속성을 바탕으로 간단한 변경 작업을 수행해 보세요. 실제로 효과가 있으면 잠시 멈추고 앱의 어느 부분이 실제로 맞춤설정을 통한 이점을 얻을 수 있을지 생각해보고 이를 지원하는 다른 사용자 속성 한두 개를 추가할 것을 고려해 보세요.

    그리고 무언가 멋진 기능을 빌드했다면 저희에게 알려주시기 바랍니다! 정말 그런 이야기를 듣고 싶답니다.

    게시자: Todd Kerpelman, 디벨로퍼 어드보케

    1 "어느 손잡이"인지를 사용자 속성으로 타겟팅했다고 가정할 경우에 해당됩니다.
    2 공정하게 말하자면, 생성할 수 있는 원격 구성 조건의 수에도 제한이 있습니다. 하지만 그 개수 제한은 100개이므로, 실험해 볼 수 있는 기회를 더 많습니다.

    ▶ 원문 링크

    구글플레이에서는 전 세계 다양한 개발자가 출시한 1백만 개 이상의 앱이 등록되어 있습니다. 매일 전 세계 사용자가 약 8000만장의 사진을 찍는데 사용하는 카메라 앱 레트리카, 누적 다운로드 수가 1억 건이 넘는 컬러 노트, 일본에서 큰 인기를 끌고 있는 실시간 계산기 등 다양한 앱을 만나보실 수 있습니다.

    그런데 앞에서 말씀 드린 앱이 모두 한국 개발자가 만든 앱이라는 사실, 알고 계신가요? 소개 해 드린 3개 개발사를 비롯해 수많은 한국 개발사가 글로벌 플랫폼을 활용해 전 세계의 사용자에 도달하고 있습니다. 이에 구글플레이는 더 많은 한국 개발사가 앞서 말씀드린 개발사처럼 성장하는 것을 돕고자 구글플레이 내에 ‘대한민국 앱 개발사’ 콜렉션을 출시하게 되었습니다.

    대한민국 앱 개발사 콜렉션은 한국 구글플레이 내에 별도로 노출하며 한국 개발사가 만든 앱을 약 10개 정도 3주에 한 번씩 선정해 선보일 예정입니다. 이를 통해 한국 개발사가 앱을 사용자들에게 더 효율적으로 소개하도록 돕고, 또 사용자는 다양한 분야의 한국 개발사 앱 중 자신이 원하는 앱을 간편하게 찾을 수 있습니다.

    그리고 콜렉션 기간 중 좋은 성과를 보이고 글로벌 대응이 되어있는 개발사의 경우에는 해외 사용자를 대상으로 앱을 소개하는 기회도 제공할 예정입니다.

    대한민국 앱 개발사 콜렉션에는 특정 조건을 만족하는 개발사라면 누구나 참가 신청을 할 수 있으며, 해당 앱의 카테고리 및 출시일 등 간단한 정보만 제출하시면 신청이 가능합니다.

    참가신청을 위한 조건은 아래와 같으며 자세한 사항은 링크의 신청서를 참고해주시길 바랍니다.

    신청 조건:

    - 비게임 분야의 앱 개발사(게임 개발사의 경우 여기를 참고해주세요)
    - 현재 구글플레이에 출시가 되어 있거나 6개월 이내에 출시할 계획인 앱
    - 현재 출시가 되어 있는 경우 구글플레이 평점 4.0 이상

    신청 양식: 

    https://goo.gl/hmMjuU

    선정 절차: 

    - 내부 검토 후 선정된 개발사를 대상으로 개별 연락(신청순으로 검토 시작)
    - 선정되지 않은 개발사에게도 별도의 이메일 발송 예정
    - 한국 구글플레이 내 노출되는 콜렉션에서 앱 소개 예정(아래 예시 이미지 참조)

    대한민국을 대표할 많은 개발사의 지원 기다리겠습니다!

    작성자: 임형준 구글플레이 사업개발팀 과장

    [대한민국 앱 콜렉션 이미지]



    적합한 비즈니스 모델이 아주 초기 단계부터 핵심 앱 개발 전략에 적용된 경우 성공적인 앱은 결국 성공적인 수익 창출 비즈니스가 됩니다. Firebase는 고품질의 앱을 만드는 것부터 앱 트래픽을 늘리고 이로부터 수익을 창출하는 것에 이르기까지, 각 수명 주기 단계에서 앱 개발자에게 도움을 주기 위해 제작되었으므로 현재 고려 중일 수 있는 수익 창출 개념에 대해 살펴보도록 하겠습니다.
    • 이상적인 앱 수익 창출 전략을 생각해 보세요.
      수익 창출은 인앱 구매, 구독, 광고 등의 많은 요소에서 비롯됩니다. 인앱 광고에 대해 생각해 볼 때, 이는 앱이 제공하는 가치와 무엇이 잠재고객에게 동기 부여를 하는지에 따라 앱에 적합할 수도, 그렇지 않을 수도 있습니다. 여러 가지 수익 창출 옵션을 실험해 보고 가장 효과적인 옵션을 결정하세요. 여러 옵션에 대해 A/B 테스트를 실시하고 클릭률을 평가하는 것을 생각해 볼 수 있습니다. 앱을 빌드할 때 조기에 현명한 결정을 내리는 데 도움이 되는 모든 수익 창출 옵션에 대한 자료를 읽어보세요.

    • AdMob을 사용하여 수익을 늘릴 수 있는 방법을 알아보세요.
      AdMob은 Firebase에 포함된 핵심 요소로, 앱 개발자가 수익을 창출하는 데 도움이 될 수 있습니다. AdMob은 광고 수익 실적 및 사용자 참여에 대한 통계를 제공하는 동시에, 여러 광고 네트워크에 대한 액세스를 제공하여 사용자에게 보여줄 계획인 광고가 사용자에게 확실히 가치 있는 정보가 되도록 해줍니다.
    ▶ 원문 링크




    클라이언트 웹사이트의 AMP 제작(AMPlify)을 지원하기 전 미리 알아두면 좋은 8가지 도움말을 알려드립니다. Accelerated Mobile Pages 지원 확대 계획 공지를 먼저 확인하세요.

    시작은 간단합니다.

    사이트에서 유명 콘텐츠 관리 시스템(CMS)을 사용한다면 AMP 페이지를 시작하고 구동하는 것은 플러그인 설치만큼 간단합니다. 맞춤 HTML를 사용하거나 처음부터 직접 제작한 사이트인 경우 추가 개발 리소스가 필요합니다.



    모든 사이트가 적합한 것은 아닙니다.

    AMP는 뉴스, 레시피, 영화 목록, 제품 페이지, 리뷰, 동영상, 블로그 등 모든 정적 웹 콘텐츠에 유용합니다. 그러나 경로 매핑, 이메일, 소셜 네트워크와 같은 동적 기능이나 상호작용 기능이 많은 단일 페이지 앱에는 효율적이지 않습니다.

    사이트 전체를 #AMPlify하지 않아도 됩니다.

    클라이언트의 기존 사이트에서 기사, 제품, 블로그 게시물 등 간단한 정적 콘텐츠 페이지부터 시작하여 단계적으로 AMP를 추가해 나갑니다. 사용자가 플랫폼 및 검색결과를 통해 액세스하는 이러한 페이지를 '리프' 페이지라고 하며, 이처럼 간단한 변경으로도 웹사이트에 AMP의 이점을 가져올 수 있습니다. 이 방법을 사용하면 AMP가 아닌, 고급 동적 기능을 필요로 하는 홈페이지 및 다른 '브라우저' 페이지를 그대로 유지할 수 있습니다.

    콘텐츠가 많은 새 홈페이지를 처음부터 직접 만드는 경우 처음부터 AMP로 전체 사이트를 구축해 보세요. 먼저 시작 가이드라인을 확인하세요.


    AMP는 오픈소스 프로젝트이며 계속해서 진화합니다.

    사이트의 사용 사례에서 아직 AMP 형식을 지원하지 않는 경우 GitHub 기능 요청을 신청하거나 직접 구성요소를 설계할 수도 있습니다.

    특정 위치에 표시되려면 AMP에 추가 조건이 필요할 수 있습니다

    Google 검색결과에 표시되려면 AMP 페이지가 유효한 AMP HTML로 구성되면 됩니다. 그러나 일부 AMP 통합 제품에는 AMP 유효성 검사 외의 추가 조건이 필요할 수 있습니다. 예를 들어 Google 주요뉴스 섹션에 적합하게 하려면 AMP 페이지를 구조화된 데이터Article 마크업으로 마크업해야 합니다.


    검색결과의 순위 변화는 없습니다.

    페이지나 사이트에 자격 있는 유효한 AMP 페이지가 있는지의 여부는 검색결과 페이지의 사이트 순위와 관계가 없습니다. 차이점은 AMP 버전이 있는 웹 결과는 아이콘으로 라벨 표시된다는 것입니다.

    Google의 AMP는 전 세계적으로 확장되고 있습니다.

    Google의 AMP 검색결과는 올해 말 출시 이후 전 세계적으로 확장될 것입니다. 새로운 뉴스 AMP 콘텐츠를 표시하는 주요뉴스 캐러셀은 이미 여러 국가 및 언어로 사용할 수 있습니다.

    언제나 도움을 받을 수 있습니다.

    질문이 있는 경우 도움을 받을 수 있는 유용한 리소스가 다양합니다.

    페이지의 AMP 버전 제작(#AMPlify)에 가장 도움이 되는 팁은 무엇인가요? 아래의 댓글이나 Google 웹마스터 Google+ 페이지에서 알려주세요. 질문이 있거나 도움이 필요하다면 웹마스터 도움말 포럼에 자유롭게 글을 올려주시기 바랍니다.

    게시자: Tomo Taylor, AMP 커뮤니티 관리자

    안녕하세요 Google Developer Group (GDG) 여러분,

    벌써 2016년 한해를 마무리하는 시점이 다가오고 있습니다. 저희 GDG에 참여해 주신 모든 분들께 감사 인사 드립니다. 한해를 마무리하며 GDG에 참여해주셨던 분들의 특별한 경험을 많은 분들과 공유하기 위해 GDG Stories Asia 를 진행합니다!

    다른 사람들과 공유하고 싶은 GDG에서의 특별한 경험이 있으신가요? 

    GDG에 참여하셨던 분들이라면 누구든지 본인이 GDG에서 경험한 이야기를 공유할 수 있습니다. GDG Stories Asia를 통해 모인 이야기들은 아시아 전역의 여러 개발자 분들과 함께 공유되어 영감을 전하는 이야기로 쓰일 예정입니다. 선정된 이야기들은 블로그와 SNS를 통해서도 소개될 예정입니다.




    여러분에게 GDG란 무엇인가요? 참석하고픈 개발자 모임, 유익한 개발자 행사들, 그리고 만나면 반가운 사람들이 먼저 떠올려지길 바랍니다. 여러분이 경험했던 GDG 를 저희와 함께 공유해 보세요. 여러분의 GDG 경험을 듣고 싶고, 또 필요로 하는 개발자분들이 어딘가에 있을것만 같거든요. :)

    GDG Stories Asia 참여하기!
    • 신청 기간: 2016년 11월 30일(수) 24:00 까지
    • 선정 안내: 신청 기간 종료 후 개별 연락

    지난 11월 5일 (토), GDG Korea 에서는 국내 개발자들이 한자리에 모여 서로 지식을 교환하고, 아이디어를 공유하고, 기술에 대한 열정을 표출할 수 있도록 GDG DevFest Seoul 2016 을 개최하였습니다!




    뉴비(초보)부터 초고수가 함께 하는 GDG DevFest Seoul 2016 이라는 슬로건에 맞게 개발을 막 시작한 뉴비부터 오랜 경력을 가진 초고수까지 약 1,000여명이 이번 행사에 참석해 주셨습니다.

    참석해 주신 모든 분들께 다시 한번 감사 드리며, 참석하지 못한 분들께서도 행사 내용을 확인하실 수 있도록 발표 영상을 업로드 하였으니 놓치지 말고 꼭 확인해보시기 바랍니다.

    <뉴비 세션>



    <중수 세션>




    * 세션 및 워크샵 발표 자료는 행사 페이지에서 확인 가능합니다.
    * 좌측 상단의 버튼을 누르시면 전체 목록 확인이 가능합니다.
    * 초고수 세션은 촬영중 문제로 영상이 없는 점 양해 바랍니다.




    사이트의 Accelerated Mobile Pages를 제작(#AMPlify)할 때 페이지의 유효성 검사 상태를 주기적으로 확인하는 것이 중요합니다. 유효한 AMP 페이지만 Google 검색에 표시되기 때문입니다.

    AMP를 구현할 때 페이지에 오류가 포함되어 이로 인해 Google 검색에서 색인을 생성하지 못할 수 있습니다. 페이지에는 권장사항이 아닌 구성요소나 추후 오류가 될 수 있는 구성요소인 경고도 포함될 수 있습니다.

    Google Search Console은 Google에서 어떤 AMP 페이지를 오류로 파악했는지를 확인할 수 있게 하는 무료 서비스입니다. 어떤 URL에 문제가 발생했는지 알게 되면 몇 가지 손쉬운 도구를 통해 쉽게 유효성 검사 오류 세부정보를 확인할 수 있습니다.

    1. 브라우저 개발자 도구

    개발자 도구를 사용하여 유효성을 검증하려면 다음 단계를 따르세요.

    1. 브라우저에서 AMP 페이지를 엽니다.
    2. URL에 '#development=1'을 추가합니다. 예: http://localhost:8000/released.amp.html#development=1
    3. Chrome DevTools 콘솔을 열고 유효성 검사 오류를 확인합니다.
    Developer Console 오류는 다음과 유사하게 표시됩니다.



    2. AMP 브라우저 확장 프로그램

    AMP 브라우저 확장 프로그램(ChromeOpera에서 사용 가능)을 사용하여 유효하지 않은 AMP 페이지를 재빨리 파악하고 디버깅할 수 있습니다. 사이트를 탐색할 때 확장 프로그램이 방문한 모든 AMP 페이지를 평가하고 페이지의 유효성 여부를 표시합니다.

        AMP 페이지 내에 오류가 있는 경우 확장 프로그램 아이콘이 빨간색으로 표시되며
            발생한 오류의 수를 표시합니다.

        AMP 페이지 내에 오류가 없는 경우 확장 프로그램 아이콘이 녹색으로 표시되며
            경고가 있다면 경고의 수를 표시합니다.

        페이지가 AMP가 아니지만 AMP 버전을 사용할 수 있는 페이지인 경우 링크 아이콘과
             함께 아이콘이 파란색으로 표시되며 확장 프로그램을 클릭하면 AMP 버전으로 브라우저
             가 리디렉션됩니다.

    확장 프로그램을 사용하면 확장 프로그램 아이콘을 클릭하여 페이지에 있는 오류나 경고를 확인할 수 있습니다. 모든 문제에 소스 줄, 소스 열, 문제가 무엇인지 나타내는 메시지가 표시됩니다. 문제에 대한 자세한 설명이 존재할 경우 '자세히 알아보기' 링크로 ampproject.org의 관련 페이지로 이동합니다.



    3. AMP 웹 유효성 검사 도구

    validator.ampproject.org에서 이용할 수 있는 AMP 웹 유효성 검사 도구는 AMP 페이지의 유효성을 검사할 수 있는 간단한 웹 UI를 제공합니다.



    도구를 사용하려면 AMP URL을 입력하거나 소스 코드를 복사/붙여넣기하면 웹 유효성 검사 도구가 줄 사이에 오류 메시지를 표시합니다. 웹 유효성 검사 도구에서 직접 수정할 수 있으며 유효성 재검사가 실행되어 내가 제안한 수정으로 문제를 해결할 수 있는지 알려줍니다.

    어떤 AMP 페이지 상태 확인 방법을 선호하시나요? 아래의 댓글이나 Google 웹마스터 Google+ 페이지에 의견을 공유해 주세요. 질문이 있거나 도움이 필요하다면 웹마스터 도움말 포럼에 자유롭게 글을 올려주시기 바랍니다.

    게시자: Tomo Taylor, AMP 커뮤니티 관리자


    올해 5월에 열린 Google I/O에서 새로운 버전의 Firebase가 공개되었습니다. 개발자가 모바일 앱을 만드는데 도움이 되는 다양한 도구를 포함하고 있습니다. 새로운 Firebase 플랫폼에 포함된 Firebase Analytics는 사람들이 여러분이 개발한 모바일 앱을 사용하는 방식에 대한 데이터를 자동으로 수집할 수 있는 도구 입니다. 앱 실행등 일반적인 이벤트 외에 자체적인 사용자 지정 앱 이벤트도 지원합니다.데이터가 수집되면 Firebase 콘솔의 대시보드를 통해 이런 데이터를 확인하고 사용할 수 있습니다. 새로운 Firebase 플랫폼에 통합된 클라우드 기능 중 제가 좋아하는 한 가지는 바로 사용자 지정 분석을 위해 Firebase Analytics에서 캡처한 원시 데이터를 Google BigQuery로 내보낼 수 있는 기능입니다. 특히나,  Firebase Analytics 이벤트에서 전달된 사용자 지정 매개 변수 값을 확인할 때 특히 유용합니다. 이 강력한 기능 조합을 통해 어떤 작업을 수행할 수 있을지 살펴봅시다.

    BigQuery 내보내기는 어떤 식으로 작동할까요?

    Firebase 프로젝트를 BigQuery에 연결한 후에는 Firebase가 매일 자동으로 새 테이블을 연결된 BigQuery 데이터세트로 내보냅니다. iOS 및 Android 버전의 앱이 모두 있는 경우 Firebase는 각 플랫폼의 데이터를 개별 데이터세트로 내보냅니다. 각 테이블에는 Firebase Analytics에서 자동으로 캡처한 사용자 액티비티 및 인구 통계학적 데이터가 앱에서 캡처한 사용자 지정 이벤트와 함께 포함됩니다. 따라서 교차 플랫폼 앱에 대해 1주일 분량의 데이터를 내보낸 후에는 BigQuery 프로젝트에 각각 7개의 테이블로 구성된 2개의 데이터세트가 포함됩니다.


    데이터 세부 분석

    모든 Firebase Analytics 내보내기 테이블에 대한 스키마는 동일하며, 개발자가 아래의 예제 쿼리를 실행할 수 있도록 샘플 사용자 데이터가 포함된 두 개의 데이터세트(iOS용 하나Android용 하나)를 만들었습니다. 이 데이터세트는 샘플 교차 플랫폼 iOS 및 Android 게임 앱에 대한 것입니다. 각 데이터세트에는 7개의 테이블,  1주일 분량의 분석 데이터가 있습니다.

    다음 쿼리는 iOS 버전 앱의 일일 사용량에 대한 몇 가지 기본적인 사용자의 인구 통계학적 정보와 기기 데이터를 반환합니다.

    SELECT
      user_dim.app_info.app_instance_id,
      user_dim.device_info.device_category,
      user_dim.device_info.user_default_language,
      user_dim.device_info.platform_version,
      user_dim.device_info.device_model,
      user_dim.geo_info.country,
      user_dim.geo_info.city,
      user_dim.app_info.app_version, 
      user_dim.app_info.app_store,
      user_dim.app_info.app_platform
    FROM
      [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
    

    Firebase Analytics에서 내보낸 모든 BigQuery 테이블의 스키마가 동일하기 때문에 데이터세트 이름과 테이블 이름을 개발 중인 프로젝트의 데이터세트 이름과 테이블 이름으로 바꿔 자체적인 Firebase Analytics 데이터에 대해 이 글에 나와 있는 모든 쿼리를 실행할 수 있습니다.

    이 스키마에는 사용자 데이터와 이벤트 데이터가 있습니다. 모든 사용자 데이터는 Firebase Analytics에서 자동으로 캡처되고, 이벤트 데이터는 개발자가 앱에 추가하는 사용자 지정 이벤트로 채워집니다. 사용자 데이터와 이벤트 데이터 모두에 대한 구체적인 레코드를 살펴봅시다.

    사용자 데이터

    사용자 레코드에는 각 사용자에 대해 고유한 앱 인스턴스 ID(스키마의 user_dim.app_info.app_instance_id)와 함께 해당 위치, 기기 및 앱 버전에 대한 데이터가 포함됩니다. Firebase 콘솔에는 앱의 Android 및 iOS 분석에 사용할 수 있는 별도의 대시보드가 있습니다. BigQuery를 사용하면 쿼리를 실행하여 사용자가 두 플랫폼 간에 전 세계에서 앱에 액세스하는 위치를 확인할 수 있습니다. 아래에 나와 있는 쿼리에서는 BigQuery의 통합 기능을 이용합니다. 이 기능을 통해 쉼표를 UNION ALL 연산자로 사용할 수 있습니다. 테이블에는 사용자가 트리거하는 각 이벤트 번들에 대해 하나의 행이 생성되므로 EXACT_COUNT_DISTINCT를 사용하여 각 사용자가 한 번만 카운트되도록 해야 합니다.
    SELECT
      user_dim.geo_info.country as country,
      EXACT_COUNT_DISTINCT( user_dim.app_info.app_instance_id ) as users
    FROM
      [firebase-analytics-sample-data:android_dataset.app_events_20160601],
      [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
    GROUP BY
      country
    ORDER BY
      users DESC
    

    사용자 데이터는 user_properties 레코드도 포함합니다. 이 레코드에는 사용자 기반의 여러 다양한 세그먼트를 설명하기 위해 정의하는 특성(예: 언어 기본 설정 또는 지리적 위치)이 포함됩니다. Firebase Analytics는 기본적으로 몇 가지 사용자 속성을 캡처하고, 개발자는 최대 25개의 고유한 속성을 생성할 수 있습니다.

    사용자의 언어 기본 설정은 기본 사용자 속성 중 하나입니다. 사용자가 플랫폼 간에 사용하는 언어를 보려면 다음 쿼리를 실행하면 됩니다.

    SELECT
      user_dim.user_properties.value.value.string_value as language_code, 
      EXACT_COUNT_DISTINCT(user_dim.app_info.app_instance_id) as users,
    FROM
      [firebase-analytics-sample-data:android_dataset.app_events_20160601],
      [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
    WHERE
      user_dim.user_properties.key = "language"
    GROUP BY
      language_code
    ORDER BY 
      users DESC
    

    이벤트 데이터

    Firebase Analytics는 앱에서 아이템 구매 또는 버튼 클릭을 추적하는 것과 같은 사용자 지정 이벤트를 쉽게 로그할 수 있게 해줍니다. 이벤트를 로그할 때는 이벤트 이름과 최대 25개의 매개변수를 Firebase Analytics에 전달하세요. 그러면 Firebase Analytics가 자동으로 이벤트 발생 횟수를 추적합니다. 다음 쿼리는 특정한 날에 Android에서 앱의 각 이벤트가 발생한 횟수를 보여줍니다.

    SELECT 
      event_dim.name,
      COUNT(event_dim.name) as event_count 
    FROM
      [firebase-analytics-sample-data:android_dataset.app_events_20160601]
    GROUP BY 
      event_dim.name
    ORDER BY 
      event_count DESC
    

    이벤트와 연결된 다른 유형의 값(예: 아이템 가격)이 있는 경우 이 값을 선택적인 값 매개변수로 전달하여 BigQuery에서 이 값으로 필터링할 수 있습니다. 샘플 테이블에는 spend_virtual_currency 이벤트가 있습니다. 플레이어가 한 번에 얼마나 많은 가상 통화를 소비하는지 보여주는 다음과 같은 쿼리를 작성할 수 있습니다.

    SELECT 
      event_dim.params.value.int_value as virtual_currency_amt,
      COUNT(*) as num_times_spent
    FROM
      [firebase-analytics-sample-data:android_dataset.app_events_20160601]
    WHERE
      event_dim.name = "spend_virtual_currency"
    AND
      event_dim.params.key = "value"
    GROUP BY
      1
    ORDER BY 
      num_times_spent DESC
    

    복잡한 쿼리 빌드

    특정 날짜 범위에 걸쳐 앱의 두 플랫폼 모두를 대상으로 쿼리를 실행하려면 어떻게 해야 할까요? Firebase Analytics 데이터는 매일의 테이블로 분할되므로, BigQuery의 TABLE_DATE_RANGE 함수를 사용하여 이 작업을 수행할 수 있습니다. 다음 쿼리는 한 주 동안 사용자의 접속이 시작되는 도시의 수를 반환합니다.

    SELECT
      user_dim.geo_info.city,
      COUNT(user_dim.geo_info.city) as city_count 
    FROM
    TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
    TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
    GROUP BY
      user_dim.geo_info.city
    ORDER BY
      city_count DESC
    

    또한, 다음과 같이 한 주 동안 플랫폼 간에 모바일 사용량과 태블릿 사용량을 비교하는 쿼리를 작성할 수도 있습니다.

    SELECT
      user_dim.app_info.app_platform as appPlatform,
      user_dim.device_info.device_category as deviceType,
      COUNT(user_dim.device_info.device_category) AS device_type_count FROM
    TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
    TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
    GROUP BY
      1,2
    ORDER BY
      device_type_count DESC
    

    좀 더 복잡한 문제를 생각해보자면, 지난 2주일 동안 플랫폼 간에 고유한 사용자 이벤트에 대한 보고서를 생성하는 쿼리를 작성할 수 있습니다. 여기서는 PARTITION BYEXACT_COUNT_DISTINCT를 사용하여 사용자 속성 및 user_dim.user_id 필드를 이용해 사용자의 이벤트 신고에서 중복된 항목을 제거합니다.

    SELECT 
      STRFTIME_UTC_USEC(eventTime,"%Y%m%d") as date,
      appPlatform,
      eventName,
      COUNT(*) totalEvents,
      EXACT_COUNT_DISTINCT(IF(userId IS NOT NULL, userId, fullVisitorid)) as users
    FROM (
      SELECT
        fullVisitorid,
        openTimestamp,
        FORMAT_UTC_USEC(openTimestamp) firstOpenedTime,
        userIdSet,
        MAX(userIdSet) OVER(PARTITION BY fullVisitorid) userId,
        appPlatform,
        eventTimestamp,
        FORMAT_UTC_USEC(eventTimestamp) as eventTime,
        eventName
        FROM FLATTEN(
          (
            SELECT 
              user_dim.app_info.app_instance_id as fullVisitorid,
              user_dim.first_open_timestamp_micros as openTimestamp,
              user_dim.user_properties.value.value.string_value,
              IF(user_dim.user_properties.key = 'user_id',user_dim.user_properties.value.value.string_value, null) as userIdSet,
              user_dim.app_info.app_platform as appPlatform,
              event_dim.timestamp_micros as eventTimestamp,
              event_dim.name AS eventName,
              event_dim.params.key,
              event_dim.params.value.string_value
            FROM
             TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
    TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
    ), user_dim.user_properties)
    )
    GROUP BY
      date, appPlatform, eventName
    

    Google 애널리틱스에 동일한 앱에 대한 데이터가 있으면 BigQuery로 자신의 Google 애널리틱스 데이터를 내보내어 Firebase Analytics BigQuery 테이블과 JOIN을 수행할 수도 있습니다.

    분석 데이터 시각화

    이제, 원시 BigQuery 내보내기를 사용하여 모바일 앱 데이터에서 새로운 통계 데이터를 수집했으므로 Google Data Studio를 사용하여 이를 시각화해 봅시다. Data Studio는 BigQuery 테이블에서 직접 데이터를 읽을 수 있으며, 위에 표시된 쿼리와 같이 사용자 지정 쿼리에 이 데이터를 전달할 수도 있습니다. Data Studio는 데이터 구조에 따라 시계열, 막대 그래프, 원형 차트, 지오 맵 등 다양한 유형의 차트를 생성할 수 있습니다.

    우선 시각화를 위해 사용자가 각 플랫폼에서 앱에 액세스하는 기기의 유형을 비교하기 위한 막대 그래프를 생성해보도록 하겠습니다. 위에 나와 있는 모바일 사용량과 태블릿 사용량을 비교하는 쿼리를 Data Studio에 직접 붙여 넣어 다음 차트를 생성할 수 있습니다.
    이 차트에서 iOS 사용자가 태블릿에서 게임에 액세스하는 경향이 더 큰 것을 쉽게 파악할 수 있습니다. 좀 더 복잡한 문제를 생각해보자면, 위의 이벤트 보고 쿼리를 사용하여 플랫폼 간의 이벤트 수를 비교하여 보여주는 막대 그래프를 생성할 수 있습니다.
    BigQuery 프로젝트를 Data Studio에 연결하는 방법에 대한 자세한 지침은 이 글에서 확인하시기 바랍니다.

    다음 단계는?

    Firebase를 처음 사용하는 것이라면 여기에서 시작해 보세요. Firebase에서 모바일 앱을 이미 빌드하고 있다면 이 상세 가이드에서 Firebase 프로젝트를 BigQuery에 연결하는 방법을 확인해 보세요. 궁금한 점이 있으면 BigQuery 참조 문서를 살펴보고 firebase-analyticsgoogle-bigquery 태그를 사용하여 Stack Overflow에 질문을 올려주시기 바랍니다. 또한, 다음 글에서 다루었으면 하는 주제가 있으면 알려주시기 바랍니다.

    Developer, Coding For a Better World.


    개발자들의 축제, GDG DevFest Incheon 2016 이 11/19 (토) 부천 만화 박물관에서 열립니다.




    • 일시: 2016년 11월 19일(토) 12시 ~ 5시 50분 
    • 장소: 부천만화박물관 (경기도 부천시 길주로 1) 
    • 예상 참석인원: 약 350명 
    • 프로그램 구성: 4개 세션/ 5개 코드랩 

    Developer, Coding For a Better World 라는 주제로,
    많은 개발자들이 더 나은 세상을 만들기 위해 각자의 위치에서 구글의 기술을 이용하여 멋진 도구와 환상적인 서비스를 만들 수 있도록 한단계 더 발전 하는 것이 이번 행사의 목표입니다.

    기존 현역 개발자들에게는 다시 열정과 많은 정보를, 초보 개발자들에게는 한걸음 나아갈 수 있는 마일스톤을 제공합니다. 참석하는 개발자들에게 새로운 기술들을 설명하고, 접목 시킬 수 있도록 도와 드립니다.

    새로운 기술을 배우고 익히면서 평소에 만들어 보고 싶었던 것을 즐겁게 만들며 열정을 불태워 보고 싶은 모든 분들을 초대합니다!!


    참가신청하러 가기!


    페이스북 게시글 공유 이벤트!

    GDG Korea 페이스북의 GDG DevFest Incheon 2016 게시글을 여러분의 타임라인에 공유해 주세요. 총 20분을 선정해 기념 티셔츠를 19일 행사장에서 드립니다!
    • 이벤트 기간: 2016년 10월 31일(월) 08:30 - 11월 17일(목) 24:00 
    • 당첨자 안내: 2016년 11월 18일(금) 개별 안내 

    GDG Busan 에서 개최하는 DEVFEST 2016 BUSAN 행사에 여러분을 초대합니다!

    개발자들이 한자리에 모여 서로 지식을 교환하고, 아이디어를 공유하고, 기술에 대한 열정을 표출하는 개발자들의 축제인 GDG DevFest 가 올해는 처음으로 부산에서도 개최됩니다!

    개발자로서의 커리어에 대한 고민 그리고 커뮤니티 활동 경험을 주제로 한 진솔한 이야기는 물론 안드로이드, 웹, VR 등 구글의 최신 기술에 대한 소식을 접할 수 있는 이번 기회를 놓치지 마세요!
    <행사 개요>
    • 일시: 2016년 11월 12일(토) 오후 1시 ~ 6시 
    • 장소: 센탑(CENTAP), 부산 해운대구 센텀동로 45 1층 101호
    • 예상 참석인원: 약 100명 
    • 프로그램 구성: 5개 세션
    <세션 소개>
    • 안드로이드 누가 - 새로운 변경점과 개발자가 알아야 하는 것들 - 김석용 님
    • What Is Next For The Web - 도창욱 님
    • Google VR SDK - Hassan Abid 님
    • Progressive Web App with React.js from scratch - 문현경 님
    • 개발자 커리어 & 커뮤니티 - 기묘한 이야기 - 이원제 님


    참가신청하러 가기!



    페이스북 게시글 공유 이벤트!

    GDG Korea 페이스북의 DEVFEST 2016 BUSAN 게시글을 여러분의 타임라인에 공유해 주세요. 총 20분을 선정해 기념 티셔츠를 랜덤하게 발송해 드립니다.

    • 이벤트 기간: 2016년 10월 28일(금) 08:30 - 11월 10일(목) 24:00 
    • 당첨자 안내: 2016년 11월 11일(금) 개별 안내

    편집자 주: 다음은 원래 Channels의 제품 관리자인 u/illymc 가 작성한 Reddit 관련 블로그에 게시된 것입니다. Reddit이 AMP를 어떤 식으로 사용하는지 알아보려면 아래 내용을 읽어 보세요.

    Reddit은  Accelerated Mobile Pages(약칭 AMP)를 활용하여 거의 즉각적으로 로드되는 웹 페이지를 제작하고 있습니다. 모바일 사용자 중 39%가 웹 검색 환경에 만족하지 않는 주된 이유로 느린 페이지 로드 속도를 꼽았습니다. 빠른 모바일 웹 환경을 만들기란 무척 어려운 일입니다. 한 달 동안 사이트의 고유 방문자 수가 1억 5천만 명이 넘는 기술 기업인 Vox Media는 2015년도에 평균적으로 로드를 마치는 데 23초가 걸린 페이지를 인용하면서 비유적 표현으로 "성능 파산"을 선언했습니다. AMP는 10분의 1초 이내로 로드되는 페이지를 손쉽게 제작할 수 있게 해주므로 모바일 웹의 판도를 바꿀 획기적인 기술입니다.

    오늘, 저희는 Reddit에서 수천만 개의 AMP 페이지를 게시했음을 알려 드립니다. 이런 페이지는 이전 모바일 페이지보다 7~30배 더 빠르게 로드됩니다. Reddit에서 생성되는 모든 자체 게시물에는 이제 이에 해당하는 AMP 버전이 있습니다. Google의 검색 결과에는 시간이 지남에 따라 이런 페이지가 점점 더 많이 표시될 것입니다. 이런 페이지는 Reddit 환경에서 가장 중요한 부분, 즉 사용자가 만들어내는 훌륭한 콘텐츠에 초점을 맞춘 것입니다.

    다음은 이에 대한 예제입니다.

    jeremy-blog-post-visual

    저희 엔지니어링 팀은 AMP 페이지 제작이 어렵지 않다는 점을 알게되었습니다. AMP는 페이지 로드 속도가 엄청나게 빠른 일련의 구성 요소 집합입니다. 따라서 웹 페이지를 만들 때, 페이지의 모든 측면을 신중하게 공들여 제작해야 하는 것이 아니라, 레고 블록을 조립하는 것처럼 미리 정해진 구성 요서를 활용해 조합합니다. 몇몇 제품 개발자는 선택할 수 있는 폭이 한정되어 있기 때문에 사용자 환경이 저하될 것을 염려할지도 모르겠군요. 하지만, 저희는 오히려 AMP 구성 요소로 제한함으로써 사용자가 Reddit에서 보려는 콘텐츠에만 디자인 작업을 쉽게 집중할 수 있다는 사실을 알아차렸습니다.

    지금은 대부분의 회사에서 이미 구축한 페이지에 대해 별도의 AMP 버전을 제작하고 있습니다. 이에 더 나아가 현재는 AMP로 새 페이지를 처음 부터 개발하는 시험을 진행하고 있습니다. AMP 페이지는 모바일 환경과 마찬가지로 데스크톱 환경에서도 훌륭하게 표시되고 빠르게 로드됩니다. 페이지가 자주 변경되므로 페이지 성능을 높은 수준으로 유지하는 일은, 시간이 많이 걸리는 두더지 잡기 게임과 같습니다. 하지만 저희가 제작하는 AMP 페이지는 항상 빠르게 로드될 것이라 확신합니다. 따라서 많은 종류의 페이지에서 AMP 버전만이 우리가 앞으로 항상 필요로 할 유일한 버전이라고 생각합니다.

    게시자: u/illymc

    iOS 개발자 여러분,
    이제 iOS용 Firebase 버전 3.6을 사용할 수 있게 되었음을 알려드리고자 합니다. 이 버전에는 iOS 10 지원에 필요한 여러 중요 버그 수정과 기능이 포함되어 있습니다. 가급적 빨리 pod update를 실행하거나 프레임워크를 수동으로 업데이트하고 프로젝트를 다시 컴파일하시는 것이 좋습니다.

    수정 사항 및 향상된 기능에 대한 전체 목록을 보려면 릴리스 노트를 살펴보세요. 여기에는 새로운 기능에 대해 간략히 요약되어 있습니다.

    새로운 알림 지원

    Firebase 클라우드 메시징에서 이제 새로운 iOS 10 사용자 알림을 지원합니다. 앱이 iOS 10에서 실행 중이라면 userNotificationCenter:willPresentNotification: withCompletionHandler 메서드를 사용하여 수신되는 알림을 처리할 수 있습니다. 걱정하지 마세요. 앱에 기존에 지원되던 application:didReceiveRemoteNotification: completionHandler 메서드만 있을 경우 APN에서 최신 메서드를 찾을 수 없다면 기존 메서드를 대신 호출하니깐요. 추가 정보가 필요하세요? 자세한 내용은 업데이트된 FCM 문서를 참조하세요.

    앱 사용 후기 지침과 관련한 몇 가지 참고 사항

    iOS 10 업데이트와 함께 Apple에서는 App Store 사용 후기 지침에서 몇 가지 사항을 변경했습니다. 최신 버전의 Firebase에서는 이런 새로운 지침에 대응하여 여러 가지 사항이 변경되었습니다. 가장 중요한 점은 NSCalendarsUsageDescription NSBluetoothPeripheralUsageDescription 같은 항목에 대한 텍스트를 제공하라는 iTunes 연결 오류가 더 이상 발생하지 않아야 한다는 점입니다.

    이런 지침을 따름으로써 발생하는 결과 중 하나로, 저희는 최근에 Safari에서 iOS Search 앱 설치 광고를 평가할 수 있는 기능을 여러분에게 제공하기 전까지는 이 기술을 제거했었습니다.

    Firebase 초대를 사용하고 있다면 plist 파일에서 NSContactsUsageDescription에 대한 콘텐츠를 제공해야 합니다. Firebase 초대에서는 이런 연락처 정보를 사용하여 여러분의 사용자가 초대장을 보내고 싶어 할지 모를 친구 목록을 채웁니다.

    저희는 이런 변경 사항이 미치는 영향을 면밀히 모니터링하고, 필요한 경우 추가 업데이트를 게시할 것입니다.

    로그인 해결 방법

    최근의 한 블로그 게시물에서, Xcode 8에서는 시뮬레이터에서 키체인에 값을 쓸 수 없기 때문에 Firebase 인증에서 오류가 발생한다는 내용이 있었는데 기억나실지 모르겠군요. 이 문제는 여전히 존재하지만, 저희는 시뮬레이터에서 NSUserDefaults를 사용하고 기기에 키체인을 계속 사용하는 해결 방법을 개발했습니다. 즉, 이제 시뮬레이터에서 Firebase 인증을 개발하고 시험해 볼 수 있으며 모든 것이 다시 제대로 작동한다는 뜻이랍니다.

    버그 수정

    여러분이 찾은 버그를 저희가 수정했습니다! 앞으로도 계속해서 혹시 문제가 발생하면 온라인 양식을 통해 신고해 주시거나 원하는 기능에 대한 요청을 제출해 주세요. 그러면 저희가 적절히 처리하겠습니다.

    궁금한 사항이 있으면 항상 Stack Overflow에서 Firebase 태그를 지정하여 문의하거나 Google 그룹으로 보내주시기 바랍니다.