Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
53495e1
Chore: [Config] 개발 환경 구축(Docker, Nginx 등)
Mangjun Apr 10, 2025
7b1d544
Chore: [Config] 콘솔에 log 나오도록 수정, dotenv 라이브러리 추가
Mangjun Apr 11, 2025
9141dc9
Chore: [Config] 빌드 CI 추가
Mangjun Apr 11, 2025
a1319f1
Chore: [Config] 프로토타입 개발 환경 구축
Mangjun Apr 16, 2025
2fb92dd
Chore: [Config] 프로젝트 구조 설계 및 Entity 설계
Mangjun Apr 16, 2025
6caf084
Add: [Config] AWS S3 연동 추가
Mangjun Apr 28, 2025
b5df6b5
Chore: [Config] http 메시지를 읽기 위한 logbook 라이브러리 추가
Mangjun Apr 28, 2025
9b8e103
Add: [Course] Course API 구현 (자유 러닝 생성, 상세 보기, 반경 내 검색) (#14)
kjunh972 May 21, 2025
afa2d83
[Add] Record : 러닝 기록 API 구현 (저장, 전체 조회, 코스별 조회)
kjunh972 May 21, 2025
0f589ba
Feat: [Config] DDD 기본설정 및 Spring REST Docs 및 OpenAPI 3 문서화 설정 추가 (#16)
kjunh972 Jul 30, 2025
a37d542
Feat [member/Auth]: 카카오 OAuth2 로그인 및 테스트용 회원관리, JWT 인증 시스템 구현 (#17)
kjunh972 Aug 7, 2025
a3ecf1b
Feat: [Course] 코스 관리 API 구현 (#18)
kjunh972 Aug 10, 2025
f0a50da
Feat: [Record] 러닝 기록 조회 API 추가 (#19)
kjunh972 Aug 11, 2025
d4b7979
Feat: [Member] 레디스 설정 및 로그아웃, 회원 탈퇴 api 구현 (#20)
kjunh972 Aug 14, 2025
6e8a95d
Feat: [Crew] 크루 생성 및 관리 api 구현 (#21)
kjunh972 Aug 14, 2025
2b33e51
Feat: [Schedule] 크루 일정 관리 (#22)
kjunh972 Aug 16, 2025
d828b3c
Feat: [Record] 기록 저장 및 조회 추가 (#24)
kjunh972 Aug 16, 2025
1b2e29d
Refactor: [JWT] JWT 기반 크루별 권한 시스템 (#23)
kjunh972 Aug 17, 2025
f12f87b
Feat: [member] 사용자 온도 계산 (#25)
kjunh972 Aug 17, 2025
798665c
Feat: [Crew] 크루 런닝 및 크루/크루원 랭킹 구현 (#26)
kjunh972 Aug 31, 2025
3fb0719
Feat: [Member] 프로필 설정 구현 (#28)
kjunh972 Sep 5, 2025
2d7834c
Feat: [Community] 크루 커뮤니티 기능 구현 (#27)
kjunh972 Sep 5, 2025
4e83215
Fix: [course] 코스 및 기록 수정 및 크루 런닝 삭제 (#29)
kjunh972 Sep 17, 2025
512ef67
Fix: [Community] api 경로 수정 및 런닝 메타 데이터 추가 (#31)
kjunh972 Sep 18, 2025
a805106
Feat: [Crew] 크루 이름으로 크루 검색 api (#32)
kjunh972 Sep 19, 2025
733e2bb
Fix: [Setting] 프로필 수정에 반경 설정 할수 있도록 수정 (#33)
kjunh972 Sep 20, 2025
e519825
Feat: [Notification] 크루 알람 발송 구현 (#35)
kjunh972 Sep 23, 2025
5d0856f
Chore: [Config] Docker 설정
Mangjun Sep 24, 2025
98456e7
Fix: [Config] .env 수정 (#37)
Mangjun Sep 24, 2025
19c1836
Fix: [Config] mysql 환경변수 누락 수정 (#38)
Mangjun Sep 24, 2025
04cd3db
Feat: [Firebase] Firebase 설정 (#39)
kjunh972 Sep 25, 2025
ad64b7f
Feat: [Firebase] Firebase 설정 (#40)
kjunh972 Sep 25, 2025
ecf24b6
Feat: [Firebase] Firebase 설정 (#39) (#41)
kjunh972 Sep 25, 2025
126989f
Feat: [Firebase] Firebase 설정 (#42)
kjunh972 Sep 25, 2025
0f6728c
Fix: [Config] api 문서 생성 (#43)
kjunh972 Sep 25, 2025
760ecba
Fix: [Config] api 문서 생성 (#44)
kjunh972 Sep 25, 2025
36feff3
Fix: [Config] Docker Compose v1 -> v2, https -> http (#45)
Mangjun Sep 25, 2025
1ea4418
Fix: [Config] 테스트 되게 수정 (#46)
kjunh972 Sep 25, 2025
ec55bfe
Fix: [Firebase] Firebase 설정 수정 (#47)
kjunh972 Sep 25, 2025
16ff618
Fix: [Swagger] 스웨거 설정 수정 (#48)
kjunh972 Sep 25, 2025
e19d328
Fix: [Config] Docker Compose Health Check 추가 (#49)
Mangjun Sep 25, 2025
84a1433
Fix: [Swagger] 로그 제거 (#50)
kjunh972 Sep 25, 2025
3533742
fix: [config] kakao 설정 env 누락 추가 (#51)
kjunh972 Sep 25, 2025
420416b
Feat: [Kakao] 카카오 소셜 로그인 로그 오류 수정 (#52)
kjunh972 Sep 25, 2025
4e4f3b7
Fix: [kakao] 디버깅 로그 제거 (#53)
kjunh972 Sep 25, 2025
c5174b1
Feat: [log] 기본 로크 레벨은 info, api 요청/응답은 trace로 출력 (#54)
kjunh972 Sep 26, 2025
890b7b9
Fix: [Config] Docker MySQL 한글 안보이는 버그 및 Spring 서버 80 포트 개방 (#56)
Mangjun Sep 27, 2025
265d113
Fix: [CI/CD] Google Map API 추가 (#57)
Mangjun Sep 27, 2025
280d922
Update: [Config] Docker Compose FastAPI 추가 (#58)
Mangjun Sep 27, 2025
0edc748
Feat: [Community] 커뮤니티 알람 발송 구현 (#60)
kjunh972 Sep 28, 2025
cc354da
Feat: [Difficulty] Google Maps API를 활용한 코스 난이도 자동 계산 기능 구현 (#59)
kjunh972 Sep 29, 2025
3b25457
Feat: [Schedule] 일정 관련 알람 발송 (#61)
kjunh972 Sep 29, 2025
3e857a1
Feat: [Course] 사용자 기록 / 근처 코스에 따라 코스 추천 (#62)
kjunh972 Oct 3, 2025
83ae2be
Fix: [Course] 사용자 설정에 기반한 코스 추천 (#63)
kjunh972 Oct 4, 2025
7e4207c
Feat: [Photo] 이미지 업로드 및 조회 (#64)
kjunh972 Oct 10, 2025
32ecb79
Fix: [Community] 게시물 작성시 사진은 필수, 제목과 내용은 선택으로 수정 및 알람 발송 (#65)
kjunh972 Oct 10, 2025
4b215da
Feat: [Photo] 이미지 조회 오류 수정 (#66)
kjunh972 Oct 10, 2025
cf3cd84
Fix: [Course] 내 코스 수정 및 삭제 (#67)
kjunh972 Oct 12, 2025
050c39d
Feat: [Crew] 크루 랭킹 레디스 도입 및 레디스 오류 수정 (#68)
kjunh972 Oct 12, 2025
95dede1
Fix: [Photo] base/64로 저장 안되게 수정 (#69)
kjunh972 Oct 16, 2025
4d80ad0
Feat: [S3] 이미지 업로드를 s3로 변경 (#70)
kjunh972 Oct 18, 2025
0376d74
update: [File] 파일 의존성 오류 수정 (#72)
kjunh972 Oct 18, 2025
a6aa8ae
update: [File] 파일 생성 오류 수정 (#73)
kjunh972 Oct 18, 2025
7b6b9c7
update: [File] 파일 환경변수 오류 수정 (#74)
kjunh972 Oct 18, 2025
7b2b826
Fix: [db] 디비 시간대 변경 (#75)
kjunh972 Oct 20, 2025
f8228ce
Fix: [FCM] 알람 발송 폴더 및 설정 수정 (#76)
kjunh972 Oct 21, 2025
9639381
Fix: [FCM] 알람 워크플로우 수정 (#77)
kjunh972 Oct 21, 2025
5432bcf
Fix: [FCM] FCM 설정 수정 (#78)
kjunh972 Oct 21, 2025
2c73ad3
Fix: [FCM] FCM config 수정 (#79)
kjunh972 Oct 21, 2025
536de79
Fix: [FCM] project id 추가 (#80)
kjunh972 Oct 22, 2025
78ee82d
Feat: [Record] 기록 삭제 api (#81)
kjunh972 Oct 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
77 changes: 77 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Spring CI

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

jobs:
build:
runs-on: ubuntu-latest

services:
mysql:
image: mysql:8.0
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: runtracker_test
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
options: --health-cmd="mysqladmin ping --silent" --health-interval=10s --health-timeout=5s --health-retries=5

redis:
image: redis:7-alpine
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5

env:
SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/runtracker_test
SPRING_DATASOURCE_USERNAME: testuser
SPRING_DATASOURCE_PASSWORD: testpass
SPRING_JPA_HIBERNATE_DDL_AUTO: update
REDIS_HOST: ${{ secrets.REDIS_HOST }}
REDIS_PORT: ${{ secrets.REDIS_PORT }}
KAKAO_CLIENT_ID: ${{ secrets.KAKAO_CLIENT_ID }}
KAKAO_REDIRECT_URI: ${{ secrets.KAKAO_REDIRECT_URI }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
JWT_ACCESS_TOKEN_EXPIRATION: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRATION }}
JWT_REFRESH_TOKEN_EXPIRATION: ${{ secrets.JWT_REFRESH_TOKEN_EXPIRATION }}
OAUTH2_REDIRECT_URI: ${{ secrets.OAUTH2_REDIRECT_URI }}
AUTH_KEY: ${{ secrets.AUTH_KEY }}
FCM_JSON: ${{ secrets.FCM_JSON }}
Firebase_ID: ${{ secrets.FIREBASE_PROJECT_ID }}
GOOGLE_MAP_API_KEY: ${{ secrets.GOOGLE_MAP_API_KEY }}
SPRING_DOMAIN: ${{ secrets.SPRING_DOMAIN }}
FILE_UPLOAD_DIR: ./uploads
S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
S3_SECRET_KEY: ${{ secrets.S3_SECRET_KEY }}
S3_REGION: ${{ secrets.S3_REGION }}
S3_BUCKET: ${{ secrets.S3_BUCKET }}
S3_BASE_URL: ${{ secrets.S3_BASE_URL }}
FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}

steps:
- name: Checkout source code
uses: actions/checkout@v3

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'

- name: Grant execute permission for Gradle wrapper
run: chmod +x gradlew
working-directory: runtracker

- name: Build with Gradle
run: ./gradlew build
working-directory: runtracker
62 changes: 62 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Deploy to EC2

on:
push:
branches:
- develop

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v5

- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/RunTracker-Server/runtracker

git pull origin develop

echo "SPRING_DATASOURCE_URL=${{ secrets.SPRING_DATASOURCE_URL }}" > .env
echo "MYSQL_ROOT_PASSWORD=${{ secrets.MYSQL_ROOT_PASSWORD }}" >> .env
echo "GOOGLE_MAP_API_KEY=${{secrets.GOOGLE_MAP_API_KEY}}" >> .env
echo "MYSQL_DATABASE=${{ secrets.MYSQL_DATABASE }}" >> .env
echo "MYSQL_USER=${{ secrets.MYSQL_USER }}" >> .env
echo "MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}" >> .env
echo "SPRING_DATASOURCE_USERNAME=${{ secrets.SPRING_DATASOURCE_USERNAME }}" >> .env
echo "SPRING_DATASOURCE_PASSWORD=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" >> .env
echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> .env
echo "JWT_ACCESS_TOKEN_EXPIRATION=${{ secrets.JWT_ACCESS_TOKEN_EXPIRATION }}" >> .env
echo "JWT_REFRESH_TOKEN_EXPIRATION=${{ secrets.JWT_REFRESH_TOKEN_EXPIRATION }}" >> .env
echo "REDIS_HOST=${{ secrets.REDIS_HOST }}" >> .env
echo "REDIS_PORT=${{ secrets.REDIS_PORT }}" >> .env
echo "AUTH_KEY=${{ secrets.AUTH_KEY }}" >> .env
echo "OAUTH2_REDIRECT_URI=${{ secrets.OAUTH2_REDIRECT_URI }}" >> .env
echo "KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}" >> .env
echo "KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}" >> .env
echo "SPRING_DOMAIN=${{ secrets.SPRING_DOMAIN }}" >> .env
echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> .env
echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> .env
echo "S3_REGION=${{ secrets.S3_REGION }}" >> .env
echo "S3_BUCKET=${{ secrets.S3_BUCKET }}" >> .env
echo "S3_BASE_URL=${{ secrets.S3_BASE_URL }}" >> .env
echo "FILE_UPLOAD_DIR=/app/uploads" >> .env
echo "FIREBASE_SERVICE_ACCOUNT_KEY=${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}" >> .env
echo "Firebase_ID=${{ secrets.FIREBASE_PROJECT_ID }}" >> .env

mkdir -p ./src/main/resources/firebase
echo '${{ secrets.FCM_JSON }}' > ./src/main/resources/firebase/${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}

chmod +x ./gradlew

./gradlew build

sudo docker compose up --build -d
sudo docker image prune -f
53 changes: 53 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
.DS_Store

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Setting ###
.env

### Auth ###
certbot/conf
certbot/www

### logs ###
*.log
logs/

### Firebase ###
**/firebase/
runtracker-a30bb-firebase-adminsdk-fbsvc-9479026564.json
3 changes: 3 additions & 0 deletions runtracker-prototype/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/gradlew text eol=lf
*.bat text eol=crlf
*.jar binary
41 changes: 41 additions & 0 deletions runtracker-prototype/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Setting ###
.env
application-local.yml
5 changes: 5 additions & 0 deletions runtracker-prototype/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM openjdk:17-alpine
LABEL authors="Mangjun"
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
55 changes: 55 additions & 0 deletions runtracker-prototype/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.4'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.runtracker-prototype'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'

/* Docs */
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

/* AWS */
implementation platform('software.amazon.awssdk:bom:2.25.16')
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:auth'
implementation 'software.amazon.awssdk:regions'

/* Log */
implementation 'org.zalando:logbook-spring-boot-starter:3.9.0'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
useJUnitPlatform()
}

tasks.withType(JavaCompile).configureEach {
options.compilerArgs << '-parameters'
}
37 changes: 37 additions & 0 deletions runtracker-prototype/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
version: '3.8'

services:
db:
image: mysql:8.0
container_name: runtracker_proto_db
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
networks:
- runtracker_proto_net

app:
build:
context: .
container_name: runtracker_proto_app
ports:
- "8080:8080"
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
networks:
- runtracker_proto_net

volumes:
mysql-data:

networks:
runtracker_proto_net:
driver: bridge
Binary file not shown.
7 changes: 7 additions & 0 deletions runtracker-prototype/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading