과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
- 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
- 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
- Github 자바 라이브러리를 사용하면 편리합니다.
- 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.
github api 가져오기
maven dependency로 가져왔습니다.
Github 자바 라이브러리에서 GitHub객체를 가져옵니다
1. 아이디와 패스워드를 입력하는 방식 (not recommended)
2. 개인 토큰을 이용해 연결하는 방식
토큰을 이용해서 가져와 봅시다.
우선 토큰을 할당 받기위해선 깃허브에서 세팅을 들어갑니다.
토큰 할당
우선 테스팅용으로 제 Repository에 이슈를 생성하고 테스트 해봅시다.
comments.get(j).getUser().getName()으로해서 null값 나왔던 건 안 비밀
이제 이슈별로 코멘트 중복처리 하고 출석률을 구해봅시다.
comments.get().getUser()로 받아오는 객체인 GHPerson에 내장된 getLogin값은 잘 나오는데 getName값이 Null이 나와서 그 이유를 찾고자 Github APi에서 GHPerson 클래스를 보니
protected synchronized void populate() throws IOException {
if (super.getCreatedAt() != null) {
return; // already populated
}
if (root == null || root.isOffline()) {
return; // cannot populate, will have to live with what we have
}
URL url = getUrl();
if (url != null) {
root.createRequest().setRawUrlPath(url.toString()).fetchInto(this);
}
}
...
public String getName() throws IOException {
populate();
return name;
}
...
public String getLogin() {
return login;
}
이 부분을 설정하지 않아서 null이 나왔던 것이다.
이와 같이 설정하지 않은 사람도 있을 수 있기 때문에 getLogin 메서드로 출석률을 구하는 것이 맞다고 생각한다.
package com.studyolle;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.kohsuke.github.GHIssue;
import org.kohsuke.github.GHIssueComment;
import org.kohsuke.github.GHIssueState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;
import org.kohsuke.github.GitHubBuilder;
public class Main {
//personal token need to secret
private static final String MY_PERSONAL_TOKEN = "tokenValue";
public static void main(String[] args) throws IOException {
GitHub github = new GitHubBuilder().withOAuthToken(MY_PERSONAL_TOKEN).build();
//Repository 연결
GHRepository ghRepository = github.getRepository("whiteship/live-study");
// 리스트로 이슈 객체 전부 받아오기
List<GHIssue> issues = ghRepository.getIssues(GHIssueState.ALL);
Map<String, Integer> Attendance = new HashMap<>();
//1-18개 이슈
// 이슈에서 참가자
for (GHIssue issue : issues) {
Set<String> attendOnce = new HashSet<>();
//댓글 한개 이상 단 경우 유저이름 중복 제거
for (GHIssueComment comment : issue.getComments()) {
attendOnce.add(comment.getUser().getLogin());
}
//카운트 증가해주기
for (String loginId : attendOnce) {
if(Attendance.containsKey(loginId)){
Attendance.replace(loginId ,Attendance.get(loginId)+1);
continue;
}
Attendance.put(loginId, 1);
}
}
BufferedWriter bufferdWriter = new BufferedWriter(new OutputStreamWriter(System.out));
//참여율 출력
for(String loginId : Attendance.keySet()){
double rate = (double)(Attendance.get(loginId) * 100) / issues.size();
bufferdWriter.write("loginId : " + loginId);
bufferdWriter.write(", 출석률 : " + String.format("%.2f",rate)+"%");
bufferdWriter.newLine();
}
bufferdWriter.close();
}
}
이 분의 코드를 가져다 사용했습니다.
www.notion.so/Live-Study-4-ca77be1de7674a73b473bf92abc4226a
참조
docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token
www.notion.so/Live-Study-4-ca77be1de7674a73b473bf92abc4226a
github.com/kjw217/whiteship-live-study/blob/master/4th-week/%EC%A0%9C%EC%96%B4%EB%AC%B8.md
blog.naver.com/hsm622/222159930944
'Language > JAVA' 카테고리의 다른 글
jdk15 charAt 분석해보기 (0) | 2021.03.05 |
---|---|
4주차 과제 : LinkedList 구현하기 (0) | 2021.02.25 |
5주차 과제 : 메소드 정의하는 방법 (0) | 2021.02.18 |
5주차 과제 : 클래스 정의하는 방법 (0) | 2021.02.18 |
5주차 과제: 클래스 (0) | 2021.02.17 |