프로그래밍Java

[SpringBoot] 프로젝트가 여러개일때, 공통 호출 로직에 대한 프로젝트 분리 및 JAR파일로 의존성 추가 하는 방법 3가지

Spring Boot + Gradle 환경에서
공통 코드를 별도 프로젝트로 분리 → JAR 생성 → 다른 5개 프로젝트에서 의존성으로 추가
하는 가장 일반적이고 안정적인 방법 정리

공통 코드 전용 프로젝트 생성

새로 common-module 같은 프로젝트를 하나 만든다.

common-module
 └ src/main/java/...  (공통 코드)

build.gradle (Kotlin DSL 아닐 때 Groovy 기준)

plugins {
    id 'java'
}

group = 'com.mycompany'
version = '1.0.0'

java {
    sourceCompatibility = '17'
    targetCompatibility = '17'
}

dependencies {
    // 필요한 의존성 추가
}

여기서는 Spring Boot plugin을 쓰지 않는다.
공통 모듈은 Boot JAR이 아니라 Plain JAR 이어야 한다.


JAR 생성

프로젝트 루트에서 실행:

gradlew clean build

그러면 다음에 JAR 파일이 만들어짐:

common-module/build/libs/common-module-1.0.0.jar

기존 5개 프로젝트에서 사용하는 방법 (3가지 방식)


방법 1: 로컬 JAR 직접 추가하기 (가장 간단)

5개 프로젝트 각각 build.gradle 에 아래 추가:

dependencies {
    implementation files('libs/common-module-1.0.0.jar')
}

그리고 libs 폴더에 jar 파일을 넣기만 하면 됨.

project-A/
 └ libs/
     └ common-module-1.0.0.jar

장점: 간단
단점: 버전 관리 어렵고, JAR 업데이트 시 프로젝트마다 복사해야 함


방법 2: Gradle Local Repository(mavenLocal) 활용하기

공통 모듈을 local Maven repository 에 publish하여 사용.

1) common-module/build.gradle 에 publish 설정 추가

apply plugin: 'maven-publish'

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

2) publish 명령 실행

gradlew publishToMavenLocal

→ JAR 파일이 자동으로 로컬 저장소에 배포됨:

C:\Users\내계정\.m2\repository\com\mycompany\common-module\1.0.0\

3) 기존 5개 프로젝트 build.gradle 에 다음 추가

repositories {
    mavenLocal()
}

dependencies {
    implementation 'com.mycompany:common-module:1.0.0'
}

장점: JAR 파일 복사 필요 없음
적당한 규모에서 가장 많이 쓰는 방식
✖ CI/CD 환경에서는 따로 설정 필요


방법 3: 회사 Nexus/Artifactory/Maven Repository 에 배포

기업 환경에서는 대부분 이 방식을 씀.

common-module 에 publishing 설정 후

gradlew publish

그리고 5개 프로젝트에서는:

repositories {
    maven { url 'https://mycompany-nexus/repository/maven-releases/' }
}

dependencies {
    implementation 'com.mycompany:common-module:1.0.0'
}

장점: 배포/버전관리 최고
단점: 사내 Maven 서버가 필요


방법 4: Multi-Module Gradle Project 만들기 (추천 가능)

5개 프로젝트 + common 모듈을 하나의 Gradle 멀티모듈로 구성하는 방법도 있다.

root-project/
  settings.gradle
  common-module/
  project1/
  project2/
  ...

settings.gradle:

include 'common-module'
include 'project1'
include 'project2'
...

각 프로젝트에서:

implementation project(':common-module')

✔ 장점: 공통 모듈 변경 → 전체 프로젝트 즉시 반영
✖ 단점: 모든 프로젝트를 한 repo에서 관리해야 함


주의할 점 / 팁

버전 호환 테스트: 공통 모듈 새 버전 나올 때마다 적어도 하나 이상의 서비스에서 먼저 테스트해보는 브랜치를 두는 게 좋음.

공통 모듈에 너무 많은 것을 넣지 마: 핵심 로직 + 유틸 + 설정 정도가 적당. 너무 비대하면 의존성이 복잡해지고 변경 관리 어려워짐.

스프링 빈 정의 시 패키지 구조 설계 중요: 컴포넌트 스캔 경로를 고려해서 공통 모듈이 서비스 모듈에 제대로 스캔되도록 해야 함.

문서화: 각 공통 API, 유틸, 설정이 어떤 목적으로 있는지 문서화해두면 (코드 주석 + README) 서비스 개발자들이 헷갈리지 않음.


error: Content is protected !!