Skip to content

KAU-gitfit/gitfit-spring

Repository files navigation

GitFit Backend

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

환경 설정

1. 환경변수 설정

.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

2. GitHub OAuth App 설정

  1. GitHub에서 OAuth App 생성: https://github.com/settings/developers
  2. Authorization callback URL: http://localhost:8080/login/oauth2/code/github
  3. Client ID와 Client Secret을 환경변수에 설정

3. MySQL 데이터베이스 생성

CREATE DATABASE gitfit CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

실행 방법

빌드 및 실행

# 의존성 설치 및 빌드
./gradlew build

# 애플리케이션 실행
./gradlew bootRun

서버는 기본적으로 http://localhost:8080에서 실행됩니다.

API 엔드포인트

인증 (Authentication)

1. GitHub OAuth 로그인 시작

GET /oauth2/authorization/github

프론트엔드에서 이 URL로 리다이렉트하면 GitHub 로그인 페이지로 이동합니다.

2. GitHub OAuth 콜백

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/..."
}

3. 액세스 토큰으로 직접 로그인 (선택적)

POST /api/auth/github/token

요청 본문:

{
  "accessToken": "github_access_token"
}

4. 현재 사용자 정보

GET /api/auth/me
Authorization: Bearer {token}

레포지토리 (Repositories)

1. 사용자 레포지토리 목록 조회

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
  }
]

2. 특정 레포지토리 조회

GET /api/repositories/{owner}/{repo}
Authorization: Bearer {token}

보고서 (Reports)

보고서 생성 요청

POST /api/reports/generate
Authorization: Bearer {token}

선택한 레포지토리의 정보와 GitHub 토큰을 AI 서버로 전송하여 보고서를 생성합니다.

요청 본문:

{
  "repositoryId": 123456789,
  "repositoryName": "my-project",
  "repositoryFullName": "johndoe/my-project",
  "defaultBranch": "main"
}

AI 서버로 다음 데이터가 전송됩니다:

  • repositoryId: 레포지토리 ID
  • repositoryName: 레포지토리 이름
  • 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

데이터베이스 스키마

users 테이블

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:3000http://localhost:5173만 허용됩니다

라이센스

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors