요구사항
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 도 제공합니다.
- application.properties에 token을 적어줍니다. (oauth = mytoken)
- path에 application.properties 경로를 적어줍니다.
- 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 |