github Copilot에서는 IDE 지원이 JetBrains 제품들과 MS 제품들 위주만 공식 지원함.

 

Eclipse에서는 Genuitec에서 개발한 Copilot4Eclipse 플러그인을 사용해야 함.

https://marketplace.eclipse.org/content/copilot4eclipse

 

Copilot4Eclipse

Copilot4Eclipse (Copilot for Eclipse) is a free plugin that seamlessly integrates the GitHub Copilot AI developer tools into your Eclipse IDE to create a powerful AI-assisted coding experience.

marketplace.eclipse.org

 

Copilot4Eclipse는 Eclipse 2023-06(4.28) 및 최신 버전과 호환되며, 이러한 버전을 기반으로 구축된 Eclipse 기반 제품과도 호환됩니다.

  • Eclipse 4.28(2023-06 릴리스) 또는 최신 버전을 기반으로 하는 Eclipse IDE 또는 Eclipse 기반 제품입니다.
  • GitHub Copilot 구독( 개인 수준 또는 비즈니스 수준)

 

플러그인 설치

https://www.genuitec.com/products/copilot4eclipse/docs/installation/

 

플러그인 사용을 위한 Copilot 로그인

https://www.genuitec.com/products/copilot4eclipse/docs/basics/signin

 

코드 제안

https://www.genuitec.com/products/copilot4eclipse/docs/basics/completions

https://marketplace.eclipse.org/content/copilot4eclipse#screenshots

'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

Copilot이란?

OpenAI에서 만든 OpenAI Codex 모델을 사용한 실시간 코드 제안 AI 페어 프로그래머.

(OpenAI Codex란 자연어를 코드로 변환하는 머신러닝 모델로 미세조정된 GPT-3 버전 사용)

GitHub 공개 리포지토리에 있는 코드를 포함하여 공개적으로 사용 가능한 소스의 자연어 텍스트 및 소스 코드에 대해 교육 받음.

주석과 코드에서 컨텍스트를 가져와 기능 코드를 즉시 제안함.

GitHub Copilot이 개발자를 대체할 것으로 기대하지 않으며, 개발자와 협력할 것을 기대함.

  • 그들의 기능을 강화하고,
  • 생산성을 높이고,
  • 수동 작업을 줄이고,
  • 흥미로운 작업에 집중할 수 있도록 도와줄 것
  • 진입 장벽을 낮추고 더 많은 사람들이 소프트웨어 개발을 탐색하고 차세대 개발자에 합류할 수 있도록

Copilot 장점

상용구나 반복 코드 패턴 생성에 소요되는 시간을 줄여줌.

프로젝트의 컨텍스트 및 스타일 규칙을 기반으로 권장 사항을 공유함.

Neovim, JetBrains IDE, Visual Studio, Visual Studio Code 에서 플러그인 형태로 사용

특히 새로운 언어나 프레임워크에서 작업하거나 코딩을 배우는 중이라면 도움이 됨.

낯선 언어로 모든 것을 인터넷 검색하여 코딩하려고 하는 것은 외국어 숙어집만 가지고 외국을 항해하는 것과 같습니다. GitHub Copilot을 사용하는 것은 통역사를 고용하는 것과 같습니다.

Copilot 주의점

Copilot이 완변한 코드를 작성하지는 않음.

제안하는 코드를 테스트하지 않으며, 코드가 작동하지 않거나 의미가 없을 수도 있음.

안전하지 않은 코딩 패턴, 버그 또는 오래된 API 또는 관용구에 대한 참조가 포함될 수 있음.

신중한 테스트 및 코드 및 보안 검토 그리고 자신의 판단과 함께 사용해야 함.

책임은 항상 개발자에게 있음. (GitHub는 Copilot이 제공한 제안을 소유하지 않음)

공개 소스가 주로 영어로 되어 있어 자연어 프롬프트가 영어가 아니거나 문법적으로 잘못된 시나리오에서 제대로 작동하지 않을 수 있음.

Copilot 보안

GitHub의 공개 코드가 포함된 제안을 필터로 막을 수 있음.

(개인 설정이나 엔터프라이즈 관리자가 관리)

제안되었던 코드가 공유되거나 재사용되지는 않음.

경우에 따라 개인 데이터로 보이는 것을 제안하지만 이것은 가상 정보임.

Copilot 제안을 사용하여 저작권 침해로 고발되면? 제품별 약관에 제공된 대로 변호해준다고 함.

Copilot 관련 데이터

사용자 초기 관찰 및 인터뷰 결과 (2,000명 이상의 개발 대상)

  • 개발자 만족도 향상 : 사용자의 60~75% 작업에 만족, 코딩시 좌절감 덜 느끼고 더 만족스러운 작업에 집중할 수 있었음.
  • 정신 에너지 절약 : 흐름을 유지하고(73%) 반복적인 작업 중에 정신적 노력을 보존하는데 도움이 되었음(87%)

Copilot에 표시된 모든 완료의 평균 26%가 수락을 함.

(Python과 같은 특정 언어에서는 최대 40%까지 생성)

Copilot 잘 부려먹는 법

작은 함수로 나누고, 매개변수에 의미있는 이름을 사용

좋은 doc와 주석을 작성

익숙하지 않은 라이브러리나 프레임워크 탐색시 사용

Copilot 과금

  • 개인
    • 월 10$, 연 100$
    • 30일 평가판 사용 가능 (⚠️자동으로 유료 구독으로 전환됨)
    • 학생, 교사나 유명 오픈소스 리포지토리 관리자는 무료 구독 가능
  • 비즈니스
    • 인당 월 19$

Android Studio Plugins

Plugins에서 GitHub Copilot 설치

https://docs.github.com/ko/copilot/getting-started-with-github-copilot

 

 

Android Studio + Copilot

주석으로 한국어로 할 일을 적고 Copilot의 제안 받아보기

번역이 필요한 경우

테스트 코드 작성시

정규표현식 패턴 매칭

알고리즘 풀이

Android Room 사용하기

Android Activity xml 생성

 

참고문서

https://github.com/features/copilot/

https://docs.github.com/ko/copilot/getting-started-with-github-copilot

https://dev.to/github/a-beginners-guide-to-prompt-engineering-with-github-copilot-3ibp

https://github.blog/2022-09-14-8-things-you-didnt-know-you-could-do-with-github-copilot/

https://plugins.jetbrains.com/plugin/17718-github-copilot

 

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

Eclipse Copilot  (0) 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

https://www.droidknights.dev/

 

드로이드나이츠 2024

대한민국 최대 안드로이드 개발자들만을 위한 컨퍼런스 드로이드나이츠 2024 입니다. 주니어부터 시니어까지 모두가 공감하고 즐길 수 있는 지식의 장으로 만들고자 합니다.

www.droidknights.dev

 

지난 6월 11일에 드로이드나이츠 2024 행사가 있어 다녀왔습니다.

오랜만에 개발자 컨퍼런스를 가다보니 코엑스에서 길도 헤매기도 했고, 겨우 찾은 현장에서는 예전보다 다소 줄어든 부스들을 보며 여러 감정이 들었습니다.

몇년 전까지는 Kotlin, Coroutines, MVVM 등의 주제들이 주를 이루었던 것 같은데요.

이번 컨퍼런스에서는 Compose가 관심을 많이 끄는 주제가 되었던 것 같습니다.

대충 들었던 세션들의 간략한 정리를 해볼까 합니다.

 

키노트

안드로이드 개발자이시자 빅네임이신 박상권님이 나오셔서 드로이드나이츠 소개를 해주셨습니다.

 

Compose 성능 최적화를 위한 Stability 마스터하기

Compose 동작 구조와 Recomposition의 효율적인 사용을 위한 부분들을 소개해주셨습니다.

Compose 사용이 점차 많아지면서 개발자 문서 정독 후 들으면 좋을 내용이었습니다.

유튜브 영상도 업로드 되어 개인적으로 시간 날때 다시 정독할 첫번째 세션입니다.

 

시니어와 주니어의 협업 다리: 온라인 및 오프라인 페어코딩의 통찰

페어 프로그래밍을 한 학습 및 경험담에 대해 소개해주셨습니다.

페어코딩을 하기 위한 각자의 룰이나 필요한 자세 등을 알려주었습니다.

페어코딩시 주의할 점이라던지 장단점 등 참고할 좋은 레퍼런스를 만들어 주신 것 같네요.

 

Compose UI 컴포넌트 설계와 테스트

물론 개발자 문서에도 잘 정리가 되어 있지만, 이 세션을 본다면 훨씬 이해가 용이해질 듯 싶습니다.

Compose 테스트에 대한 궁금증도 있었는데, 참고가 많이 되었습니다.

 

Github Actions로 효율적인 배포 환경 만들기

때마침 업무적으로 하고 싶은 주제 중 하나였던 Github Actions 세션이었습니다.

Github Actions를 이용한 다양한 활용에 대해서 소개해주셨습니다.

조만간 다시 정독하면서 활용 아이디어를 구상하고자 합니다.

 

당신의 앱 빌드는 안녕하십니까?

평소에 가장 많이 접하는 작업이면서 제대로 알기엔 뭔가 서먹한 빌드 관련 세션입니다.

세션에 소개된 내용을 안다고 업무 환경에 바로 큰 개선은 어렵겠지만 참고할만한 정보가 참 많았습니다.

 

Compose로 Animation 만들기 feat.holgraphic Card

포켓몬카드로 시작된 애니메이션 개발 연대기 세션입니다.

목표를 설정하고 문제해결을 위해 노력한 시간들이 엿보이며, 센스 있는 발표도 좋았습니다.

 

 

후기

역시나 이런 행사를 다녀오면 다시 찾아봐야할 것들, 공부할 것들이 쌓입니다.

조만간 하나씩 다시 보면서 좋은 시간을 가져봐야 겠습니다.

'IT > 행사' 카테고리의 다른 글

[행사] 2019 NHN Forward  (3) 2019.11.27
[행사] Naver Tech Concert Day-2 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-1 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 06  (1) 2019.01.14
[행사] Naver Tech Concert Day-2 05  (0) 2019.01.14

SonarQube 와 Jenkins 서버를 가지고 있다는 전제 하에 시작되는 이야기입니다.

개인이 아닌 팀 규모의 개발팀에서는 보통 CI 관련하여 Jenkins 등을 많이 사용하고 있습니다.

JenkinsSonarQube 를 활용하여 사용하는 이야기 입니다.

 

먼저 시나리오를 써봅니다. 어떤 시나리오냐?

Jenkins 와 SonarQube 를 언제 어떤 용도로 사용하느냐에 대한 시나리오 입니다.

 

보통은 소스 관리를 하기 위해 GitHub, GitLab 등을 사용을 합니다.

그러면 보통은 아래와 같은 구성들이 나오겠죠

 

  • GitHub - Jenkins - SonarQube
  • GitLab - Jenkins - SonarQube

제가 사용하던 동작 흐름은 아래와 같습니다.

 

  • 소스 작업 commit 후 push
  • GitLab 에서 변화 감지후 Jenkins로 WebHook 발생
  • Jenkins에서 WebHook 인지 후 소스 pull 후 build
  • build 완료 후 deploy

이 중에 build 전후로 SonarQube 를 추가해보기로 합니다.

그러기 위해서 Jenkins에서 SonarQube 를 연동하는 법을 정리해봅니다.

제가 알아본 방법은 크게 2가지가 있었습니다.

 

  1. Jenkins Plugin 으로 사용하는 방법
  2. gradle Task 추가 후 사용하는 방법

1. Jenkins Plugin 사용하는 방법

먼저 Jenkins 에 SonarQube Scanner 플러그인을 설치합니다.

 

SonarQube Scanner for Jenkins

Jenkins 관리 - 플러그인 관리 - SonarQube Scanner for Jenkins 설치

(https://plugins.jenkins.io/sonar)

 

그리고 적용하려는 프로젝트 구성에 SonarQube 연동하는 스텝을 추가합니다.

Jenkins - 프로젝트 - 구성 - Add build step - Execute SonarQube Scanner 추가

Analysis properties 작성

 

아래 이미지와 같이 작성하며, 아래 요소들을 주의하여 작성합니다.

  • sonar.host_url : SonarQube 서버 url 및 port
  • sonar.login : SonarQube ID 혹은 token
  • sonar.password : SonarQube Password (ID에서 token 사용시는 공백)
  • sonar.projectKey : SonarQube 프로젝트 값 참조
  • sonar.projectName : SonarQube 프로젝트 값 참조
  • sonar.java.binaries : Jenkins workspace 내에서 컴파일 후 생성된 class binary 경로
  • sonar.profile : SonarQube 프로젝트 값 참조
  • sonar.coverage.jacoco.xmlReportPaths : Jenkins workspace 내에서 JaCoCo Report 생성 경로 (JaCoCo 미사용시 skip)

위 Step을 추가 후 빌드를 돌려봅니다.

빌드가 잘 되었으면 콘솔 로그도 한번 구경해봅니다.

+) Coverage Report를 작성해주는 JaCoCo 플러그인도 있습니다.

 

JaCoCo plugin

Jenkins 관리 - 플러그인 관리 - JaCoCo plugin 설치

