공부한 내용
GitHub API 사용해 대시보드 만들기
live-study 대시 보드 Requirements https://github.com/whiteship/live-study/issues
•
깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
•
참여율을 계산. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리까지 보여줄 것.
•
Github 자바 라이브러리를 사용하면 좋음.
•
내 전체 코드
•
구현 과정
1.
build.gradle에 아래 코드 추가
implementation 'org.kohsuke:github-api:1.124'
Java
복사
3.
메인 코드
import org.kohsuke.github.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GithubClient {
private static final String token = System.getenv("token");
private static final Logger logger = (Logger) LogManager.getLogger(GithubClient.class);
private GitHub github;
private GHRepository repository;
private List<GHIssue> issues;
private List<GHIssueComment> comments;
private Map<String, Double> userMap = new HashMap<>();
public GithubClient() {
try {
github = new GitHubBuilder().withOAuthToken(token).build();
repository = github.getRepository("whiteship/live-study");
issues = repository.getIssues(GHIssueState.ALL);
for(GHIssue issue: issues) {
System.out.println(issue.getNumber());
comments = issue.getComments();
for(GHIssueComment comment: comments) {
final String login = comment.getUser().getLogin();
System.out.println(login);
userMap.put(login, userMap.getOrDefault(login, 0.0)+1);
}
}
logger.info("Connection Success");
} catch (Exception e) {
logger.info("Connection Failed");
}
}
public void run() {
for(String user : userMap.keySet()) {
final double percent = userMap.get(user) / 18*100;
System.out.printf("%s : %.2f\n", user, percent);
}
}
}
Java
복사
4.
결과
리팩토링 1) 병렬 처리, 증분 연산 통해 실행 시간 2m44s에서 24s로 감소
•
userMap을 ConcurrentHashMap으로 변경하여 동시성 문제를 방지
•
issues 리스트를 병렬 스트림으로 변환하여 병렬 처리하도록 수정
•
issue.getComments()를 issue.listComments().toList()로 변경하여 한 번에 여러 코멘트를 가져오게 수정
•
userMap.put() 대신 userMap.compute()를 사용하여 증분 연산을 수행
import org.kohsuke.github.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class GithubClient {
private static final String token = System.getenv("token"); // GitHub 인증 토큰
private static final Logger logger = LogManager.getLogger(GithubClient.class); // 로그 기록 위한 Logger 객체
private Map<String, Double> userMap = new ConcurrentHashMap<>(); // 사용자별로 댓글 개수를 저장하는 Map 객체
public GithubClient() {
try {
GitHub github = new GitHubBuilder().withOAuthToken(token).build(); // GitHub 인증 토큰으로 GitHub 객체
GHRepository repository = github.getRepository("whiteship/live-study"); // "whiteship/live-study" 리포지토리의 정보
List<GHIssue> issues = repository.getIssues(GHIssueState.ALL); // 모든 이슈 정보
issues.parallelStream().forEach(issue -> { // issues를 병렬 스트림으로 변환해 병렬 처리
try {
List<GHIssueComment> comments = issue.listComments().toList(); // 한 이슈에 달린 모든 댓글 (한 번에 가져옴)
for (GHIssueComment comment : comments) {
String login = comment.getUser().getLogin(); // 댓글 작성자의 로그인 ID를 가져옴
userMap.compute(login, (key, value) -> value == null ? 1.0 : value + 1.0); // 사용자별로 댓글 개수를 증가시킴(증분 연산)
}
} catch (IOException e) {
logger.debug("Failed to fetch comments for issue", e); // 이슈의 댓글 가져오기 실패
}
});
logger.debug("Connection Success"); // 깃허브 연결, 리포지토리 가져오기, 이슈 가져오기 성공
} catch (IOException e) {
logger.debug("Connection Failed", e); // 깃허브 연결, 리포지토리 가져오기, 이슈 가져오기 실패
}
}
public void run() {
for (Map.Entry<String, Double> entry : userMap.entrySet()) {
String user = entry.getKey(); // 사용자 ID
double count = entry.getValue(); // 댓글 개수
double percent = (count / 18) * 100; // 댓글 비율 계산
System.out.printf("%s : %.2f\n", user, percent); // 사용자별 댓글 비율을 출력
}
}
}
Java
복사
하루 정리
TIL 작성하기
자바 스터디 2번 하기