Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
f7c02ac
Chore: Upgrade Gradle LTS, Java, and Spring Boot to address CVEs
CSE-Shaco Jan 8, 2026
88c7881
Refactor: Extract S3 configuration into properties and update env con…
CSE-Shaco Jan 8, 2026
c2df32f
Merge branch 'develop' of github.com:GDGoCINHA/24-2_GDGoC_Server into…
CSE-Shaco Jan 8, 2026
e6c47e5
Merge pull request #270 from CSE-Shaco/develop
CSE-Shaco Jan 8, 2026
9ba085f
Chore: Align Java version across Docker, Gradle, and build configuration
CSE-Shaco Jan 8, 2026
d7b17ab
Merge pull request #271 from CSE-Shaco/develop
CSE-Shaco Jan 8, 2026
faf2d12
Refactor: Update JWT token handling and adjust S3 configuration
CSE-Shaco Jan 8, 2026
0524a2b
Merge pull request #272 from CSE-Shaco/develop
CSE-Shaco Jan 8, 2026
634103c
Chore: local profile env λ³€μˆ˜ 적용
CSE-Shaco Jan 8, 2026
1cf4d6d
Merge pull request #273 from CSE-Shaco/develop
CSE-Shaco Jan 8, 2026
461a3e8
Chore: 둜컬 디버그 κ°€λŠ₯에 λ”°λ₯Έ prod 둜그 λ…ΈμΆœ μ œν•œμ‘°μΉ˜
CSE-Shaco Jan 8, 2026
8a159a2
Merge pull request #274 from CSE-Shaco/develop
CSE-Shaco Jan 8, 2026
11ee30f
Chore: redis λ„μž…μ— λ”°λ₯Έ μ„€μ • μΆ”κ°€
CSE-Shaco Jan 10, 2026
fd5e5c3
Merge pull request #275 from CSE-Shaco/develop
CSE-Shaco Jan 10, 2026
749fb53
feat: add core recruit application workflows
CSE-Shaco Jan 14, 2026
441cdea
feat: add AccessGuard for reusable authorization checks
CSE-Shaco Jan 14, 2026
56c2064
refactor: inject SemesterCalculator instead of env-driven semester
CSE-Shaco Jan 14, 2026
f234af5
feat: add core recruit application workflows
CSE-Shaco Jan 14, 2026
d476cc5
refactor: move recruit member module under dedicated namespace
CSE-Shaco Jan 14, 2026
16698f6
fix: correct AccessGuard SpEL references and expose attendance rules
CSE-Shaco Jan 14, 2026
182eb2b
Merge pull request #276 from CSE-Shaco/develop
CSE-Shaco Jan 14, 2026
a861d2e
google auth
xogh3198 Jan 16, 2026
8501706
google auth update
xogh3198 Jan 16, 2026
84fc0aa
auth update
xogh3198 Jan 16, 2026
b9e18fb
google auth update
xogh3198 Jan 16, 2026
745f449
google auth error update
xogh3198 Jan 16, 2026
ecee881
google auth error update
xogh3198 Jan 16, 2026
bd00b46
google auth update
xogh3198 Jan 16, 2026
97f174f
goolge auth update
xogh3198 Jan 16, 2026
cf8241d
google auth update
xogh3198 Jan 16, 2026
e23d7e7
google auth update
xogh3198 Jan 16, 2026
398bddc
google auth update
xogh3198 Jan 16, 2026
248dcb9
refactor(server): update auth, user, and recruit member domains with …
CSE-Shaco Feb 9, 2026
fdc9eae
Merge pull request #277 from CSE-Shaco/develop
CSE-Shaco Feb 9, 2026
03267d5
fix(backend): sync EnrolledClassification enum with frontend status
CSE-Shaco Feb 10, 2026
fd154b1
Merge pull request #278 from CSE-Shaco/develop
CSE-Shaco Feb 10, 2026
effe683
fix(backend): sync Gender enum with frontend terminology and add PRIV…
CSE-Shaco Feb 10, 2026
f01f160
cleanup(user): remove unused password and salt fields
CSE-Shaco Feb 10, 2026
883d14d
docs(db): add initial database schema SQL
CSE-Shaco Feb 10, 2026
b000b2f
chore(infra): add Redis configuration to GitHub workflows and applica…
CSE-Shaco Feb 10, 2026
20f1011
chore(infra): include Redis service in Docker Compose for dev and prod
CSE-Shaco Feb 10, 2026
e9dfdd3
Merge pull request #279 from CSE-Shaco/develop
CSE-Shaco Feb 10, 2026
4ea4b66
fix(infra): enable Flyway baseline-on-migrate to handle existing data…
CSE-Shaco Feb 10, 2026
9552c9b
Merge pull request #280 from CSE-Shaco/develop
CSE-Shaco Feb 10, 2026
0bbd387
debug(jwt): enhance logging for JWT validation failures
CSE-Shaco Feb 10, 2026
58f3b70
feat(auth): integrate google profile picture and add issuer validation
CSE-Shaco Feb 11, 2026
c4d8cb1
fix(auth): strengthen cookie security and update prod domains
CSE-Shaco Feb 11, 2026
651eda9
feat(recruit): implement duplicate application check and fix date par…
CSE-Shaco Feb 11, 2026
470dc4a
feat(auth): migrate to header-based Bearer token authentication
CSE-Shaco Feb 11, 2026
e6b7546
fix(recruit): unify date format in RecruitMember entity
CSE-Shaco Feb 11, 2026
014bd47
refactor(config): cleanup JPA and SpringDoc configuration to resolve …
CSE-Shaco Feb 11, 2026
1bde7e4
fix(security): update CORS configuration to allow Authorization header
CSE-Shaco Feb 11, 2026
c498cc5
fix(auth): require refresh token for logout and return 400 if missing
CSE-Shaco Feb 11, 2026
35f845a
refactor(config): cleanup springdoc and jpa settings in dev/local pro…
CSE-Shaco Feb 11, 2026
cfb3f41
refactor(config): cleanup springdoc and jpa settings in dev/local pro…
CSE-Shaco Feb 11, 2026
2dbd8fd
Merge pull request #281 from CSE-Shaco/develop
CSE-Shaco Feb 11, 2026
fd7803e
refactor(config): cleanup springdoc and jpa settings in dev/local pro…
CSE-Shaco Feb 11, 2026
1d82af9
Merge pull request #282 from CSE-Shaco/develop
CSE-Shaco Feb 11, 2026
2a748ee
fix(auth): rename access_token to accessToken for consistency
CSE-Shaco Feb 11, 2026
1cb5cfb
Merge pull request #283 from CSE-Shaco/develop
CSE-Shaco Feb 11, 2026
e347e75
fix(recruit): normalize phone numbers by removing hyphens before DB c…
CSE-Shaco Feb 11, 2026
d58a2b1
Merge pull request #284 from CSE-Shaco/develop
CSE-Shaco Feb 11, 2026
5641d87
fix: μ „ν™”λ²ˆν˜Έ 처리
CSE-Shaco Feb 11, 2026
87c5313
Merge pull request #285 from CSE-Shaco/develop
CSE-Shaco Feb 11, 2026
b770337
refactor(recruit-member): remove unused doubleMajor field
CSE-Shaco Feb 12, 2026
ab54132
feat(recruit): align repository queries and add postgres indexes
CSE-Shaco Feb 12, 2026
4f5d49d
chore: commit all remaining backend changes
CSE-Shaco Feb 12, 2026
9e52b01
Merge pull request #286 from CSE-Shaco/develop
CSE-Shaco Feb 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,24 @@ jobs:
build:
runs-on: ubuntu-latest

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

steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
java-version: 21

- uses: gradle/actions/setup-gradle@v3
if: ${{ !env.ACT }}
Expand All @@ -35,7 +46,14 @@ jobs:
gradle-home-cache-cleanup: true

- name: Create dummy .env for CI
run: echo "# ci dummy" > .env
env:
AUDIENCE_SECRET: ${{ secrets.JWT_AUDIENCE }}
run: |
AUDIENCE_VALUE="${AUDIENCE_SECRET:-ci-audience}"
cat > .env <<EOF
# ci dummy
JWT_AUDIENCE=${AUDIENCE_VALUE}
EOF

- name: Gradle build (skip tests)
id: assemble
Expand All @@ -57,6 +75,8 @@ jobs:
SPRING_JPA_DATABASE_PLATFORM: org.hibernate.dialect.H2Dialect
SPRING_JPA_HIBERNATE_DDL_AUTO: create-drop
SPRING_FLYWAY_ENABLED: "false"
SPRING_DATA_REDIS_HOST: localhost
SPRING_DATA_REDIS_PORT: 6379
run: ./gradlew test --no-daemon --stacktrace --info --no-watch-fs | tee test.log

- name: Publish unit-test results (check UI)
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/deploy-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,16 @@ jobs:
DB_NAME_DEV=${{ secrets.DB_NAME_DEV }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST || 'localhost' }}
REDIS_PORT=${{ secrets.REDIS_PORT || '6379' }}
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
GOOGLE_REDIRECT_URI=${{ secrets.GOOGLE_REDIRECT_URI }}
GOOGLE_ISSUER=${{ secrets.GOOGLE_ISSUER }}
SELF_ISSUER=${{ secrets.SELF_ISSUER }}
JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }}
REFRESH_COOKIE_SECURE=${{ secrets.REFRESH_COOKIE_SECURE || 'false' }}
REFRESH_COOKIE_SAME_SITE=${{ secrets.REFRESH_COOKIE_SAME_SITE || 'Lax' }}
REFRESH_COOKIE_DOMAIN=${{ secrets.REFRESH_COOKIE_DOMAIN }}
SECRET_KEY=${{ secrets.SECRET_KEY }}
AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/deploy-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,16 @@ jobs:
DB_NAME=${{ secrets.DB_NAME }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
GOOGLE_REDIRECT_URI=${{ secrets.GOOGLE_REDIRECT_URI }}
GOOGLE_ISSUER=${{ secrets.GOOGLE_ISSUER }}
SELF_ISSUER=${{ secrets.SELF_ISSUER }}
JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }}
REFRESH_COOKIE_SECURE=${{ secrets.REFRESH_COOKIE_SECURE || 'false' }}
REFRESH_COOKIE_SAME_SITE=${{ secrets.REFRESH_COOKIE_SAME_SITE || 'Lax' }}
REFRESH_COOKIE_DOMAIN=${{ secrets.REFRESH_COOKIE_DOMAIN }}
SECRET_KEY=${{ secrets.SECRET_KEY }}
AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1