(https://plugins.jenkins.io/jacoco)

 

적용하려는 프로젝트 구성에 Coverage Report를 작성하는 스텝을 추가합니다.

Jenkins - 프로젝트 - 구성 - Add build step - Record JaCoCo coverage report 추가

아래의 항목들을 추가 작성합니다.

 

  • Inclusions (e.g.: **/*.class) : **/*.class

  • Exclusions (e.g.: **/*Test*.class) : **/R.class, **/R$*.class, **/BuildConfig.*, **/Manifest*.*, com/android/**/*.class

변경한 구성을 저장 후 빌드를 진행해 봅니다.

빌드가 성공하였다면 역시나 콘솔 로그를 확인해봅니다.

2. gradle Task 추가 후 사용하는 방법

먼저 Android 앱 소스에 gradle Task 추가하는 방법은 아래 링크를 참고하시면 됩니다.

그리고 Jenkins 프로젝트 구성에서 아래와 같이 gradlew 명령을 직접 써주시면 됩니다.

Jenkins - 프로젝트 - 구성 - Add build step - Execute shell 추가

 

chmod +x gradlew

# JaCoCo 커버리지 리포트 작성
./gradlew coverageReport

# SonarQube 분석
./gradlew sonarqube

빌드 후 확인을 해봅니다.

3. 2가지 방법의 차이?

먼저 플러그인을 사용하면 프로젝트 소스 레벨에서 추가할 부분이 없습니다.

그리고 Jenkins 프로젝트 상태 화면에 관련 UI도 이쁘게 생긴답니다.

하지만 JaCoCo플러그인 은 빌드 후 조치 구성에서만 추가가 가능하였고, Build 구성에는 추가가 불가하였습니다. SonarQube 플러그인은 Build 구성에서만 추가가 가능하였고요.

(Jenkins 프로젝트가 Maven 프로젝트였다면 다 가능한 걸로 보였습니다.)

 

gradle Task 방식으로 진행하면 Excute shell 항목에서 SonarQube, JaCoCo 사용이 자유롭게 가능합니다.

 

하지만 프로젝트 소스 레벨에서 gradle Task를 추가해야 했으며, Jenkins 프로젝트 상태 화면도 다시 평범해졌습니다.

두 방식을 사용시 장단점들이 있는 상태였습니다.

그 후...

저 이 후로 GitLab MergeRequest 시 Jenkins가 위 동작들을 처리 후 SonarQube 결과를 GitLab에 MR 메세지로 남길 수 있지 않을까 했습니다만...

특히나 검색해보니 GitHub 플러그인 사용시 아래와 같이도 사용이 가능해 보였습니다.

하지만 제가 써야 하는 건 GitLab 이었고, GitLab 플러그인은 지원이 중단되었습니다...

정확히는 기존에 있던 개인 개발자가 만들던 플러그인이 SonarQube 7.7 버전부터 중단되었습니다.

https://github.com/gabrie-allaigre/sonar-gitlab-plugin/issues/222

위 링크의 코멘트나 아래 링크를 보면 GitLab과 콜라보레이션을 위해 SonarQube 에서 플러그인 지원을 중단한 것으로 보입니다...

https://www.sonarqube.org/sonarqube-8-1/

아쉬운 대로 Jenkins에서 빌드 후 조치에 GitLab 관련된 플러그인 기능을 사용해 보았지만.... 이렇네요..

네 그래서 일단은 접었습니다.

추후에 여유가 생긴다면 다른 방법들을 생각해보던지 해야겠습니다.

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

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

SonarQube(소나큐브) 도입 및 적용에 대한 내용입니다.

먼저 소나큐브란 무엇인가?

위키에서는 아래와 같이 소나큐브를 설명하고 있습니다.

소나큐브(SonarQube, 이전 이름: 소나/Sonar)[2]는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 소나소스(SonarSource)가 개발하였다. 소나큐브는 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공한다.

개발자에게 좋은 정적분석 툴이라는 내용 같네요.

https://www.sonarqube.org/ 에 적혀있는 대문 문구입니다.

Your teammate forCode Quality and Security

SonarQube empowers all developers to write cleaner and safer code.

역시 소나큐브가 모든 개발자(가)보다 깨끗하고 안전한 코드를...

뭐 아무튼 코드 품질과 보안에 대한 도움을 준다는 내용 같네요.

슬라이드쉐어에 소나큐브에 대해 잘 정리된 슬라이드가 있어 달아봅니다~

https://www.slideshare.net/curvc/sonarqube-sonarqube

저는 어떤 타이밍에 어떻게 소나큐브를 활용할지에 대한 부분에 앞서 실제로 써보는 시간을 가져보았습니다.

소나큐브를 설치할 서버를 만들 능력은 없어 제 Windows 10 PC에 Docker 설치 후 SonarQube Image를 받은 후 돌려보았습니다.

Docker Image는 SonarQube Community Edition을 기본 지원하는 것 같네요.

Docker 설치 및 설정 등은 아래 링크들을 참고하면 됩니다.

참고로 포스팅 글에서 sonar-scanner 부분은 스킵하였습니다.

그냥 설치시는 아래 링크 참조하시면 될 것 같네요.

https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

Docker에 소나큐브 서버는 아래와 같이 돌렸습니다.

> docker pull sonarqube > docker run -d --name sonarqube_com -p 9000:9000 sonarqube

잘 돌아가는지 소나큐브 페이지에 들어가봅니다.

http://localhost:9000/

Android 개발자다 보니 Android 개발 환경에서 설정하였고, Android Studio에서 포스팅 글을 참고하여 설정하니 잘 되었습니다.

Android Studio의 Terminal에서 아래와 같이 실행하면 로컬 Docker에 설치된 소나큐브 서버에 결과가 잘 올라가더랍니다.

> gradlew sonarqube

진행하다보니 같이 일하는 iOS 개발자의 소스도 돌려보려 하니 안되더군요.

Docker로 돌린 소나큐브는 Community Edition 이었고, Objective-C나 Swift는 과금해야 사용할 수 있는 Developer Edition 부터 사용이 가능한 문제가 있었습니다.

 

어떻게 활용할지보다 일단 써보자는 취지로 접근한 지라 Trial 로 써보기로 합니다.

https://www.sonarsource.com/plans-and-pricing/

How are the plans licensed?

Community Edition is free.

Developer Edition, Enterprise Edition and Data Center Edition are priced per instance per year and based on your lines of code. You pay per instance for a maximum number of lines of code to be analyzed.

Determine your max number of LOCs on your edition of choice and see what it will cost you.

Can I get an evaluation license?

It is possible to get a free, 14 day evaluation license of any commercial edition by filling in the form you see once you select your edition.

마침 소나큐브 Docker Image도 Developer Edition을 지원을 하고는 있네요.

> docker run -d --name sonarqube_dev -p 9001:9000 sonarqube:developer-beta

Community Edition과 동시에 돌려보려 포트 설정을 요리조리 바꿔봤지만... 워낙 Docker 및 서버 문외한이라 결국 실패하였고.. 필요시마다 하나씩만 돌려보기로 합니다;;

Docker로 설치한 소나큐브 Developer Edition도 서버가 잘 돌아감을 확인하고 역시나 Andorid 소스 환경에서 자연스럽게 gradlew sonarqube를 쳐보았습니다.

잘 분석을 하고 잘 올린거 같습니다.

한번 소나큐브 페이지에 들어가서 확인해봅니다.

http://localhost:9001/

이런.. 프로젝트 Overview부터 결과들이 안나옵니다.

몇 군데를 들락거리니 라이센스 키를 입력하라는 페이지가 뜨네요.

알고보니 Developer Edition 을 Trial 버전으로 사용하려고 해도 키를 발급받아야 했습니다.

키를 발급받기 위해 소나소스에서 시키는 대로 고분고분 폼을 작성하여 제출해봅니다.

https://www.sonarsource.com/plans-and-pricing/developer/

성심성의 껏 작성하면 고맙다고 하네요.

https://www.sonarqube.org/forms/success-developer-edition/

하지만 라이센스 키가 바로 안옵니다.

단순하게 폼 작성 후 제출하면 자동 생성해서 키를 줄거라 생각했는데, 그게 아니었습니다.

어느 정도 시간이 흐른뒤 정말 담당자에게서 메일이 왔습니다.

또 고맙다면서 이것저것 묻더군요.

  • 이전에 소나큐브를 쓰고 있었냐?
  • 소나큐브 어떤 기능에 관심이 있고 어떤 프로그래밍 언어를 스캔할거냐?
  • 사용하려는 서버가 Developer Edition이냐? Community Edition 이냐?

대략 저에게는 저 정도를 궁금해 하셨습니다. 스위스 분께서요..

암튼 구글의 도움으로 더듬더듬 영작해서 회신을 해봅니다.

Hello

I'm not...

I blabla..

I would be grateful if you could provide license.

...

구글의 힘으로 14일 후 만료되는 Developer Edition Trial 라이센스 키를 발급 받게 되었습니다.

다시 소나큐브 페이지에 들어가서 라이센스 입력화면에서 입력해봅니다.

http://localhost:9001/

잘 됩니다.

하지만 라이센스 등록 전 돌렸던 분석결과는 볼 수가 없습니다;;

새 출발하는 마음으로 새로 돌려봅니다.

gradlew sonarqube

...

잘 됩니다.

이젠 Overview도 잘 나오고 소나큐브에서 지원하는 다양한 기능을 써볼 수 있었습니다.

Community Edition 대비 Developer Edition 사용시 느낀 차이점은 가장 큰 건 지원하는 언어의 차이도 있겠지만, branch 관리도 차이가 있더군요.

gradle에 branch 속성을 설정해서 올리면 소나큐브 내에서 한 프로젝트에서 다른 brach로 관리가 가능하였습니다.

앞으로 소나큐브로 어떤 타이밍에 어떤 수준까지 고려하여 사용할지를 고민해보아야 할 것 같네요.

+) 소나큐브 가격표입니다. (2020.02.07 기준) 

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

Copilot 리서칭  (1) 2024.10.17
[SonarQube] SonarQube & Jenkins 이야기  (0) 2020.02.14
[Docker] Docker란?  (0) 2018.03.23
Expert Beginner란...  (0) 2018.03.12
[Cloud9][Ruby on Rails] C9 생성 후 간단한 Ruby on Rails 페이지 만들기  (0) 2017.12.29

초청 특강 Recommendation Systems : Concepts, Techniques, and Research Results

키워드 : 추천 시스템, 머신러닝

소개 : 최근 온라인 비즈니스에서 크게 각광을 받고 있는 추천 시스템 기술에 대해서 다룹니다. 먼저, 추천 시스템의 기본 개념, 최신 기술, 응용에 대해서 설명하고, 머신 러닝 기술을 이용하여 추천 시스템을 어떻게 실현하는가에 대해서 설명합니다. 또한, 최근 제안된 무관심 아이템이라는 새로운 개념을 제시하고, 이 개념을 통하여 기존 추천 시스템의 정확도가 어떻게 개선 되는가에 대해서 다양한 관점에서 논의합니다. 또한, 추천 시스템에서 다루는 그래프 데이터를 효과적으로 저장하는 새로운 그래프 엔진 RealGraph를 소개하고, 이를 통하여 추천 시스템의 성능을 크게 개선시킬 수 있음을 설명합니다.

추천 시스템은 예전 데이터가 많은 업체만 하던 것을 작은 업체들도 시도하고 있음.

추천 기술은 몇가지 기반 기술이 있음

Content-based filtering은 내 데이터만 봄

Trust-based 는 트러스트라는 관계 데이터가 필요함. 주변인 추천 같은?

Collaborative filtering (CF)는 나와 취향이 비슷한 이웃을 찾고 내가 모르는 아이템을 얼마나 좋아하는지 예측함. Rating Matrix 사용

1단계 취향유사도 계산은 Pearson Correlation Coefficient based Collaborative Filtering(PCC) 사용

2단계 내가 얼마나 좋아할지는 Heuristic based methods 사용

일반 평균, 유사도에 따른 가중치를 주거나 각 이웃의 평균치도 고려함

위 단계가 Matrix Factorization, Tensor Factorization 이며 점차 딥러닝으로 넘어가는 중

Social network analysis, Deep Learning 등

정확도를 높이기 위해 Unrating 개념 추가

Unrating은 존재를 모르거나 알고도 관심이 없는 경우도 있음(부정적인)

기존 선호도로 쓰이던 부분을 사전/사후 선호도를 나눔.

Uninteresting item 찾는게 과제임.

기존 사용자가 좋아하는 것만 추천했지만 한양대에서는 싫어하는 것까지 고려하려 함.

작은 Interesting 그룹과 큰 Uninteresting 그룹이 필요함

깃'깔나는 Git 워크플로 알아보기

키워드 : 개발 방법론, 생산성

소개 : 주요 Git 워크 플로우의 이해 각자 상황에 적합한 Git 워크플로를 찾는 팁

Git flow

메인브랜치 : master, develop (master에 버전 태그 추가)

서포팅브랜치 : feature, release, hotfix (필요시 생성/제거)

hotfix는 마스터에서 브랜치 생성

Github flow

master 브랜치는 항상 배포 가능한 상태 유지

topic 브랜치 (Git flow의 feature) 는 기능 설명이 명확하게 작명하고 merge시 pull request 사용

topic 브랜치는 CI 빌드 통과해야 함.

배포는 merge 순간 bot을 통해 진행함.

매우 빈번하게 배포함.

Gitlab flow

Git flow는 너무 복잡, Github flow는 너무 간단하게 생각되어 나옴.

Gitlab flow - 지속적인 배포가 어려울때

master에서 production 브랜치로 머지 후 배포

Gitlab flow - 환경별 배포시

Gitlab flow - 릴리즈 소프트웨어시

Commit과 Push는 자주 할것

Merge Request or Pull Request 는 완료 전이라도 논의 및 피드백 받을 목적으로도 사용.

merge 전엔 테스트 필요

NHN Edu 사례

단기간,

장기간 배포 일정(코드네임 부여)

rebase 로 정리함.

QA 수정사항은 각 프로잭트 브랜치에서 추가함.

Release 브랜치 사용안함.

배포 후 각 프로젝트 브랜치에 rebase

각 프로젝트 rebase시 conflict이 발생할 수 있고, 그 경우가 복잡할 경우 프로젝트 브랜치 재생성하고 cherry-pick 함.

hotfix 는 Pull Request 로 코드 리뷰와 테스트만 하고 배포는 직접 진행함.

업무프로세스

Pull Request 시 사내 메신저 연동

Pull Request 통과 조건을 부여하여 통과시만 merge 가능(github 설정)

- 코드 리뷰 승인시 조건

- 테스트 옵션 – Unit Test와 Sonarqube

(Sonarqube 는 테스트 결과와 별개로 패스되므로 참고만 함.)

- develop에 최신 master 적용여부 체크

Pull Request 생성시 Jenkins 빌드 및 Unit Test연동

Sonarqube 결과도 댓글로 달림

Github Pull Request + Jenkins + Sonarqube

실용적인 프런트엔드 테스트 전략

키워드 : 프런트엔드, 테스트, 아키텍처

소개 : 프런트엔드 코드는 사용자 환경과 밀접하게 연결되어 있고 복잡한 시각적 요소를 다루기 때문에 테스트를 자동화하기가 어렵습니다. 본 세션에서는 수년간 다양한 방식으로 테스트를 작성해 온 경험을 공유하며, 최신 테스트 도구를 사용해서 실용적으로 프런트엔드 코드를 테스트하는 방법을 설명합니다.

테스트는 왜 하는가?

대부분 개발자가 테스트 코드 작성 후 자동화함

그 이유는 Confidence 때문임.

백엔드의 경우 테스트는 https 요청에 대한 응답이 대부분.

프런트엔드는 마우스 키보드 등 입력과 시각적 정보 출력하고 코드로 확인하기 어려움.

입력 : DOM Event, Routing IO

출력 : Html, css 비교 등

결과 확인

\1. Html 비교

\2. 스냅샷 테스트 : 에전 테스트 결과와 파일 비교. Jest 사용

하지만 html 확인만으로는 테스트 결과에 신뢰를 줄 수 없음

구현상세테스트 vs 동작테스트 로 테스트 성향을 구분.

위의 결과 확인은 구현상세테스트 성향임.

동작테스트로 시각적 회귀 테스트 진행함. (회귀란 기존 버전과 비교하기 떄문)

하지만 픽셀 단위 비교도 브라우저 렌더링 등에 영향을 받음

그리고 커맨드 라인에서 테스트 결과 확인이 어려움.

테스트 실행 단위별 이미지 파일 히스토리 관리 필요.

결정적으로 시각적 테스트 전문 도구(유료)

Applitools, Percy, Chromatic

시각적 테스트는 속도 문제와 테스트의 장점 중 하나인 문서화 기능을 처리하기 어려움

이로 인해 TDD 진행도 어려움.

그리고 단일 테스트에 영향 주는 요소 많음.

시각적 테스트 vs 기능적 테스트

기능 테스트시 시각적 요소 의존성 제거해야 함

JQuery의 Selector들 같은 경우가 이에 속하며, 이를 제거하기 위해 data 속성을 이용해 test-id 등을 부여할 수 있음.

Storybook 툴 추천함.

- 독립된 컴포넌트 개발 환경 (안스 xml 에디터 같음)

- 그러나 시각적 테스트 툴은 아니지만 노트 기능에 테스트 정의 하고 사용해도 됨

- 디자인 피드백 용으로도 쓰임

단위테스트 vs 통합테스트

단위 테스트에 대한 위와 같은 시선도 존재하며, 실제 꼭 필요하지 않은 테스트들도 있음.

Sociable Test / Solitary Test

컴포넌트 단위로 하나로 묶어 테스트 하는 것을 추천

Cypress 통합(추천) / E2E test

개발시 TDD 도구로도 사용 가능

세션에서 강조하고 싶은 내용들

벅스 5.0 (feat. Kotlin, Jetpack)

키워드 : 모바일, 언어

소개 : 벅스 Android 5.0에 Kotlin, Jetpack을 적용하면서 얻은 노하우와 시행착오를 공유합니다.

벅스 앱은 5년간 mvc로 관리 방치되어 왔음.

한 파일에 수만 라인 넘어가기도….

4.x에서 5.x 업데이트에서 Kotlin, MVVM, Retrofit, API 개선 등의 개편을 진행함

작게 작게 나누는 것을 신경 썼으며 클래스, 메서드, 필드 수가 70%정도 증가함.

정적 분석 결과 지표들이 개선됨.

Kotlin Migration

코틀린 전환 후 라인 줄어들고 대신에 품질 고민의 시간을 가질 수 있었음.

Android Studio의 Converting 기능, Plugin, Json 및 Parcelable, Nullable 등의 마이그레이션 진행함.

마이그레이션시 이슈로는 서비스 onStartCommand 등에서 intent가 null 인 경우 발생.

Cursor 반환시 등에도 발생하는 경우가 생김.

AAC

벅스에는 UI담당팀이 따로 있어 로직 분리가 필요하였고, JetPack에서 제공하는 MVVM 사용

데이터바인딩

뷰 의존성 제거 및 findViewbyId 등의 반복코드 제거 등

Observable 객체들 사용 등

바인딩 클래스 내부에서 데이터 셋팅함.

이슈로 RecyclerView 등에서 복잡한 아이템 레이아웃에서 frame drop이 발생함

일반적으로 안드로이드 단말에서는 초당 60프레임을 위해 16ms마다 Draw 함.

데이터바인딩의 ExecutePendingBindings 호출하거나 LifeCycleOwner 지정으로 해결

뷰를 gone 처리시 깜빡거림 이슈 발생

visibility 속성을 ObservableBoolean 처리시 발생했으며, 프레임 드랍 현상에 대한 처리를 하고 xml에 초기값 설정 defalu= 식으로 추가하여 수정함.

Paging

끊김없는 스크롤 구현 가능해짐.

오류처리 등이 변경됨

리스트의 아이템뷰는 뷰홀더에서 뷰모델을 설정함

트랙뷰가 다양하여 공통뷰를 Base로 뽑아냄.

AAC ViewModel

라이프싸일클 동안 뷰와 관련된 데이터 관리

다크모드 등에서 유용했음.

LifecycleOwner, Lifecycle, LifecycleObserver

옵저버에 LifecycleObserver 상속받아 처리함

미디어 앱 아키텍처

벅스뮤직: 정산로그,재생방식 등 복잡한 비지니스 로직

다양한 UI 제공함

기존 Stub으로 받던 부분이 미디어컨트롤러 콜백으로 변경됨

서비스의 실행시점 클라이언트가 아닌 서비스 스스로 실행.

백그라운드 실행 제한, 안스9 이상에서 실행제한 탐지 API 제공

Notification이나 Lock Screen 파편화 대응

PAYCO 매거진 서버 Kotlin 적용기

키워드 : 백엔드, 언어

소개 : 서버 사이드에서도 Spring 5를 통해 공식적으로 지원이 시작된 후,

Spring을 이용한 많은 서비스가 Java를 대신하여 Kotlin을 적용하고 있습니다.

본 세션에서는 PAYCO 매거진 프로젝트에 Kotlin을 적용했던 경험과 시행착오를 나누어 보려 합니다.

페이코 매거진 서비스

페이코 매거진은 위의 기술들을 사용 중이며, Java만 Kotlin으로 바뀜.

스프링 진영도 코틀린 전환이 점점 늘어나고 있음

코틀린 선택의 이유들

Migration

간단한 테스트코드부터 점진적으로 전환해 감

데이터클래스 등에서 getter/setter 등과 toString() 등의 편의성이 제공됨.

자바는 boxing 된 타입과 primitive 타입이 있음.

코틀린은 boxing된 타입임.

자바는 Integer 타입을 널로 설정 후 integer에 대입시 런타임서 에러남.

코틀린은 컴파일시 에러 발생.

Kotlin decompile기능으로 마이그레이션시 도움이 됨

Migration - Plan

코드 자동 변환시 Lombok은 커버 안됨.

private 변수가 프로퍼티 자체에 적용되어 문제가 됨.

위와 같은 처리라 그러함.

코틀린에서는 프로퍼티가 있어 롬복은 불필요하다 보고 제거하게 됨.

의존성 삽입을 위한 애노테이션 안먹음

@Autowired 등

이 경우 Nullable 선언이 필요하나 lateinit으로 처리함. 그리고 final의 의미로 val 로 선언함.

@RequestParam의 required 속성을 true 등으로 하면 Nullable 이 됨. 물음표 떼기.

static 키워드는 companion object 사용

변수는 const, 메서드는 jvmstatic 사용

리팩토링

if else는 when으로 변경.

IDE에서 자동 변환은 안되어서 alt+enter 단축키 활용

스프링 5.0의 model을 코틀린 확장함수로 사용

성능

빌드 타임 및 응답시간 차이는 크게 없었음

Sonarqube 로 라인 수는 6프로, 글자수 10프로 정도 줄어듬.

구문, 순환 반복도 12프로 정도 감소.

생각보다 차이는 작아보이나 import 등 반복은 대거 줄어들었고 마이그레이션시 개선사항들이 추가된 것을 고려하여 좋아진 걸로 생각함.

문법이 간결해지고 함수형 프로그래밍을 고려한 collection 등 효율성이 좋아짐.

 

'IT > 행사' 카테고리의 다른 글

[행사] Droid Knights 2024  (0) 2024.06.26
[행사] Naver Tech Concert Day-2 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-1 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 06  (1) 2019.01.14
[행사] Naver Tech Concert Day-2 05  (0) 2019.01.14

Naver Tech Concert Day-2

개요

  • 행사명 : Naver Tech Concert

  • URL : http://techcon.naver.com/

  • 일정 : DAY 1- 2018년 11월 1일(목) 10:00 - 17:30

    DAY 2- 2018년 11월 2일(금) 10:00 - 17:30

  • 장소 : 정자동 네이버 그린팩토리 본사 2층 CONNECT HALL

  • 일정 :

    • 11월 1일(목) D AY 1
      09:30 ~ 09:55   참가 등록
      10:00 ~ 10:10   인사말
      10:10 ~ 11:10   Android DataBinding (기초에서 고급까지) 
      11:10 ~ 12:10   MVVM with Grab architecture 
      12:10 ~ 13:30   점심시간 (별도 제공은 없습니다.) 
      13:30 ~ 14:30   디자인 1도 모르는 개발자, UX디자인 시작하기
      14:30 ~ 15:30   Material Design의 철학과 적용 사례
      15:30 ~ 16:30   Android Kotlin을 통한 개발 전략 
      16:30 ~ 17:30   Obfuscation 101: 난독화, 프로가드, R8, 트랜스포머 API
      17:30   마무리
  • 11월 2일(금) DAY 2
       09:30 ~ 09:55  참가 등록
       10:00 ~ 11:00  변화의 시대: 안드로이드 앱 어떻게 개발할 것인가?
       11:00 ~ 12:00  Efficient and Testable MVVM pattern(with using AAC, Rx, Koin)
       12:00 ~ 13:30  점심시간 (별도 제공은 없습니다.)
       13:30 ~ 14:30  내가 사랑한 개발자들
       14:30 ~ 15:30  안드로이드 웹뷰의 모든것 
       15:30 ~ 16:30  안드로이드에서 코루틴은 어떻게 적용할 수 있을까?
       16:30 ~ 17:30  자동화, 계륵에 살 붙이기
       17:30  마무리 

현장


전리품


01. 변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?

  • 발표자 : 신동길 (NAVER / 네이버앱개발)

  • 동영상 : https://tv.naver.com/v/4635525/list/272653

  • 슬라이드 : https://www.slideshare.net/NaverEngineering/21-121507374

  • 세션설명 : 변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가? 안드로이드는 끊임없는 OS 버전 뿐만아니라 개발 언어, 구조, GUI등 많은 부분에서 다양항 변화가 시도되고 있습니다. 많은 방법론과 라이브러리가 제공되다보니 어떤 전략과 기준으로 개발해야하는지 혼돈스러울 때가 많습니다. 네이버 앱의 개편에 적용한 기술 사례와 방법론을 통해서 효율적인 앱 개발애 대해서 얘기하고자 합니다.

네이버 앱을 개편하면서 고민한 것들에 대한 이야기들.

  • 무엇이 변했는가?
    • Hardware, Platform, 프레임워크, 자바, FP vs OP
  • 앱의 구조.
    • Activity, Intent, Ui Navigation, Event Dispatching, 멀티프로세스
  • Design Architecture 적용
  • Multi Package
  • 다양한 Framework의 활용

02. Efficient and Testable MVVM pattern

Koin으로 DI를 하고 AAC, Rx를 조합한 MVVM 패턴 소개

  • Android 코드 아키텍쳐
    • why/what/how MVVM
  • Koin
  • Android MVVM, Koin, Rx 적용 예
  • Spek + LiveData를 활용한 Test
  • 기타 Tips

03. 내가 사랑했던 개발자들 : 더 나은 협업을 위한 디자이너, 기획자 이해하기

디자이너, 기획자의 일과 생각들 그리고 협업에 대해서 소개.

  • 디자이너, 기획자의 역할
    • UI, 인터렉션, BX, Graphic, UX 디자이너/기획자
  • 디자이너, 기획자의 생각
    • px에 민감한 이유, UX적 해결방법
  • 협업 및 커뮤니케이션에 대한 고민
  • 디자인에 필요한 것들

04. 안드로이드 웹뷰의 모든것

웹뷰의 역사 및 동작 원리에 대한 설명.

  • 안드로이드 웹뷰 소개 및 역사 그리고 파편화
    • 크롬과 크로미움
  • 크로미움은 어떻게 동작하는지
  • 안드로이드 크로미움은 어떻게 동작하는지
    • 웨일, 크롬과의 차이 등

05. 안드로이드에서 코루틴은 어떻게 적용할 수 있을까? : 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?

코루틴 적용 및 ReactiveX(RxJava)와 비교

  • Kotlin coroutines 소개
    • Kotlin coroutines vs RxJava
  • Kotlin coroutines 기능들
  • blocking, non-blocking, CoroutineScope, GlobalScope, suspend, Job
  • Android에서의 활용
    • 클릭 이벤트 처리시 Kotlin coroutines vs RxJava

06. 자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test

자동화 테스트 툴 제작 내용 및 후기.

  • UI 자동화 테스트 제작 히스토리
  • 자동화 라이브러리 소개
    • Appium 사용하여 제작한 라이브러리 사용 예제 등
  • Event Checker 소개
    • 자동화 테스트시 단말 이벤트에 대한 로그 수집용
  • Resource Monitoring 소개
    • 테스트시 리소스 상태 모니터링용


'IT > 행사' 카테고리의 다른 글

[행사] Droid Knights 2024  (0) 2024.06.26
[행사] 2019 NHN Forward  (3) 2019.11.27
[행사] Naver Tech Concert Day-1 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 06  (1) 2019.01.14
[행사] Naver Tech Concert Day-2 05  (0) 2019.01.14

Naver Tech Concert Day-1

개요

  • 행사명 : Naver Tech Concert

  • URL : http://techcon.naver.com/

  • 일정 : DAY 1- 2018년 11월 1일(목) 10:00 - 17:30

    DAY 2- 2018년 11월 2일(금) 10:00 - 17:30

  • 장소 : 정자동 네이버 그린팩토리 본사 2층 CONNECT HALL

  • 일정 :

    • 11월 1일(목) D AY 1
      09:30 ~ 09:55   참가 등록
      10:00 ~ 10:10   인사말
      10:10 ~ 11:10   Android DataBinding (기초에서 고급까지) 
      11:10 ~ 12:10   MVVM with Grab architecture 
      12:10 ~ 13:30   점심시간 (별도 제공은 없습니다.) 
      13:30 ~ 14:30   디자인 1도 모르는 개발자, UX디자인 시작하기
      14:30 ~ 15:30   Material Design의 철학과 적용 사례
      15:30 ~ 16:30   Android Kotlin을 통한 개발 전략 
      16:30 ~ 17:30   Obfuscation 101: 난독화, 프로가드, R8, 트랜스포머 API
      17:30   마무리
  • 11월 2일(금) DAY 2
       09:30 ~ 09:55  참가 등록
       10:00 ~ 11:00  변화의 시대: 안드로이드 앱 어떻게 개발할 것인가?
       11:00 ~ 12:00  Efficient and Testable MVVM pattern(with using AAC, Rx, Koin)
       12:00 ~ 13:30  점심시간 (별도 제공은 없습니다.)
       13:30 ~ 14:30  내가 사랑한 개발자들
       14:30 ~ 15:30  안드로이드 웹뷰의 모든것 
       15:30 ~ 16:30  안드로이드에서 코루틴은 어떻게 적용할 수 있을까?
       16:30 ~ 17:30  자동화, 계륵에 살 붙이기
       17:30  마무리 

현장


전리품


01. 인사말


02. Android DataBinding (기초에서 고급까지)

PRISM Live Studio 앱에서 데이터바인딩을 전면적으로 사용 후 데이터바인딩의 사용방법에 대한 회고

  • 안드로이드 앱에서 DataBinding 셋팅

  • xml에서의 Setter

  • BindingAdapter

  • Observable

  • BindingMethod

  • Set Method

  • Two-way Binding

  • include와 ViewStub에서의 데이터 바인딩

  • Q & A


03. MVVM with Grab Architecture

  • 발표자 : 정승욱 (Grab / 안드로이드 개발)
  • 동영상 : https://tv.naver.com/v/4637223
  • 슬라이드 : https://www.slideshare.net/NaverEngineering/12mvvm-grab-architecture-mvvm
  • 세션설명 : 구글이 Android Architecture Component 의 ViewModel 을 발표하면서 다양한 시각의 MVVM 구현이 제시되고 있습니다. 여전히 많은 사람들이 혼동하는 MVVM 구현에 대해 올바른 안드로이드 MVVM 구현을 공유하고자 합니다. 이를 위해 안드로이드에서 어떠한 기본 작업이 선행되어야 하는지, 다양한 문제 상황에 대한 해결책에 대해 알아보고 MVVM 이 Grab 에서 어떻게 활용되고 있는지 알아보겠습니다.

안드로이드 MVVM의 올바른 구현과 그랩에서 사용하고 있는 아키텍처 소개.

  • 국내 안드로이드 MVVM의 이해의 일반적인 오해 및 올바른 이해
  • 안드로이드 MVVM에서 DataBinding 적용시 문제점들 및 그랩의 해결방안
  • 그랩의 협업을 위한 아키텍처 (MVVM + 단일 액티비티 with Node)
  • Q & A

04. 디자인 1도 모르는 개발자, UX디자인 시작하기

  • 발표자 : 최유리 (N Tech Service / NTS UX디자인실 설계&콘텐츠운영디자인)
  • 동영상 : https://tv.naver.com/v/4646101/list/272653
  • 슬라이드 : https://www.slideshare.net/NaverEngineering/13-1-ux-ux-121402323
  • 세션설명 : 통계에 따르면 2018년 1분기에는 앱스토어에 약 220만개, 구글플레이에 약 380만개의 앱이 등록되어 있다. 이 치열한 경쟁속에서 사용자에게 오래도록 사랑받는 앱이 되려면 UX디자인은 선택이 아닌 필수다. UX디자인은 디자이너만의 영역이 아닌 개발팀 모두가 함께 만들어내야하는 가치이다. UX디자인에 관심을 갖고 참여한 개발자가 서비스 성공에 어떤 역할을 해 내는지 알아보자.

개발자의 UX 디자인 참여의 필요성과 실제사례 후기

  • UX 디자인이란?
  • UX 디자인에 참여함으로 얻을 수 있는 것들
  • UX 디자인시 고려해야 하는 것들

05. Material Design의 철학과 적용 사례

구글 머티리얼 디자인의 과거와 현재

  • 머티리얼 디자인의 히스토리
  • 새로운 머티리얼 디자인
  • 머티리얼 파운데이션
  • 머티리얼 디자인 가이드 라인
  • 안드로이드에서 머티리얼 디자인 컴포넌트 사용하기

06. Android Kotlin을 통한 개발 전략

  • 발표자 : 신동길 (네이버 / 네이버앱개발)
  • 동영상 : https://tv.naver.com/v/4655590/list/272653
  • 슬라이드 : https://www.slideshare.net/NaverEngineering/15android-kotlin
  • 세션설명 : 코틀린을 안드로이드에 적용하기 위해서는 안드로이드에 맞는 모듈의 개발, 거버넌스, 코딩 패턴, 디자인 패턴 등의 전략적 고려 사항이 필요합니다. 네이버앱에 코틀린을 적용한 경험을 토대로, 기존 프로젝트(또는 신규 프로젝트)에 코틀린을 적용할 때 반드시 고려해야 할 사항과 적용하면서 나온 사례를 통해서 최적화된 적용 방법을 공유합니다.

네이버의 코틀린 개발 전략 사례

  • 네이버의 코틀린 적용 경험담
  • 자바와 코틀린의 차이. 코틀린에서도 DSL 사용시 차이.
  • 코틀린의 기술들
  • 자바를 코틀린의 변환시 참고사항
  • 코드 효율화를 위한 툴킷 정의와 활용
  • 팀 공동 개발을 위한 거버넌스
  • Q & A

07. Obfuscation 101: 난독화, 프로가드, R8, 트랜스포머 API

  • 발표자 : 김용욱 (카카오뱅크)
  • 동영상 : https://tv.naver.com/v/4655623/list/272653
  • 슬라이드 : https://www.slideshare.net/NaverEngineering/16obfuscation-101-r8-api
  • 세션설명 : 안드로이드의 앱들은 현재 프로 가드를 통해서 보호되고 있고 향후로는 구글이 작성한 R8으로 대체할 예정에 있다. 난독화 도구들을 써봤지만 막연히 쓰는 경우가 많은데 난독화 도구가 어떤 일을 하고 있고 기본적인 메커니즘이 어떻게 구현되어있는지 프로가드, R8은 무엇인지, 그리고 안드로이드 빌드 과정에 어떻게 통합되는지를 살펴보는 시간을 갖는다.

안드로이드 코드/컴파일러 특징 및 빌드 과정

  • 안드로이드 코드의 특징
  • 자바와 달빅 바이트 코드 소개
  • Transform API 소개
  • 동적 컴파일러 동작 소개
  • 난독화 및 앱 보호에 대한 이론
  • ProGuard와 R8의 역할


'IT > 행사' 카테고리의 다른 글

[행사] 2019 NHN Forward  (3) 2019.11.27
[행사] Naver Tech Concert Day-2 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 06  (1) 2019.01.14
[행사] Naver Tech Concert Day-2 05  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 04  (0) 2019.01.14

Naver Tech Concert Day-2

06. 자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test

  1. UI Automation Test
  2. Automation Library
  3. Android Event Checker
  4. Resource Monitoring

UI Automation Test

사용자의 테스트 동작 중 화면상의 마우스 동작, 키보드 입력 등을 자동화 수행이 가능한 script 형태로 변환하여 이후 동일한 형태로 Replay 함으로써 Regression Test 를 지원하는 테스트 자동화 방식

  • 단순하고 반복적인 테스트
  • 유지보수 기간 길어질수록 Test Case도 많아짐
  • Side-effect 확인을 위한 회귀 테스트 (작은 수정에도 전체 확인이 가능)

N Tech Service에서의 히스토리

  • Calabash, ADB, Sikuri, Appium, BDD 방식을 활용한 자동화 사례
  • Uiautomator Stub 활용한 멀티 디바이스 제어 자동화 사례
  • WebKuli(NTS 자체 제작) 적용사례

자동화 결과는 좋지 않았음.

이슈를 실제 검출하는 경우도 적고 프로젝트 유지가 오래된 케이스도 저었음.

  • 기대에 미치치 못하는 Test Coverage
  • Tool 이해도 부족
  • 자동화 구현 및 유지보수 공수 상승 (리소스 절감을 위해 도입했다 더 리소스가 투입된 경우도 있음)
  • 정보 공유 부족

Automation Library

표준화 및 규칙화를 위해 라이브러리 제작.

제작 당시 안드로이드 프레임워크 비교 후 Appium을 선택함.

public class TestClass {
    public AppiumDriver<WebElement> driver;
    
    @BeforeClass
    public void setup() throws Exceptiom {
        // 플랫폼, 단말기 정보,테스트 타켓 패키지 정보
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        capabilities.setCapability(MobileCapabilityType.UDID, "UDID");
        capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "platform-version");
        capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UIAutomator2");
        capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "package");
        capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "launchable-activity");
        
        // 안드로이드 드라이버 형성
        driver = new AppiumDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    }
    
    @Test
    public void scenario_01() {
        // 동작 제어
        driver.findElement(By.id("tv_home_weekly_schedule_title")).click();
    }
    
    @Test
    public void scenario_02() {
        // 동작 제어
        driver.findElement(By.xpaht("//*[@text='요일별 연재']")).isDisplayed();
    }
    
    @AfterClass
    public void quit() {
        driver.quit();
    }
}

라이브러리 제작 전 고려사항

  • 자동화 테스트 환경 Setting (환경 일원화)
  • 자동화 구현 패턴 표준화 (스크립트 작성에 대한 표준화)
  • Appium Client API의 사용성 (가독성 높이고 타이밍 이슈에 대한 부분 커스텀마이징 추가)
  • 객관적 지표 산출

구성

  • Appium Server Builder
  • Appium Client Utilities
  • Report
public class TestClass extends Formatter {
    public AndroidUtil android;
    
    @BeforeClass
    public void setup() {
        android = (AndroidUtil) new Automation()
            .android()
            .mobileApp()
            .apkFile("apkPath")
            .packageName("Package_Name")
            .activityName("Activity_Name")
            .logLevel("loglevel")
            .start());            
    }
    
    @Test
    public void scenario_01() {
        android.click(By.id("tv_home_weekly_schedule_title"));
    }
    
    @Test
    public void scenario_02() {
        android.isElelmentPresent(By.xpath("//*[@text='요일별 연재']"));
    }
    
    @AfterClass
    public void quit() {
        android.quit();
    }
}

위처럼 커스텀하여 사용하며 운영도 실제 진행함.

UI 자동화 테스트 자체적으로 발생하는 이슈들 생김

  • UI Assertion 대한 신뢰성
    • 음악 스트리밍 앱에서 재생 중인지?
    • Audio Focus는 가져왔는지?
  • 자동화 시나리오 진행 중 안정성 문제
    • 자동화 테스트 중 Interrupt (SMS, Call 등)
    • 알 수 없는 간헐적 Fail Result

