SPRING

[SPRING] GitHub API for Java로 전체 커밋 기록 불러오기

혀내 2022. 2. 6. 21:03
반응형


스프링 토이 프로젝트 중에 GitHub API for Java 라는 걸 발견해 간단히 사용 방법을 적어보고자 한다. 구글링해도 자료가 너 ~ 무 없어서 꼬박 이틀을 허비했던 나와 다르게.. 이 글을 읽는 분들은 금방 해내길 바라며 .. 😇

 나는 사진과 같이 GitHub API를 이용해 유저들의 커밋 기록을 불러오고, 출석부 형태로 보여주는 기능을 구현하고 싶었다.

GitHub API for Java

먼저 build.gradle에 GitHub API 라이브러리를 추가하도록 한다. 아래 링크를 통해 라이브러리 다운로드 방법, API 문서를 자세히 확인할 수 있다.

https://github-api.kohsuke.org/

 

GitHub API for Java –

What is this? This library defines an object oriented representation of the GitHub API. By "object oriented" we mean there are classes that correspond to the domain model of GitHub (such as GHUser and GHRepository), operations that act on them as defined a

github-api.kohsuke.org

 

  • build.gradle에 라이브러리 추가
implementation 'org.kohsuke:github-api:1.301'

 

GitHub Token 발급하기

깃허브 API를 사용하려면 먼저 GitHub 사이트에서 토큰을 발급해야 한다.

https://github.com/

 

GitHub: Where the world builds software

GitHub is where over 73 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com


1. 로그인을 하고, Settings > Developer settings 로 이동한다.


2. Personal access tokens 탭에서 'Generate new token'을 클릭한다.


3. 토큰의 만료기간과 권한을 자유롭게 설정해 토큰을 생성한다.


4. 토큰을 통해 GitHub과 연동할 수 있으며, 잃어버리면 다시 발급해야 하니, 꼭 어딘가 보관하도록 한다.

import org.kohsuke.github.*;
import java.io.IOException;

public class GithubApi {
	GitHub github;
    	String token = "ghp_???";
    
    private void connectToGithub(String token) throws IOException {
    	github = new GitHubBuilder().withOAuthToken(token).build();
        github.checkApiUrlValidity(); 
    } 
}

 


GitHub API 사용하기

나는 깃허브 API로 깃허브 사이트에 있는 잔디 커밋 기록을 받아와 출석부에 반영하고 싶었다.


 잔디 커밋 기록을 받아온다는 건 곧 유저의 github ID를 통해서 그 유저가 작성한 모든 커밋 기록을 가져와야한다는 것이다. 근데 구글링을 아무리 해도 1개의 레포지토리 안에서 유저의 커밋 기록을 불러오는 자료만 있을 뿐, 유저의 전체 커밋 기록을 받아오는 방법에 대한 자료는 하나도 없었다.

 API 문서를 보며 이것 저것 시도해본 결과, GHCommitSearchBuilder 를 사용하면 해결이 가능하다. 검색 조건을 설정하면 커밋 기록 검색을 Builder가 대신 도와준다. github ID로 커밋을 검색하고, 최신순으로 정렬해 받아오도록 했다.

 GHCommitSearchBuilder builder = github.searchCommits()
 				.author(userId)
                                .sort(GHCommitSearchBuilder.Sort.AUTHOR_DATE);

 PagedSearchIterable<GHCommit> commits = builder.list().withPageSize(7);


너무 많은 커밋 기록을 읽어올 땐 성능이 떨어져서 페이징 크기를 따로 설정해 주었다.

최종 코드

import org.kohsuke.github.*; 
import java.io.IOException;

public class GithubApi {

    GitHub github;
    String token = "ghp_???";
    
    public PagedIterator<GHCommit> getCommits(String userId) {
    	try {
        	connectToGithub(token); 
        } 
        catch (IOException e) { 
        	throw new IllegalArgumentException("failed to connect gitHub");
        }
        
        GHCommitSearchBuilder builder = github.searchCommits() 
       		.author(userId)
            	.sort(GHCommitSearchBuilder.Sort.AUTHOR_DATE); 
        
        PagedSearchIterable<GHCommit> commits = builder.list().withPageSize(7);
        return commits._iterator(1);
    } 
    
    private void connectToGithub(String token) throws IOException {
    	github = new GitHubBuilder().withOAuthToken(token).build();
        github.checkApiUrlValidity(); 
    }
}
반응형