Spring Boot 기반 GitHub Apps OAuth 로그인 및 레포지토리 분석 백엔드 API
- GitHub OAuth 로그인 (GitHub Apps)
- GitHub 토큰을 이용한 실시간 레포지토리 목록 조회
- 선택한 레포지토리 정보를 AI 서버로 전송하여 보고서 생성
- JWT 기반 인증 시스템
- Framework: Spring Boot 3.5.7
- Language: Java 21
- Database: MySQL
- Security: Spring Security + OAuth2 + JWT
- Build Tool: Gradle
.env.example을 복사하여 .env 파일을 생성하고 실제 값을 입력하세요:
# Database Configuration
DB_USERNAME=root
DB_PASSWORD=your_password
# GitHub OAuth Configuration
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
# JWT Configuration
JWT_SECRET=your-secret-key-for-jwt-token-generation
# AI Server Configuration
AI_SERVER_URL=http://localhost:8000- GitHub에서 OAuth App 생성: https://github.com/settings/developers
- Authorization callback URL:
http://localhost:8080/login/oauth2/code/github - Client ID와 Client Secret을 환경변수에 설정
CREATE DATABASE gitfit CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 의존성 설치 및 빌드
./gradlew build
# 애플리케이션 실행
./gradlew bootRun서버는 기본적으로 http://localhost:8080에서 실행됩니다.
GET /oauth2/authorization/github
프론트엔드에서 이 URL로 리다이렉트하면 GitHub 로그인 페이지로 이동합니다.
GET /api/auth/github/callback
GitHub OAuth 인증 후 자동으로 호출되며, JWT 토큰을 반환합니다.
응답 예시:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "Bearer",
"userId": 1,
"username": "johndoe",
"email": "john@example.com",
"avatarUrl": "https://avatars.githubusercontent.com/..."
}POST /api/auth/github/token
요청 본문:
{
"accessToken": "github_access_token"
}GET /api/auth/me
Authorization: Bearer {token}
GET /api/repositories
Authorization: Bearer {token}
GitHub 토큰으로 실시간 레포지토리 목록을 조회합니다.
응답 예시:
[
{
"id": 123456789,
"name": "my-project",
"fullName": "johndoe/my-project",
"description": "프로젝트 설명",
"htmlUrl": "https://github.com/johndoe/my-project",
"cloneUrl": "https://github.com/johndoe/my-project.git",
"defaultBranch": "main",
"language": "Java",
"stargazersCount": 10,
"forksCount": 5,
"private": false
}
]GET /api/repositories/{owner}/{repo}
Authorization: Bearer {token}
POST /api/reports/generate
Authorization: Bearer {token}
선택한 레포지토리의 정보와 GitHub 토큰을 AI 서버로 전송하여 보고서를 생성합니다.
요청 본문:
{
"repositoryId": 123456789,
"repositoryName": "my-project",
"repositoryFullName": "johndoe/my-project",
"defaultBranch": "main"
}AI 서버로 다음 데이터가 전송됩니다:
repositoryId: 레포지토리 IDrepositoryName: 레포지토리 이름repositoryFullName: 레포지토리 전체 이름defaultBranch: 기본 브랜치githubToken: 사용자의 GitHub 액세스 토큰userId: 사용자 ID
src/main/java/com/example/gitfitbe/
├── config/ # 설정 클래스
│ ├── JwtUtil.java
│ ├── JwtAuthenticationFilter.java
│ ├── SecurityConfig.java
│ └── WebClientConfig.java
├── controller/ # 컨트롤러
│ ├── AuthController.java
│ ├── RepositoryController.java
│ └── ReportController.java
├── dto/ # 데이터 전송 객체
│ ├── AuthResponse.java
│ ├── GitHubRepository.java
│ ├── GitHubUserInfo.java
│ └── ReportRequest.java
├── entity/ # 엔티티
│ └── User.java
├── exception/ # 예외 처리
│ └── GlobalExceptionHandler.java
├── repository/ # 데이터 접근
│ └── UserRepository.java
└── service/ # 비즈니스 로직
├── AuthService.java
├── GitHubService.java
└── AIReportService.java
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
github_id VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(255) NOT NULL,
email VARCHAR(255),
avatar_url VARCHAR(500),
access_token TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP
);- JWT 토큰은 24시간 후 만료됩니다
- GitHub 액세스 토큰은 데이터베이스에 암호화되지 않은 상태로 저장됩니다 (프로덕션에서는 암호화 권장)
- CORS는
http://localhost:3000과http://localhost:5173만 허용됩니다
MIT License