Android Event Checker

Event Checker

  • Log 출력 방식
  • Monitoring Start/Stop
  • Event Log

구조

  • Service
  • Command
  • Broadcast Receiver
  • Sensor : 기울기 센서를 이용하여 orientation 전환 확인
  • Audio Focus, Audio Manager : Audio Focus 선점 및 Audio 재생 확인
  • Notification Listener : Application Notification 정보 수집

약 30개 Event, 80개 Log

위와 같이 UI만 확인하던 UI 테스트에 기능적인 부분도 추가함.

Resource Monitoring

  • 동일 스텝
  • 동일 시간
  • 반복적

rMon Mobile Version

  • Battery 소모량
  • CPU 사용률
  • Memory 사용량
  • 발생 Traffic

rMon을 이용하여 앱을 켜둔 상태에서 테스트하며 성능 리포트를 남기게 함.

(Android 5.1.1 이후 사용 불가. rMon이 CPU나 Memory를 앱의 pid에 접근해야해서 불가됨.)

rMon PC Version

Android 5.1.1 이후 대응을 위해 PC 버전으로 adb 기반으로 제작.

  • ADB를 활용한 Resource 측정 방식
  • Android Application의 소모 CPU, Memory, Traffic 측정
  • Android 단말기 내부에 rMon 명령어 추가
  • ADB > rMon 명령어 호출하여 리소스 데이터 수집

