[Java] GitHub API를 이용한 대시보드 만들기
Web/Java

[Java] GitHub API를 이용한 대시보드 만들기

 

 

요구사항

 

live-study 대시 보드를 만드는 코드를 작성하세요.

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.

 

 

 

github api 사용환경 세팅

 

1. 깃허브 Token 발급받기

 

깃허브 홈페이지에서 프로필을 클릭하고 setting, 그 다음 Developer settings로 들어가 줍니다.

 

 

 

 

 

 

Personal access tokens 클릭

 

 

 

Generate new token 클릭

 

 

 

내가 알아볼 수 있는 token 이름과 필요한 권한에 체크해주고 맨 아래 Generate token을 클릭해줍니다.

 

 

 

토큰발급완료

 

 

 

 

 

2. dependency 추가

Github api를 이용하기 위한 라이브러리를 추가해주어야 합니다.

dependencies {
    ...
    compile 'org.kohsuke:github-api:1.131'
}

 

 

 

 

 

요구사항에 필요한 Github API

 

GitHubBuilder

github instance를 가져올 수 있는 api입니다.

token을 application.properties에 숨기고 읽어 올 수 있도록 fromPropertyFile 도 제공합니다.

 

 

  1. application.properties에 token을 적어줍니다. (oauth = mytoken)
  2. path에 application.properties 경로를 적어줍니다.
  3. fromPropertyFile에 경로를 넣어주어 github instance를 가져옵니다.
String path = "src/main/resources/application.properties";
GitHub gitHub = GitHubBuilder.fromPropertyFile(path).build();

 

 

getRepository

GitHub instance에서 repository경로를 넣어주면 해당 리포지토리 인스턴스를 가져올 수 있습니다.

GHRepository repository = gitHub.getRepository("whiteship/live-study");

 

 

getIssues(이슈상태)

GHrepository 인스턴스에서 이슈상태를 넣어주면 해당 상태인 이슈들의 인스턴스를 List로 받아올 수 있습니다.

 

이슈상태

  • GHIssueState.ALL
  • GHIssueState.CLOSED
  • GHIssueState.OPEN
List<GHIssue> issues = repository.getIssues(GHIssueState.ALL);

 

 

getComments()

GHIssue 인스턴스에서 getComments로 comments들을 가져올 수 있습니다.

List<GHIssueComment> comments = issue.getComments();

 

 

 

getUser().getName();

가져온 issue의 comment 에서 User 정보와 username을 가져올 수 있습니다.

String userName = comment.getUser().getName();

 

 

 

 

구현

설계

dashboard

type : HashMap

key : String

value : HashSet<Integer>

역할 : username을 key로 하고 issue에 댓글을 달았을 때 해당 issue의 번호를 HashSet에 담습니다.

 

예시)

"동호" : {7, 9, 10, 11, 12, 13, 14, 15, 16, 17}

 

 

table

마크다운의 table문법에 따라서 table을 제작합니다.

 

예시)

|참여자|1주차|2주차|참여율|

|---|---|---|---|

|동호|:white_check_mark:|:white_check_mark:|100%|

 

 

 

 

inputUserData

dashboard 에 데이터를 담습니다.

    private static void inputUserData(List<GHIssue> issues, HashMap<String, HashSet<Integer>> dashboard) throws IOException {
        for (int i = 0; i< issues.size(); i++) {
            System.out.println(i + "...");
            
            GHIssue issue = issues.get(i);
            List<GHIssueComment> comments = issue.getComments();
            for (GHIssueComment comment : comments) {
                String userName = comment.getUser().getName();
                if (dashboard.containsKey(userName)) {
                    dashboard.get(userName).add(i);
                } else {
                    if (userName != null) {
                        dashboard.put(userName, new HashSet<>(Arrays.asList(i)));
                    }
                }
            }
        }
    }

 

 

 

makeTableFrame

마크다운 문법의 table을 만들기위해 Frame을 만들어줍니다.

 

예시)

|참여자 (100)|1주차|2주차|참여율|
|---|---|---|---|

 

 

    private static String makeTableFrame(List<GHIssue> issues, HashMap<String, HashSet<Integer>> dashboard) {
        String table = "|참여자 (" + dashboard.size() + ")|";
        for (int i = 1; i < issues.size() + 1; i++) {
            table += (i + "주차|");
        }
        table += "참여율|\n|";

        for (int i = 0; i < issues.size() + 2; i++) {
            table += "---|";
        }
        table += "\n";
        return table;
    }

 

 

 

makeTable

dashboard에 있는 참여자별로 이슈를 1~18까지 있는지 체크하고, 참여율을 계산하여 table에 정보를 담습니다.

 

예시)

|동호|:white_check_mark:|:white_check_mark:||:white_check_mark:|75%|

|api_dev||||0%|

|dev|:white_check_mark:||||25%|

...

 

    private static String makeTable(List<GHIssue> issues, HashMap<String, HashSet<Integer>> dashboard, String table) {
        for (String userName : dashboard.keySet()) {
            table += "|" + userName + "|";
            HashSet<Integer> weeks = dashboard.get(userName);
            double rate = (weeks.size() / (double) issues.size()) * 100;

            for (int i = issues.size() - 1; i >= 0; i--) {
                if (weeks.remove(i)) {
                    table += ":white_check_mark:|";
                } else {
                    table += "|";
                }
            }
            table += String.format("%.2f%%|\n", rate);
        }
        return table;
    }

 

 

 

main

    public static void main(String[] args) throws IOException {
        String path = "src/main/resources/application.properties";
        GitHub gitHub = GitHubBuilder.fromPropertyFile(path).build();

        GHRepository repository = gitHub.getRepository("whiteship/live-study");

        List<GHIssue> issues = repository.getIssues(GHIssueState.ALL);
        HashMap<String, HashSet<Integer>> dashboard = new HashMap<String, HashSet<Integer>>();

        inputUserData(issues, dashboard);

        String table = makeTableFrame(issues, dashboard);
        table = makeTable(issues, dashboard, table);

        System.out.println(table);

    }

 

 

 

 

소스코드 & 결과

https://github.com/dongho108/java-study/tree/master/src/main/java/javastudy/ch4/assignment1

 

dongho108/java-study

Contribute to dongho108/java-study development by creating an account on GitHub.

github.com

 

'Web > Java' 카테고리의 다른 글

[Java] 클래스  (0) 2021.07.08
[Java] LinkedList, Stack, Queue  (0) 2021.07.07
[Java] JUnit5  (0) 2021.07.05
[Java] 제어문  (0) 2021.07.05
[Java] 연산자  (2) 2021.06.25