# --- Build stage ---
FROM gradle:8.11.1-jdk17 AS build
FROM eclipse-temurin:21-jdk AS build
WORKDIR /app

# 루트 ν”„λ‘œμ νŠΈ 전체 볡사
Expand All @@ -18,7 +18,7 @@ RUN ./gradlew clean bootJar -x test --no-daemon
RUN cp "$(ls build/libs/*.jar | head -n 1)" build/libs/app.jar

# --- Runtime stage ---
FROM eclipse-temurin:17-jre
FROM eclipse-temurin:21-jre
WORKDIR /app

COPY --from=build /app/build/libs/app.jar app.jar
Expand Down
99 changes: 67 additions & 32 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,32 +1,52 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.6'
id 'org.springframework.boot' version '3.5.9'
id 'io.spring.dependency-management' version '1.1.7'
id 'com.diffplug.spotless' version '6.25.0'
}

group = 'inha'
version = '0.0.1-SNAPSHOT'

/* ===== Java Toolchain ===== */
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
languageVersion = JavaLanguageVersion.of(21)
}
}

/* ===== Configurations ===== */
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

/* ===== Repositories ===== */
repositories {
mavenCentral()
}

/* ===== Dependencies ===== */
/* ===== Version Pins (ν•„μš”ν•œ κ²ƒλ§Œ) ===== */
ext {
awspringBomVersion = '3.4.2'
springdocVersion = '2.8.15'
flywayVersion = '11.19.0'
postgresVersion = '42.7.3'
hibernateTypes60 = '2.21.1'
dotenvVersion = '5.2.2'
querydslVersion = '6.10.1'
jjwtVersion = '0.13.0'
googleApiClientVersion = '2.6.0'
}

/* ===== Vulnerability Pins (μ •ν™•ν•œ CVE 기반 λŒ€μ‘) ===== */
configurations.configureEach {
resolutionStrategy {
// CVE-2024-47554 λŒ€μ‘ (commons-compress 체인 영ν–₯ β†’ commons-lang3 3.18.0 ν•„μš”)
force 'org.apache.commons:commons-lang3:3.18.0'
// springdoc transitive classgraph 취약점 λŒ€μ‘ λ²„μ „μœΌλ‘œ 상ν–₯
force 'io.github.classgraph:classgraph:4.8.179'
}
}

dependencies {
// --- Spring Boot Starters ---
implementation 'org.springframework.boot:spring-boot-starter-web'
Expand All @@ -35,62 +55,77 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-mail'

// --- DB & JPA Utils ---
implementation 'com.vladmihalcea:hibernate-types-60:2.21.1'
implementation 'org.postgresql:postgresql:42.7.3'
runtimeOnly 'com.h2database:h2' // ν…ŒμŠ€νŠΈ/둜컬용 인메λͺ¨λ¦¬ DB
// --- Swagger / OpenAPI (springdoc) ---
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:${springdocVersion}") {
exclude group: "org.apache.commons", module: "commons-lang3"
}
implementation "org.apache.commons:commons-lang3:3.18.0"

// --- DB & JPA Utils (Boot 관리 버전과 동기화 ν•„μš”) ---
implementation "com.vladmihalcea:hibernate-types-60:${hibernateTypes60}"
implementation "org.postgresql:postgresql:${postgresVersion}"
testRuntimeOnly 'com.h2database:h2' // ν…ŒμŠ€νŠΈ ν™˜κ²½ μ „μš©, 운영 νŒ¨ν‚€μ§€μ—μ„œλŠ” μ œμ™Έ

// --- Cache / Redis ---
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// --- Querydsl (OpenFeign fork) ---
implementation "io.github.openfeign.querydsl:querydsl-jpa:${querydslVersion}"
annotationProcessor "io.github.openfeign.querydsl:querydsl-apt:${querydslVersion}:jakarta"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

// --- QueryDSL ---
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
// Querydsl APT helper APIs (컴파일 νƒ€μž„λ§Œ)
compileOnly 'jakarta.annotation:jakarta.annotation-api'
compileOnly 'jakarta.persistence:jakarta.persistence-api'

// --- JWT (JJWT 0.9.x, λ ˆκ±°μ‹œ νŒ¨ν‚€μ§€) ---
implementation 'io.jsonwebtoken:jjwt:0.9.1'
// --- JWT ---
implementation "io.jsonwebtoken:jjwt-api:${jjwtVersion}"
runtimeOnly "io.jsonwebtoken:jjwt-impl:${jjwtVersion}"
runtimeOnly "io.jsonwebtoken:jjwt-jackson:${jjwtVersion}"

// --- AWS (S3) ---
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3'

// --- Flyway (DB Migration) ---
implementation "org.flywaydb:flyway-core:10.21.0"
implementation "org.flywaydb:flyway-database-postgresql:10.21.0"
// --- Flyway ---
implementation "org.flywaydb:flyway-core:${flywayVersion}"
implementation "org.flywaydb:flyway-database-postgresql:${flywayVersion}"

// --- ν™˜κ²½λ³€μˆ˜(.env) ---
implementation 'io.github.cdimascio:java-dotenv:5.2.2'
implementation "io.github.cdimascio:java-dotenv:${dotenvVersion}"

// --- Lombok ---
compileOnly 'org.projectlombok:lombok'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// --- Test ---
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mockito:mockito-core:5.6.0'
testImplementation 'org.mockito:mockito-junit-jupiter:5.6.0'
testImplementation 'org.assertj:assertj-core:3.24.2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
//Google API Client
implementation "com.google.api-client:google-api-client:${googleApiClientVersion}"
}

dependencyManagement {
imports {
mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:3.1.1"
// ↑ 3.x λŒ€ μ‚¬μš© (ν”„λ‘œμ νŠΈμ— λ§žλŠ” μ΅œμ‹  3.x κ°€λŠ₯)
mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:${awspringBomVersion}"
}
}

/* ===== Tasks ===== */
spotless {
java {
googleJavaFormat('1.22.0')
target 'src/**/*.java'
}
}

// ν…ŒμŠ€νŠΈ: ν”„λ‘œν•„κ³Ό JUnit ν”Œλž«νΌ ν•œ κ³³μ—μ„œ μ„€μ •
tasks.test {
useJUnitPlatform()
systemProperty "spring.profiles.active", "test"
}

// QueryDSL 생성물 경둜 κ³ μ •
tasks.withType(JavaCompile).configureEach {
options.annotationProcessorGeneratedSourcesDirectory = file("build/generated/sources/annotationProcessor/java/main")
options.generatedSourceOutputDirectory.set(file("build/generated/sources/annotationProcessor/java/main"))
}

Loading
Loading