Search
🍀

Github API 사용해 대시보드 만들기

작성일자
2023/06/24
태그
DIARY_DEVELOP
프로젝트
책 종류
1 more property

공부한 내용

GitHub API 사용해 대시보드 만들기

live-study 대시 보드 Requirements https://github.com/whiteship/live-study/issues
깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
참여율을 계산. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리까지 보여줄 것.
Github 자바 라이브러리를 사용하면 좋음.
내 전체 코드
github-insights
ChooSeoyeon
GitHub API란
정의) GitHub가 제공하는 다양한 정보와 기능을 개발자의 응용 프로그램에서 사용할 수 있도록 제공하는 GitHub의 인터페이스
특징) 해당 라이브러리에는 GHUser(깃허브유저)GHRepository(깃허브리포지토리),GHOrganization(깃허브그룹) 등 깃허브에서 사용되는 각각의 도메인 모델들을 제어하기 위한 클래스가 존재하며, 각 클래스의 메서드를 통해서 깃허브 사이트에서 사용할 수 있는 다양한 기능을 프로그램 내에서 사용할 수 있다.
구현 과정
1.
build.gradle에 아래 코드 추가
implementation 'org.kohsuke:github-api:1.124'
Java
복사
2.
토큰 발급 & 저장
깃허브 접속을 위한 아래와 같은 방법들이 있는데 나는 두 번째 방법 사용함
환경변수로 토큰 저장
IntelliJ에서 환경 변수 설정
화면 오른쪽 상단에 뜨는 현재 실행할 클래스 이름을 오른쪽 클릭해서 구성 편집 선택
환경변수 오른쪽 끝에 네모 박스 클릭
사용자 환경변수에 + 아이콘 클릭해서 토큰값 저장
String token = System.getenv("token"); 처럼 사용할 수 있음
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번 하기