ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GitHub API로 스터디 참석률을 구하는 프로그램 만들기
    프로젝트 2021. 2. 9. 23:19

    whitdship study 4주차에 참가하면서 Github API를 사용해 스터디 참여율을 계산하는 과제를 진행했다.

    GitHub API를 사용하면서 최대한 Javadoc 그리고 Github 공식문서만 참고하여 개발하고자 노력했다. 이유는 간단하다 현재 구글신이 존재하지만 항상 의존할 수는 없다는 것과 이렇게하면 조금이라도 성장하지 않을까 생각해서 답답한 방법으로 진행했다. 

     

    프로젝트 코드를 보기전에 다음을 잠깐 살펴보자 간단한 예제코드가 있다.

    github-api.kohsuke.org

     

     

    GitHub API for Java –

    What is this? This library defines an object oriented representation of the GitHub API. By "object oriented" we mean there are classes that correspond to the domain model of GitHub (such as GHUser and GHRepository), operations that act on them as defined a

    github-api.kohsuke.org

    다음으로 개발할때 이글을 참조해서 메서드, 클레스마다 기능을 살펴보고 개발을 진행하면 좋겠다.

    github-api.kohsuke.org/apidocs/org/kohsuke/github/package-summary.html

     

    org.kohsuke.github (GitHub API for Java 1.119 API)

    A Issue has been assigned, unassigned, labeled, unlabeled, opened, edited, milestoned, demilestoned, closed, or reopened.

    github-api.kohsuke.org

     


    , 본격적으로 시작하자 참고로 본 글에서 java를 이용하여 개발하였다.

    1. java에서 maven으로 github_api의존성 받아오기.

    2. Personal Access Token으로 자신의 레포지토리 얻어오기.

    3. 레포지토리에 존재하는 이슈를 가져오기

    4. 각각의 이슈를 가지고 온 후에 comment를 작성한 계정 이름 가져오기

    5. 해당 계정이름(Map의 key이름)마다 value를 이용해 참여율 계산하기.


    1. java에서 maven으로 github_api의존성 받아오기.

    mvnrepository.com/artifact/org.kohsuke/github-api

     

    Maven Repository: org.kohsuke » github-api

     

    mvnrepository.com

    위 사이트에서 원하는 버전을 찾고 Maven으로 의존성을 추가하자. 본 글에선 Intellij를 사용하고 있으므로 같은 IDE를 쓰시는 분이라면 다음 그림을 참고하면 좋겠다.

     

    ※GitHub API만 받고 Library에 추가하면 ClassNotFound에러가 난다 그외에 API도 필요하므로 꼭 Maven으로 의존성 추가로 다운받아주자(maven을 이용하면 github api에 사용되는 그외의 api까지 같이 받아옵니다.)

     

    file -> project structre -> libraries -> maven

    org.kohsuke:github-api 검색후 원하는 버전 받기


    2. Personal Access Token으로 자신의 레포지토리 얻어오기.

     GitHub github = new GitHubBuilder().withOAuthToken(Person_Token).build();
            GHRepository ghRepository = github.getRepository("ksj0109188/GithubAPI_TEST");

    person_Token은 github 아이디와 패스워드 대신 토큰을 이용해 접근하는 방법으로 보안측면에서 이 방법이 권장된다.


    3. 레포지토리에 존재하는 이슈를 가져오기

     for (int i = 1; i <= total_issue; i++) 
                issue = ghRepository.getIssue(i);
                comments = issue.getComments();

    접근한 레포지토리에 이슈를 얻어온다. getIssue메서드의 경우 이슈의 인덱스번호를 매개변수로 받는데 첫 이슈는 1부터 시작한다.

    후에 issue의 getComments 메소드를 통해 해당 이슈에 등록된 comments를 작성한 계정에 대한 정보를 얻어온다. -> 해당 메소드는List<GHIssueComment>형식으로 리스트를 반환한다. 


    4. 각각의 이슈를 가지고 온 후에 comment를 작성한 계정 이름 가져오기

     

    
            for (int i = 1; i <= total_issue; i++) {
                issue = ghRepository.getIssue(i);
                comments = issue.getComments();
                System.out.println(issue.getTitle() + "참가자 목록");
                for (int j = 0; j < comments.size(); j++) {
                    ghIssueComment = comments.get(j);
                    String name = ghIssueComment.getUser().getLogin();
                    if (map.get(name) != null) {
                        count = map.get(name);
                        map.put(name, ++count);
                    } else {
                        map.put(name, 1);
                    }
                    System.out.println(name);
                }
                System.out.println("-------------------------------------------");

    이슈마다 존재하는 comments글에 대한 작성자 정보(계정ID, 이메일, 닉네임 등)을 가져오고, Map에 key값으로 comment를 작성한 아이디를 저장한다. 또한 각 이슈마다 해당 계정이 comment를 작성했으면 스터디에 참여했으므로 map에 존재하는 해당 계정의 value값을 1씩 증가한다.


    5. 해당 계정이름(Map의 key이름)마다 value를 이용해 참여율 계산하기.

      System.out.println("참여율");
            Iterator<String> key_iterator = map.keySet().iterator();
            while (key_iterator.hasNext()) {
                String key_name = key_iterator.next();
                System.out.printf(key_name + "---------->");
                float attendance = map.get(key_name);
                System.out.println(String.format("%.2f", (attendance / total_issue) * 100) + "%");

    Map에 Key값은 comment를 작성한 계정이므로 각 계정마다 참석수(value값)을 반복문을통해 계산한다.


    전체코드

    package com.company;
    
    
    import org.kohsuke.github.*;
    
    import java.io.IOException;
    import java.lang.reflect.Array;
    import java.util.*;
    
    public class Main {
        private static String Person_Token = //이 부분은 Github Personal Token값이므로 개별적으로 생성해주세요.
        private final static int total_issue = 18;
    
        public static void main(String[] args) throws IOException {
    
            GitHub github = new GitHubBuilder().withOAuthToken(Person_Token).build();
            GHRepository ghRepository = github.getRepository("ksj0109188/GithubAPI_TEST");
            GHIssue issue;
            List<GHIssueComment> comments;
            GHIssueComment ghIssueComment;
            int count;
            Map<String, Integer> map = new HashMap<>();
    
            for (int i = 1; i <= total_issue; i++) {
                issue = ghRepository.getIssue(i);
                comments = issue.getComments();
                System.out.println(issue.getTitle() + "참가자 목록");
                for (int j = 0; j < comments.size(); j++) {
                    ghIssueComment = comments.get(j);
                    String name = ghIssueComment.getUser().getLogin();
                    if (map.get(name) != null) {
                        count = map.get(name);
                        map.put(name, ++count);
                    } else {
                        map.put(name, 1);
                    }
                    System.out.println(name);
                }
                System.out.println("-------------------------------------------");
            }
            System.out.println("참여율");
            Iterator<String> key_iterator = map.keySet().iterator();
            while (key_iterator.hasNext()) {
                String key_name = key_iterator.next();
                System.out.printf(key_name + "---------->");
                float attendance = map.get(key_name);
                System.out.println(String.format("%.2f", (attendance / total_issue) * 100) + "%");
            }
        }
    }
    
    

     

    [결과]

    1week참가자 목록
    ksj0109188
    Gimseongjun
    -------------------------------------------
    2weeks참가자 목록
    ksj0109188
    -------------------------------------------
    3weeks참가자 목록
    ksj0109188
    -------------------------------------------
    4weeks참가자 목록
    Gimseongjun
    -------------------------------------------
    5weeks참가자 목록
    -------------------------------------------
    6weeks참가자 목록
    -------------------------------------------
    7weeks참가자 목록
    -------------------------------------------
    8weeks참가자 목록
    -------------------------------------------
    9weeks참가자 목록
    -------------------------------------------
    10weeks참가자 목록
    -------------------------------------------
    11weeks참가자 목록
    -------------------------------------------
    12weeks참가자 목록
    -------------------------------------------
    13weeks참가자 목록
    -------------------------------------------
    14weeks참가자 목록
    -------------------------------------------
    15weeks참가자 목록
    -------------------------------------------
    16weeks참가자 목록
    -------------------------------------------
    17weeks참가자 목록
    -------------------------------------------
    18weeks참가자 목록
    -------------------------------------------
    참여율
    ksj0109188---------->16.67%
    Gimseongjun---------->11.11%

    본 프로젝트에서 사용된 git repository 이슈들

     

Designed by Tistory.