모든 서비스 인스턴스가 공유하는 공통 코드와 라이브러리, 그리고 의존성을 효율적으로 관리하기 위해 별도의 공통 모듈을 개발하여 활용할 수 있습니다.

공통 모듈 소스 설명(동영상)

프로젝트 생성하기

프로젝트 기본 정보 입력

  1. New Project -> Gradle -> Java 선택
  2. GroupId: com.github.<깃허브 ID> (예: com.github.yonggyo1125) GroupId가 꼭 GitHub ID와 일치해야 하는 것은 아니나, 관례에 따라 계정명을 따르는 경우가 많습니다.
  3. ArtifactId: 라이브러리 이름 (예: common)
  4. Java Version: GitHub로 배포(Publish)할 때 발생할 수 있는 Gradle 버전 호환성 문제를 고려하여, 25버전보다는 21 또는 17버전을 선택하는 것이 좋습니다.

설정하기

build.gradle

plugins {
    id 'java-library'  // 프로젝트를 자바 라이브러리로 설정 (api 키워드 사용 가능)
    id 'maven-publish' // 빌드된 아티팩트를 Maven 저장소에 배포하기 위한 플러그인
    id 'org.springframework.boot' version '4.0.4'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.github.yonggyo1125'
version = '0.0.1'

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

bootJar { enabled = false } // 실행 가능한 jar 생성 비활성화 (라이브러리이므로 필요 없음) 
jar {
    enabled = true
    archiveClassifier.set('') // 일반 jar 생성
}

repositories {
    mavenCentral()
    maven { url '<https://repo.spring.io/milestone>' } // 스프링 부트 마일스톤 버전 사용을 위한 저장소
}

ext {
    set('springCloudVersion', "2025.1.1")
}

dependencies {
    api 'org.springframework.boot:spring-boot-starter-validation'
    api 'org.springframework.boot:spring-boot-starter-data-jpa'
    api 'org.springframework.boot:spring-boot-starter-kafka'
    api 'org.springframework.boot:spring-boot-starter-security'
    api 'org.springframework.boot:spring-boot-starter-webmvc'
    api 'org.springframework.cloud:spring-cloud-starter-config'
    api 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
    api 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    api 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
    api 'org.springframework.cloud:spring-cloud-starter-openfeign'

    api "org.springframework.boot:spring-boot-starter-aop:4.0.0-M2"
    api "io.github.resilience4j:resilience4j-spring-boot3:2.2.0"
    api 'io.github.resilience4j:resilience4j-circuitbreaker'
    api 'io.github.resilience4j:resilience4j-retry'

    api 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.2'

    api "com.github.danielwegener:logback-kafka-appender:0.2.0-RC2"
    api 'net.logstash.logback:logstash-logback-encoder:7.4'

    api 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
    annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

publishing {
    publications { 
        gpr(MavenPublication) {
            from components.java
            artifactId = 'common'
        }
    }
    repositories {
        maven {
            name = "GitHubPackages" // 저장소 별칭
            url = uri("<https://maven.pkg.github.com/yonggyo1125/spartahub-common>") // GitHub Packages 저장소 주소
            credentials {
                username = System.getenv("GPR_USER") // 환경 변수에서 GitHub 사용자 ID
                password = System.getenv("GPR_TOKEN") // 환경 변수에서 GitHub Personal Access Token(Classic) 로드
            }
        }
    }
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

// QueryDSL Q클래스 생성 경로 설정 
def querydslDir = layout.buildDirectory.dir("querydsl").get().asFile

sourceSets {
	main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
	options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
	file(querydslDir).deleteDir()
}

org.springframework.boot.autoconfigure.AutoConfiguration.imports

resources/META-INF/spring경로에 파일 생성

image.png

공통 모듈의 빈(Bean)은 수동으로 등록하며, 이를 설정하기 위한 구성 클래스는 다음과 같이 정의합니다.