Git API 자동화 시스템 도입 과정

yeong-min·2025년 1월 6일
0
post-thumbnail

1. 문제 상황

1.1 깃터디 사용자 건의

초기 사용자 20명으로부터 "깃터디의 기능은 좋지만 사용자가 해야할 일이 많다"라고 불편사항을 나타냈다.


1.2 현재 문제 상황

GITUDY 앱 특성 상 사용자들의 자신들의 Github 계정과 우리가 제작한 Github를 이용한 알고리즘 스터디 앱인 GITUDY의 연동이 필요했다. 하지만 현재는 사용자들이 직접 자신의 Github 계정과 GITUDY앱과 연동해줘야하는 상황이다.

1. 스터디 생성할 때의 어려움

  • 스터디를 생성하려면 자신의 깃허브에 레포지토리를 생성하고 그 링크를 깃터디에서 스터디를 생성할 때 수동으로 복사 붙여넣기를 해야 연동이 가능하다.

2. 스터디의 Collaborator로 초대 수락할 때의 어려움

  • 스터디장은 스터디원들에게 자신의 스터디 레포지토리에 수정 권한을 주기 위해서는 Github 브라우저에서 Collaborator를 직접 초대해줘야한다.
  • 스터디원은 스터디장의 초대를 받으면 깃허브 브라우저에서 수동으로 초대 수락을 해야한다

3. Todo 생성할 때의 어려움

  • 깃터디에는 스터디장이 해야할 문제의 정보를 올려주는 Todo라는 것이 있는데 Todo를 깃터디에서 올리고 이것에 대해서 깃허브 브라우저에서 수동으로 Todo에 맞는 폴더를 생성해줘야한다.

이런 고객들의 불편사항을 해결하려면 현재는 수동으로 작업해줘야하는 작업들을 백엔드 단에서 자동화 시킬수 있는 방법이 있을까?



2. 문제 분석 과정

2.1 아이디어 발견 계기

어떻게 자동화시킬 수 있을까? 고민하던 중, 백준허브에 사진에서와 같이 Create a new Private Repository라는 깃허브 레포지토리를 생성할 수 있는 콤보박스가 보였다.

백준 허브도 누군가가 만들어놓은 오픈소스일텐데 레포지토리를 생성하는 API 오픈소스로 있지 않을까?라는 생각을 하게 되었다.

깃허브에 들어가서 백준 허브 오픈소스 코드 내용을 확인해보았다. JavaScript로 되어있었지만 네이버 부스트 캠프에서 깊게 배워봤기 때문에 해석이 가능했다.

예상대로 백준 허브 코드에는 createRepo()라고 레포지토리를 생성하는 외부 API를 요청하는 함수가 있었다.


2.2 Git API 공식 문서

공식문서를 확인해보니 백준 허브에 있던 엔드포인트(user/repos)를 확인하였다.

하지만 권한 문제가 발생했다. 사용자의 GitHub의 레포지토리를 생성 등 높은 권한의 작업을 수행해야하다보니 권한을 설정해줘야하는 문제가 있었다.


2.3 권한 문제를 해결하기 위해 어떤 방식을 적용할까?

[방법 A] : 현재의 방법 : 보안성은 좋지만 사용자가 수동으로 작업해야한다.
설명
1. Commit 관련 조회만 가능하다.
2. Create, Update는 권한이 없어서 사용자가 직접 수동으로 연동을 해줘야한다.

장점

  • Git API를 조회용으로만 사용하고 Update, Delete 등을 안하기 때문에 보안성이 좋다.
  • 자신의 Repository에서 깃터디 관련 Repository를 관리 가능하다.

단점

  • Repository 생성, Repository 초대 등 직접 깃허브를 이용하여 해야 한다.
  • Repository Update, Delete 등 권한이 높은 작업을 Git API로 하지 못하고 수동으로 직접 브라우저에서 해야해서 사용자가 해야할 일이 많다.

[방법 B] : PAT를 사용
설명
1. 사용자가 수동으로 깃허브 브라우저에서 PAT생성한다.
2. 안드로이드에서 입력받고 암호화하여 HTTP 통신한다.
3. 프론트와 서버 사이의 개인키를 공유하여 통신, 저장할 때 암호화하여 저장한다.
문제점
공식문서를 확인해본 결과, Personal Access Token(PAT) 발급 Endpoint는 존재하지 않고 브라우저로 수동으로 해야한다.
해결책
Git API Token을 로그인 할 때 발급받아 데이터베이스에 저장 (Git API Token은 노출되면 안되는 중요한 정보이므로 암호화 필요)

장점

  • 본인 레포지토리에서 깃터디 레포지토리를 관리 가능하다.
  • 레포 생성, 레포에 초대 등 Git API로 인하여 앱 안에서 모든 것을 해결 가능하다.