Android Automation Test

  • GitLab으로 Automation Test Project 관리
  • CI 서버를 통해 Daily Build 수행 (서버 이슈, 컨텐츠 이슈, 로그인/댓글 같은 부분 배포로 인한 이슈 확인 용. 출근 후 확인)

Maver Repository -> Coding -> Code Respository -> CI 서버 -> Target Device -> Result Report

nMobile

https://solution.navercorp.com/nmobile/

모바일 기기 원격 제어 솔루션

  • 화면 제어, 디버깅 등
  • Real Time에 가까운 응답속도
  • 실제 단말과 동일한 사용감 제공

nMobile 자동화 연동시 장점

  • 가상 단말 아닌 리얼 디바이스 대상 수행 가능
  • 다양한 단말 보유 (버전 별, 제조사 별, 국가 별)
  • ADB 연결 가능 / 다양한 API 지원
  • 물리적인 연결 없이 접근 가능 / 사용 용이성

PC Browser & iOS

nMobile Android 단말과 실제 iOS 단말, PC 크롬에서 채팅 네이버 카페 채팅방 테스트 가능

  • Step1 nMobile Android 단말기 실행 및 연결
  • Step2 nMobile Android 단말에서 Cafe 앱 실행
  • Step3 실제 iOS 단말에서 Cafe 앱 실행
  • Step4 PC에서 Chrome 실행 및 Cafe 홈페이지 진입
  • Step5 PC웹 및 Android/iOS 앱에서 테스트 대상 카페 진입
  • Step6 PC웹 및 Android/iOS 앱에서 테스트 대상 카페 채팅방 진입
  • Step7 각 플랫폼에서 채팅 입력 후 다른 플랫폼에서 전송된 채팅 확인 및 답장
  • Step8 연결 종료

Result

  • Library를 이용한 안정적인 자동화 프로젝트 생성
  • 외부 인터럽트 및 기능 Assertion에 대한 단점 보완
  • 자동화 특성 반영 Resource Monitoring

Q & A

Q : 네이버는 자동화 테스트와 QA 인력들의 수동 테스트 둘다 진행하는지?

A : 둘 다 진행함. 자동화 테스트를 한다고 비용이 절감되지 않고 증대되는 듯. 사람과 자동화와 서로 교차 테스트 됨으로 해결되는 부분들이 잇음.

Q : 라이브러리 제작 시간은?

A : 2016년도 제작하면서 각자 QA 담당하면서 시간 쪼개서 만든 것임. 제작에 전적으로 시간 투자하면 빨리 가능할 듯.

Q : Appium이 iOS도 지원하지만 앱 내부 구조가 다를텐데 따로 스크립트를 작성하는지?

A : 동일한 기능에도 따로 작성함. iOS는 아직은 자동화 테스트 구현에 어려움이 있음.

Q : 자동화된 UI 테스트가 라이브 서비스의 패포 파이프라인에 포함이 되어 테스트 통과가 되어야 배포가 되는것인지?

A : 그렇지 않음. 개발자들이 유닛 테스트들을 별도로 따로 작성 후 확인하고, 자동화 테스트는 QA에서만 사용.

Q : nMobile은 리얼 디바이스처럼 와이파이 환경일때나 모바일 네트워크 환경일 때, 또는 유심이 들어있는 상황에서만 할 수 있는 상황도 연출이 가능한지?

A : 그런 상황들도 테스트 가능함.

Q : CI/CD는 어떻게 하는지?

A : CI 서버는 따로 두고 젠킨스로 있음.

Q : 자동화 테스트 툴을 오픈할 계획이 있는지?

A : 아직 오픈되진 않았음.

Q : 테스트 시나리오 작성시 사용자 행위로 서버에 변경되어 저장될 수 있는 케이스는 어떻게 처리하는지?

A : 서버까지는 확인이 불가하며, 노출되는 텍스트 등으로 확인 정도까지만.

Q : QA에 개발 인력도 소속되어 별도의 자동화를 위한 개발이 이루어지는 것인지?

A : 따로 개발인력이 있지 않음. 몇몇의 QA 인력들이 모여 만듬.

Q : 실제 기능 구현 개발자는 자동화 테스트 코드를 작성하지 않는지?

A : 직접 작성하는 개발자도 있지만 많이는 없는 듯. 시간이 많이 들기 때문에.

Q : 리소스가 부족한 소규모 사업장, 1인 개발자 들이 UI 자동화 테스트에 접근하려 할 때 좋은 방법은?

A : Appium을 직접 커스텀하여 만들었지만 이를 커스텀화한 서비스들이 이미 있음. 그걸 이용하면 좋을 듯.

Q : Jira 같은 서비스를 이용해서 각각의 이슈를 만드는지? 별도의 QA 시트를 만들어서 빨리 전달하는지?

A : 지라를 이용하여 이슈 공유함. 깃헙을 사용하기도 함. 개발자와 협의해서 사용함. 별도의 QA 시트도 작성하고 테스트케이스도 작성하여 진척도를 메일로 공유하는 등 같이 사용함.

Q : 국가 변경 등 보통 개발자 옵션 페이지 등으로 접근하는 경우도 범용적으로 사용 가능한 노하우가 있는지?

A : 개발서버에서 테스트하기 때문에 특정 언어를 바꾸거나, nMobile에서 제공하는 다른나라 단말 등을 사용함.

Naver Tech Concert Day-2

05. 안드로이드에서 코루틴은 어떻게 적용할 수 있을까? : 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?

  • 발표자 : 권태환 (요기요 / 안드로이드 개발)

  • 동영상 : https://tv.naver.com/v/4635469/list/272653

  • 슬라이드 : https://www.slideshare.net/NaverEngineering/25-121499000

  • 세션설명 : 1.3에 정식으로 포함될 코루틴! 안드로이드에서 코루틴의 적용은 어떻게 할 수 있으며, ReactiveX(RxJava/RxKotlin)과 비교 한다면 좋은점과 부족한 점, 그리고 실무 프로젝트에 적용한 코루틴을 소개해본다.

  • 목차 :

    1. 코루틴 소개(서브루틴과 코루틴)
    
    2. 코루틴을 통해 할 수 있는것?
    
    3. 코틀린 코루틴에서 제공하는 주요 기능들
    
    4. 실제 업무에 적용한 코루틴 소개
    
    5. 코루틴 써보니? RxJava와 비교
    

코루틴 적용 및 ReactiveX(RxJava)와 비교

Kotlin coroutines

coroutines이란?

Subroutine의 사전적 의미 : 평소 사용하는 함수, 메서드 등.

subroutine의 return이 불러지기 전까진 다음 라인을 실행하지 않음.

private fun MutableList<Int>.sum(): Int = this.sumBy{ it }  // sum이 끝나야 return

@Test
fun test() {
    val sum = (0..10).toMutableList().sum()
    println(sum)	// sum이 끝나야 println
}

Coroutines : 1958년 어셈블리에서 언급되었고, 1963년 논문을 통해 설명됨.

코틀린 뿐만 아니라 파이썬, C#에서도 지원함.

  • Entry point 여러 개 허용하는 subroutine (쉽게 쓰레드라 생각하면 됨.)
  • 언제든 일시 정지하고 다시 실행 가능
  • event loops, iterators, 무한 리스트, 파이프 같은 것을 구현하는데 적합

private suspend fun Int.countDown(currentIndex: Int) {
    for(index in this downTo 1) { //countdown from 10 to 1
        tv_message.test = "Now index $currentIndex Countdown $index"	// update text
        delay(200)
    }
    Log.i("TEMP", "Now index $currentIndex Done!")
}

var currentIndex = 0
fab.onClick {
    CoroutineScope(Dispatchers.Main).launch {
        10.countDown(++currentIndex)
    }
}

suspend라는 키워드를 넣어야 코루틴으로 동작되고 delay(기존 Thread.sleep과는 다름)를 사용함.

코루틴에서는 CPU와 관계를 최소한으로 줄여 루틴마다 스위치가 일어날 때 CPU 영향을 적게 받음.

여러 쓰레드에서 하던 부분을 단일 쓰레드에서 처리할 수 있게 해줌.

Dispatchers.Main 지정으로 여러번 click해도 메인 쓰레드에서 동작함.

Kotlin coroutines vs RxJava

Android onClick - RxJava vs coroutines

kotlin coroutines

var currentIndex = 0
fab.onClick {
    CoroutineScope(Dispatchers.Default).launch {	// 새로운 scope를 생성하고 default로 launch (일반 Work thread)
        val job = launch(Dispatchers.Main) {		// launch를 Main thread로 변경
            10.countDown(++currentIndex)
        }
        job.join()							// join()으로 UI thread 종료하기 전까지 대기
    }
}
private suspend fun Int.countDown(currentIndex: Int) {		// 상위 scope thread에 따름(여기선 UI)
    for(index in this downTo 1) { //countdown from 10 to 1
        tv_message.test = "Now index $currentIndex Countdown $index"	// update text
        delay(200)
    }
    Log.i("TEMP", "Now index $currentIndex Done!")
}

RxJava

private val clickEventSubject = PublishSubject.create<View>()	// onClick 처리를 위한 Subject 생성
private var currentIndex = 0
fab.setOnClickListener {
    clickEventSubject.onNext(it)		// 클릭이 이루어지면 onNext를 호출하며 View를 넘겨줌.
}
clickEventSubject
.throttleFirst(500, TimeUnit.MILLISECONDS)	// 첫 번째만 처리하기 위한 throttleFirst (500ms 이후에 동작하게 함.)
.observeOn(Schedulers.io())					// 스케쥴러를 가지고 io 쓰레드에서 동작하게 함.
.map {
    currentIndex++							// index 증가.
}
.switchMap {									// switch에 2개의 zip을 묶음.
    Observable.zip(Observable.range(0, 10),		// 1 부터 10 출력을 위한 range
                  Observable.interval(200, TimeUnit.MILLISECONDS),	// 200ms interval
                   BiFunction<Int, Long, Int> { range, _ ->
                       10 - range
                   })
}
.observeOn(AndroidSchedulers.mainThread())		// UI thread로 변경하고, 메시지 노출
.subscribe({
    tv_message.text = "Now index $currentIndex Countdown $index"
}, {})

Subject, ObserveOn 등등 10 몇가지를 알아야 이해를 할 수 있음.

Rx는 observeOn 등 몇가지 지정을 하고 subject를 통해야 실행을 함.

Coroutines은 CoroutineScope를 지정하고 launch를 하면 실행이 됨.

suspend는 RxJava 처럼 subscribe가 올 때 처리하고 싶을때 선언하고 사용하면 되고, CoroutineScope 안에서만 호출이 가능함.

RxJava

  • 장점
    • Observable과 Streams
    • 기존 Thread보다 간단한 코드로 처리 (어디선가 callback이 올거라 보고 처리해야 함.)
    • stream을 통해 데이터 처리 용이
    • Thread간 교체가 간단
    • RxJava를 활용한 수 많은 라이브러리 활용 가능 (Retrofit 등등)
      • 예제도 많고 문서도 잘 되어 있음.
  • 단점
    • 용어를 모르면 코드 활용 이유를 알 수 없음
    • 처음 학습 비용이 높음

Kotlin coroutines

  • 장점
    • 함수 형태라 읽기 쉬움
    • light-weight threads
    • 모든 routine 동작을 개발자가 처리 가능
    • 처음 학습 비용이 낮음
  • 단점
    • 아직은 필요한 라이브러리를 구현해서 사용해야 함. (RxView와 같은 라이브러리 개발 필요)
      • 직접 만들 수 있고, 문서도 잘 되어 있음.

Kotlin도 Coroutines 처럼 처음은 쉽지만 그 다음부터 어려워짐.

Kotlin coroutines의 장단점

  • 장점
    • 함수 형태라 읽기 쉬움
    • light-weight threads
    • 모든 routine 동작을 개발자가 처리 가능
  • 단점
    • 아직은 필요한 라이브러리를 구현해서 사용해야 함. (RxView와 같은 라이브러리 개발 필요)

Kotlin coroutines 이 제공하는 것들

Kotlin 1.3과 함께 coroutines 1.0 정식 릴리즈됨.

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'

주의할 점 : 코루틴 0.25버전에서부터 deprecated 되었던 부분들이 1.0에서 다 삭제됨. 릴리즈 문서 참고.

  • Kotlin 다양한 platform 제공

    • Server-side

    • Desktop

    • Mobile Application

  • 다양한 언어에서 제공하던 주요 라이브러리 제공

    • C#, ECMAScript : async/await
    • Go : channels, select
    • C#, Python : generators/yield

Kotlin coroutines guide

Coroutines : https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html

Android Coroutines - codelab : https://codelabs.developers.google.com/codelabs/kotlin-coroutines/index.html

blocking과 no-blocking

@Test
fun test() {
    GlobalScope.launch {
        delay(300L)			// non-blocking
        println("World!")
    }
    pirntln("Hello,")
    Thread.sleep(500L)		// block main thread. UI 쓰레드에서 동작이라 화면이 멈춤
}
  • Thread.sleep() : Thread 처리 전까지 Main Thread가 멈춤. UI 쓰레드에선 최대한 안써야 함.
  • delay : 별도의 coroutine에서 동작하여 멈추지 않고 넘어감.

그래서 runBlocking을 제공함. (아래 두가지 코드는 동일하게 동작함.)

@Test
fun test() {
    CoroutineScope(Dispatchers.Unconfined).launch {
        delay(300L)
        println("World!")
    }
    pirntln("Hello,")
    runBlocking {
        delay(500L)
    }
}
@Test
fun test() = runBlocking {
    CoroutineScope(Dispatchers.Unconfined).launch {
        delay(300L)
        println("World!")
    }
    pirntln("Hello,")    
    delay(500L)
}

runBlocking

  • runBlocking 은 함수의 처리가 끝날때까지 대기
  • delay()를 걸어두면 delay 시간만큼 대기하고 return
    • Android에서 runBlocking을 UI에서 잘못 사용하면 멈추는 현상 발생
  • delay를 이용해 non-blocking을 할 수 있음
  • runBlocking, CoroutineScope, GlobalScope 안에서 동작해야 함

CoroutineScope, GlobalScope

CoroutineScope

  • 가장 기본적인 Scope
  • Thread 형태를 지정(Main, Default, IO 등을 지정)
    • CoroutineScope(Main, Default, IO, ...)
  • launch, async 등을 통해 scope를 실행
  • 중요한 점
    • Activity/Fragment LifeCycle에 따라야 함
      • onDestroy() : cancel하도록 코드 추가
    • CoroutineScope(/* thread type */).launch { } 로 실행
    • launch { }의 return job의 동작을 지정 가능
      • join() : scope 동작이 끝날때까지 대기하며, suspend에서 호출 가능
      • cancel() : 동작을 종료하도록 호출
      • start() : scope가 아직 시작하지 않을 경우 start, scope의 상태를 확인

CoroutineScope의 interface 정의

@Suppress("FunctionName")
public fun CoroutineScope(context: CoroutineContext): CoroutineScope = ContextScope(if (context[Job] != null) context else context + Job())


public interface CoroutineScope {
    @Deprecated(level = DeprecationLevel.HIDDEN, message = "Deprecated in favor of top-level extension property")
    public val isActive: Boolean
    	get() = coroutineContext[Job]?.isActive ?: true
    
    /** Context of this scope. */
    public val coroutineContext: CoroutineContext
}

CoroutineScope 활용 - Delay 대신 job.join()

@Test
fun test() = runBlocking {
    val job = CoroutineScope(Dispatchers.Unconfined).launch {	// 새로운 scope를 생성하고 default로 launch. (Work Thread로 동작함)
        //launch에서 CoroutinScope에서 지정한 default Thread로 사용. (별도 지정 없으면 부모를 따라감)
        delay(300L)
        println("World!")
    }
    pirntln("Hello,")
    // delay(500L) <-- 이 부분은 CoroutineScope에서 네트워크 같은 처리시 의미가 없어짐.
    job.join()		// join()으로 default thread 종료하기 전까지 대기
}

GlobalScope

