[Spring] 멀티 모듈 의존성 관리(version,yml)

yeonjoo913·2023년 9월 15일
0

Spring

목록 보기
14/19

멀티 모듈 프로젝트를 구성하고 있는데 domain 관련 모듈 구조를 잡던 중 겪었던 이슈를 정리해보고자한다.
domain 모듈에는 DB관련 설정들이 있다. JPA 관련 설정과 Entity 관련 클래스가 해당 모듈에 설정되었다.

개발환경

gradle : 8.2.1
springboot : 3.1.2
java : 17

이전까지 spring2.x를 사용하다 3점대로 업그레이드 해보았는데, 3버전으로 넘어오면서 생긴 변화가 있다.
2버전대에서는 javax를 사용하였지만 , 3버전에서는 jakarta로 변경되었는데 이는 그냥 회사가 변경된것으로 사용하는데 큰 문제는 없었다.

이슈사항

1.domain 모듈에는 springboot 플러그인이 없다. 이 경우 의존성 버전을 명시하지 않을 경우 버전을 알 수 없기때문에 빌드에러가 발생한다.

의존성 에러가 발생한 도메인 모듈의 plugins과 dependencies

plugins {
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

dependencies {
    // JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // JDBC
    api "org.springframework.boot:spring-boot-starter-jdbc"
}
  • org.springframework.boot:spring-boot-starter-data-jpa:3.1.2 와 같이 버전을 명시하는 방식으로 사용해야했다.
  • io.spring.dependency-management
    이 플러그인을 적용하면 SpringBoot의 플러그인이 사용 중인 SpringBoot 버전에서 Spring-boot-dependency bom을 자동으로 가져온다. 즉 같은 종속성 관리 기능을 제공하는 플러그인이다. 이는 의존성을 추가할 때 버전을 생략할 수 있다.
    하지만 내가 한 설정에서는 springboot 의존성이 없어 같은 종속성을 가지는 의존성들이 버전을 알 수 없었고, 때문에 이슈가 발생하였다.
    Springboot plugin이 있을 경우 아래와 같이 의존성 버전을 생략하고 사용가능하다.
plugins {
	id 'org.springframework.boot" version "3.1.2"
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

dependencies {
    // JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // JDBC
    api "org.springframework.boot:spring-boot-starter-jdbc"
}
  • springboot plugin이 없을때 버전을 명시해서 사용하는 같은 종속성을 가진 의존성이 있을 경우, 종속성을 따라가므로 버전 명시를 하지 않아도 된다.
    아래 이미지를 예로 들면 JPA,Redis는 같은 종속성을 가지므로 한개에만 버전을 명시하고 다른 한개는 버전 명시를 하지 않아도 된다.

2. 다른 모듈에서 domain 모듈을 읽어오지 못하는 이슈
이는 멀티 모듈 간에 yml 설정을 읽어오는데 문제가 생겨서 발생한 이슈이다.
api 모듈 -> core모듈 -> domain 모듈로 접근하는 식으로 구조를 잡았는데 api 모듈에서 domain 모듈에 있는데 DB설정을 읽어오지 못해서 DB를 구축하거나 JDBC 의존성을 제거라하나는 에러를 뱉어냈다.

멀티 모듈에서 yml 관리하는 법

  • 서로 다른 각각의 모듈이 있을 때, 각 모듈마다 application.yml을 가지고 있다.
  • springboot 의존성을 가진 모듈의 어플리케이션에 아래 코드를 추가하면 된다.
    이는 환경변수를 등록하는 것인데, 해당하는 파일들을 읽어와서 사용하겠다는 뜻이다.
    이렇게 설정하면 api 모듈에서 domain 모듈에 있는 yml 파일을 읽어서 사용할 수 있다.

    System.setProperty("spring.config.name", "application,application-domain");

  • 주의할점
    모듈별로 모두 application.yml 의 이름을 동일하게 사용하게 되면 가까운 yml을 읽어서 사용하기 때문에 domain 모듈의 yml을 사용하지 못하게된다. 각각 다른 이름으로 설정하는 것이 좋다.

마치며..
qeurydsl 관련 설정도 하고 있는데 기본설정만 해서 추후 사용해보면서 이슈가 생기면 정리해보겠다.
틀린 부분이 있다면 언제나 댓글을 달아주세요..

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글