단점

  • 깃허브 아이디와 비밀번호를 깃터디 서버에서 받아서 암호화해서 저장하고 있는거나 마찬가지라 깃터디에 OAuth2.0 로그인을 사용한 이유가 없다.
  • 사용자가 최초 회원가입 시, Github 브라우저에서 직접 토큰을 입력해 붙여넣기 해야함
  • 아무리 암호화한다해도 암호화된 값을 저장해 놓는 것도 보안상 문제가 크다.

[방법 C] : 현재 방법 + gitudy 공식 계정 하나 파기
설명
1. 사용자가 스터디를 생성하면 Gitudy 공식 계정에 Repository가 자동으로 생성된다.
2. 스터디장이 Todo를 생성하면 자동으로 Gitudy 공식 계정에 Todo 폴더가 생성된다.

장점

  • 보안성이 높아지며 사용자 많이 편리하다.
  • 깃허브 로그인을 필수로 하지 않아도 된다. (어차피 깃터디 공식 GitHub계정 Repository를 이용하기 때문에)

단점

  • Repository 이름이 겹칠확률이 크다. → 해결책 : Repository 생성할 때 {Repository 생성하는 사람의 GitHub_Id-[사용자의 입력값]} 이런식으로 설정하면 중복 방지 가능하다.
  • 사용자 본인의 Repository에서 관리하지 못하고 Gitudy라는 계정 Repository에서 코드가 관리된다.

[방법 D] : OAuth2.0의 access_token 이용하여 인증
설명
1. 로그인 시 GitHub 로그인을 필수로 한다.
2. GitHub 관련 작업 모든 것이 자동화 되어 사용자 입장에서는 모든 것을 자동으로 할 수 있다.

장점

  • Git API를 통해 높은 권한의 Repository작업도 자동화 가능하기 때문에 사용자 입장에서 편하다.
  • 로그인 시 단 한번만 GitHub 로그인을 하면 GitHub와 관련된 모든 작업을 자동화시킬 수 있다.

단점

  • 현재 깃터디는 Kakao, Google, GitHub 로그인이 가능한데 GitHub 로그인을 필수로 만들어줘야한다.
  • Git Token을 레디스에서 또 따로 관리를 해줘야한다.

2-4 [방법 D] 채택 및 적용 계획 수립

방법 A, B, C, D의 장단점을 정리해 긴급 회의에서 팀원들과 회의한 결과 방법 D를 채택하였다.

깃터디에서는 OAuth를 사용하고 있기 때문에 scopepublic_repo or repo 권한을 추가해줘야 POST:/user/repos EndPoint를 사용가능하다.

백준 허브에 코드를 살펴보니 예상대로 Access Token을 요청을 할 때 Scopesrepo권한을 추가하였다.

이제 우리 깃터디 프로젝트에 적용해보자!



3. 프로젝트에 자동화 적용하기

3.1 Git API Token을 Redis에 저장하기

Git API 사용 권한이 생긴 AccessToken을 관리하기 위해서 Redis를 이용했다.

  1. 현재 깃터디의 OAuth2.0 로그인은 Kakao, Google, Github 총 세개의 플랫폼에서 가능하지만 repo 권한을 얻기 위해서 깃허브로만 로그인이 가능하게 만든다.
  2. 로그인 시 github access_token을 redis에 저장한다. (github access_token은 자주 사용되므로 redis 사용해서 캐싱)
  3. GithubApiToken 추가 {key : userId, value : github access_token}
  4. Scope에 repo 권한 설정을 추가한다.

3.2 스터디 생성 자동화

createRepository()메소드이다.

  1. 깃허브 로그인 시, 저장해둔 Git API token을 가져와 GitHub와 연결한 후
  2. 레포지토리를 스프링에서 제공하는 GitHub 라이브러리를 사용하여 Repository를 생성한다.
  3. 스터디원들이 깃허브 브라우저에 커밋을 하면 Webhook으로 우리의 깃터디 앱으로 데이터를 가져오는 로직이 있기 때문에 Webhook URL도 자동으로 등록시켜준다.

createRepository()메소드의 단위 테스트를 실행하면

자동으로 레포지토리가 생긴다!

최종 스터디 생성 로직은 다음 그림과 같다.
네이밍 컨벤션 체크 부분은 깃터디 백엔드 팀원 중 한분이 검증 로직을 도와주셨다.


3.3 Collaborator 초대 및 수락 자동화

문제 해결과정은 PR 링크에 자세하게 설명이 되어있어서 링크로 남긴다.

PR Link
https://github.com/DKU-Dgaja/gitudy/pull/461



4. 결과 및 느낀점

결과 : 사용자가 직접 수동으로 연동하면 10초 이상씩 걸리는 작업들을 Git API 자동화 시스템을 도입하여 2초 이하로 80% 단축시켰다.

느낀점 : 개발자가 힘들어야 사용자가 편하다는 것을 다시한번 느꼈다.

0개의 댓글