전역에서 돌아가야할 경우

  • CoroutineScope 상속 받아 구현

  • Demon, Application 등에서 사용

  • Application의 lifetime에 따라 동작하는 scope에서 사용 추천

  • GlobalScope는 Dispatchers.Unconfirned(worker thread) 에서 동작

  • GlobalScope.launch(/* thread type */) { } 로 실행.

    위에서 thread가 이미 지정되어 있어 launch에서 쓰레드 타입을 지정. 기본은 Default임.

GlobalScope API 코드

object GlobalScope : CoroutineScope {
    /**
     * @suppress **Deprecated**: Deprecated in favor of top-level extension property
     */
    @Deprecated(level = DeprecationLevel.HIDDEN, 
                message = "Deprecated in favor of top-level extension property") 
    override val isActive: Boolean
    	get() = true
    
    /**
     * Returns [EmptyCoroutineContext].
     */
    override val coroutineContext: CoroutineContext
    	get() = EmptyCoroutineContext
}

GlobalScope 사용 예

fun ReceiveChannel<Int>.sqrt(): ReceiveChannel<Double> = 
GlobalScope.produce(Dispatchers.Unconfined) {
    for(number in this@sqrt) {
        send(Math.sqrt(number.toDouble()))
    }
}

suspend

  • suspend를 활용하여 함수 분할을 할 수 있음.
  • suspend로 만들어진 함수는 사용하기 전까지는 동작하지 않음.
  • suspend 키워드를 사용하는 함수는 CoroutineScope에서만 사용할 수 있음.

suspend 사용 예

suspend fun CorountineScope.loadData(body: suspend CoroutineScope.(item: String) -> Unit) {
    val item = ""
    delay(100L)
    body(item)
}
CoroutineScope(Dispatchers.Main).launch {
    loadData { item ->
        // Coroutine scope 정의
    }
}

Job

  • CoroutineScope의 return에는 job 객체를 넘겨줌.
  • job을 통해 routine의 취소, 실행, 종료를 대기할 수 있음
    • job.cancel() : 종료하도록 유도함.
    • job.join() : 종료를 대기하며 호출은 suspend에서 가능함.
    • job.start() : coroutine의 시작을 확인할 수 잇으며, 시작 상태라면 true

Android onClick 잘 활용하기

연속해서 빠르게 입력하는 경우를 막을 경우

RxJava 버튼 처리

  • 첫 번째 이벤트만 허용하기 위해서

    • throttleFirst 활용

      • 시간으로 first의 시간을 지정하여 문제 발생 외 처리 필요.

        (문제점 : 특정 시간 후에 다음 이벤트가 발생함)

Coroutine으로 처리

  • 첫 번째 이벤트만 허용하기 위해서
    • 버튼의 상태를 변경해서 처리?
  • coroutine에서는 그럴 필요 없음.
  • GlobalScope + actor 활용

Coroutine GlobalScope.actor<T> 활용하기

private fun View.onClick(action: suspend (View) -> Unit) {
    // 5. 이 때 Higher-Order function 정의는 suspend가 포함되어야 함.
    val event = GlobalScope.actor<View>(Dipatchers.Main) { // 1. Singletone의 GlobalScope 활용
        for(event in channel) {						// 2. actor 이용 event 받기
        	action(event) // 4. 받은 event를 Higher-Order function으로 넘겨서 정의하도록 함.
        }
    }
    setOnClickListener {
        event.offer(it)								// 3. actor에 offer로 event 보내기
    }
}
var currentIndex = 0
fab.onClick {
    10.countDown(currentIndex++)				// 6. 람다 표현으로 countDonw 구현
}

Android Coroutines

안드로이드에서 코루틴 활용

  • UnitTest/Main Thread에서 활용하기 쉽게 Dispatchers 하나로 활용
    • UnitTest에서 Main thread를 활용할 수 없기에 기본으로 처리 할 수 있도록 작성
  • CoroutineScope를 Base에 작성하여 release를 쉽게 하도록 처리
  • onClick에 coroutine 활용을 위한 GlobalScope 적용

Dispatchers 정의(UnitTest/Default Thread)

sealed class DispatchersProviderSealed {
    open val main: CoroutineContext by lazy { Dispatchers.Main }
    open val default: CoroutineContext by lazy { Dispatchers.default }
}

/**
 * 기타 Thread를 위한 Dispatchers 정의
 */
object DispatchersProvider: DispatchersProviderSealed()

/**
 * Unit Test를 위한 Dispatchers 정의
 */
// Rx 기준으로 볼때 테스트시 전부 백그라운드 쓰레드로 돌려야할 경우
object TestDispatchersProvider: DispatchersProviderSealed() {
    override val main: CoroutineContext = Dispatchers.Unconfined
    override val default: CoroutineContext = Dispatchers.Unconfined
}

CoroutineScope를 상속받아 구현

abstract class CoroutineScopeActivity: AppCompatActivity(), CoroutineScope {
    private val job: Job = Job()	// Job을 미리 생성하여 CoroutineContext에 미리 지정할 수 있음
    
    override val coroutineContext: CoroutineContext	// Activity에서 사용할 기본 Context를 정의
    	get() = Dispatchers.Main + job
    
    override fun onDestroy() {
        super.onDestroy()
        job.cancel()				// onDestroy()에서 job을 종료하도록 함
    }
}
  • CoroutineScope를 상속받아 구현하면 기본 CoroutineScope로 정의되어 있음.
    • launch, actor<E> 를 사용하면 코드 간결 및 자동으로 종료 처리해 줌.
    • Default 상위 Activity에서 정의한 CoroutineScope의 Thread를 활용함.
    • 필요시 launch, actor에서 Thread를 언제든 변경 가능함.
  • 다양한 CoroutineScope 구현
    • ViewModel
    • LifeCycleObservable
    • Fragment

CoroutineScope 상속받은 Activity에서 routine 사용하기

abstract class CoroutineScopeActivity: CoroutineScopeActivity() {
    launch {
        // UI Thread에서 처리
    }
    launch(Dispatchers.Default) {
        // Default Thread에서 처리
    }
    actor<Generic Type> {
        // UI Thread에서 event 처리
        for(event in channel) action(event)
    }
    actor<Generic Type>(Dispatchers.Default) {
        // Default Thread에서 처리
        for(event in channel) action(event)
    }
}

onClick 처리

  • Higher-Order function + kotlin Extensions을 활용.
  • GlobalScope을 활용하거나, CoroutineScope을 활용 가능.
    • 동작 범위에 따라서 GlobalScope, CoroutineScope을 선택함이 좋음.

onClick 만들기, background에서 처리하고, UI에 던져주기

class CoroutinesSendChannelOnClickEvent<E>(
    private val view: View,							// View: click을 위한 View
    private val bgBody: suspend (item: View) -> E,	// background : Higher-Order Function
    private val dispatcherProvider: DispatchersProviderSealed = DispatchersProvider,	// Provider : 지정
    private val job: Job? = null) {					// Job : 종료 처리를 위한 job 추가
    
    fun consumeEach(uiBody: (item: E) -> Unit): CoroutinesSendChannelOnClickEvent<E> {
        val clickActor = CoroutineScope(dispatcherProvider.main + (job ?: EmptyCoroutineContext)).actor<View> {
            this.channel.map(context = dispatcherProvider.default, transform = bgBody).consumeEach(uiBody)
        }
        view.setOnClickListener { clickActor.offer(it) }	// Offer 처리를 위한 CoroutineScope 생성
        return this
    }
}
fun <E> View.onClick(dispatcherProvider: DispatchersProviderSealed = DispatchersProvider,
                     job: Job? = null, bgBody: suspend (item: View) -> E): CoroutinesSendChannelOnClickEvent<E> =
CoroutinesSendChannelOnClickEvent(this, bgBody, dispatcherProvider, job)

infix fun <E> CoroutinesSendChannelOnClickEvent<E>.consume(uiBody: (item: E) -> Unit) {	// 생성을 간단하게 하기 위한 function 2개
    this.consumeEach(uiBody)
}
fab.onClick(job = job) {		// click을 처리하고, background에서 loadnetwork()
    loadNetwork()
} consume {
    tv_message.text = it
}

private suspend fun loadNetwork(): String {		// Temp load network
    delay(300)
    return "currentIndex ${currentIndex++}"
}

Retrofit2 kotlin coroutines adapter

  • JakeWharton 배포

  • Dependency 추가

    • implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
  • Deferred<E>를 활용하여 return을 처리할 수 있음.

    interface RetrofitService {
        @GET("/posts")
        fun getPosts(): Deferred<Response<List<Post>>>
    }
    // 초기화시키는 코드
    object RetrofitFactory {
        const val BASE_URL = “https://url"
        
        fun makeRetrofitService(): RetrofitService {
            return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .build().create(RetrofitService::class.java)
        } 
    }
    // 사용하는 코드
    launch {
        val request = service.getPosts() 
        val response = request.await() 
        if (response.isSuccessful) { 
            // Pass in the response.body() to your adapter 
        } else {
            toast("Error ${response.code()}") 
        }
    }

Q & A

Q : Dispatcher.Unconfined는 부모 코루틴 컨텍스트에서 코루틴을 실행하고 제일 처음 suspend 함수 이후에는 해당 suspend에서 사용했던 쓰레드에서 동작하는 걸로 알고 있음. 예제에서 Unconfined를 쓰셨던데 안드로이드에서 활용 가능한 부분이 있는지?

A : 테스트 코드에서 활용하기 위해 넣은 거임. UI Thread(Main Thread)에서 활용하기 위해 넣어야 함.

Q : Rx를 안쓰고 Coroutine 기반 라이브러리들로 코드 베이스를 변화시키거나 변화시킬 계획인지?

A : Coroutine을 조금씩 적용할 예정이며 Retrofit을 사용하기 위해 새로 팔 예정임. onClick에 먼저 적용 중.

Q : 코루틴이 rx java의 operator 기능들의 유연함을 못따라간다고 들었는데 어떤지?

A : 유연함을 못따라가는 것은 맞음. 아직 라이브러리들이 없음. 기본적인 틀만 제공 중인 상태.

'IT > 행사' 카테고리의 다른 글

[행사] Naver Tech Concert Day-1 요약  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 06  (1) 2019.01.14
[행사] Naver Tech Concert Day-2 04  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 03  (0) 2019.01.14
[행사] Naver Tech Concert Day-2 02  (0) 2019.01.14

+ Recent posts