๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Spring

Gradle๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ

by ์•ˆ์ฃผํ˜• 2023. 3. 4.

์„œ๋ก 

ํ˜„์žฌ ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€์„œ์—์„œ๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ์„ ๊ณต์œ ํ•˜๊ณ  ๊นƒ์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋“ค์€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ์— Nexus Maven ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•ด์„œ ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ ์„ธํŒ…์ด ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๊ธฐ์— ๋”ฐ๋กœ ์„ค์ •์— ๊ด€ํ•ด์„œ๋Š” ๊ฑด๋“œ๋ฆด ๋ถ€๋ถ„์ด ์—†๊ธฐ๋„ ํ•˜๊ณ , ์ง์ ‘ ๊ตฌ์„ฑํ•ด ๋ณธ ์ ๋„ ์—†์–ด์„œ ์ด๋ฒˆ๊ธฐํšŒ์— ์ •๋ฆฌ์™€ ํ•จ๊ป˜ ์ง์ ‘ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ํ•ด๋ณด๊ณ ์ž ํฌ์ŠคํŒ…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์˜ ์ •์˜์™€ Gradle์„ ์ด์šฉํ•œ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

  1. ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์ด๋ž€?
  2. Gradle๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ตฌ์„ฑํ•˜๊ธฐ
  3. ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

  • Apple Silicon (M1), IntelliJ
  • Java 11, Spring Boot, JPA, Gradle
  • Docker MySQL

์†Œ์Šค ํ™•์ธ

https://github.com/dkswnkk/multi-module-test/tree/main/multi-module-project

 

๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์ด๋ž€?

๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ ๋ฐ ๋นŒ๋“œ๋  ์ˆ˜ ์žˆ๊ณ , ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋ฉฐ, Java์—์„œ๋Š” Maven, Gradle๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , Python์—์„œ๋Š” setuptools, Node.js์—์„œ๋Š” npm ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Util, Domain, Repository ๋“ฑ์„ ๊ณตํ†ต ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์œ„ ์ด๋ฏธ์ง€๋Š” ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. API ์„œ๋ฒ„, Batch ์„œ๋ฒ„, Admin ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ์ด ๋…๋ฆฝ๋œ ํ”„๋กœ์ ํŠธ์ด๋ฉฐ, ๊ฐ๊ฐ์˜ ์„œ๋ฒ„๋“ค์€ Spring Boot + JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ์— User ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์„œ๋ฒ„๋งˆ๋‹ค, ๊ณตํ†ต๋œ User๋ผ๋Š” ๋„๋ฉ”์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์„œ๋น„์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์œ„ ์ด๋ฏธ์ง€๋Š” ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. API ์„œ๋ฒ„, Batch ์„œ๋ฒ„, Admin ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ์˜ ์„œ๋ฒ„๋งˆ๋‹ค ๊ฐ€์ง„ User ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ํ•˜๋‚˜์˜ User ์—”ํ‹ฐํ‹ฐ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ์— ํฌ๊ฒŒ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณตํ†ต์ ์ธ ์ฝ”๋“œ ์ฒ˜๋ฆฌ ํ•„์š”: ๋™์ผํ•œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ domain์„ ๊ฐ๊ฐ์˜ ํ”„๋กœ์ ํŠธ์— ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด API ์„œ๋ฒ„์—์„œ ๋„๋ฉ”์ธ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋™์ผํ•œ ์ž‘์—…์„ Batch ์„œ๋ฒ„์—๋„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  • ํœด๋จผ ์—๋Ÿฌ: ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ณตํ†ต๋œ ์ฝ”๋“œ๋“ค์„ ์‚ฌ๋žŒ์˜ ์‹ค์ˆ˜๋กœ ์ผ์น˜์‹œํ‚ค์ง€ ๋ชปํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ™œ ํ™•๋ฅ ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

์ฆ‰, ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฉ”์ธ(Entity) ํด๋ž˜์Šค์— ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ์— ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ ์‹œ ๋“ฑ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†๋Š”๋ฐ ์ด๋Ÿฐ copy & paste ๋ฐ˜๋ณต ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์†์ˆ˜ ํ•˜๋‹ค ๋ณด๋ฉด ํœด๋จผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†์Œ์€ ๋ฌผ๋ก  ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Entity ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅธ ์ด์ƒํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Gradle๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ตฌ์„ฑํ•˜๊ธฐ

์ด์ œ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋ฒˆ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

New Project > Gradle > Java > NEXT

๋จผ์ € ์ €๋Š” multi-module-project๋ผ๋Š” Gradle ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฃจํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋˜๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•˜์œ„ ๋ชจ๋“ˆ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

multi-module-project์˜ ๊ตฌ์„ฑ

๋ฃจํŠธ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ srcํด๋”์™€ ๊ฐ™์€ ๊ตฌ์„ฑ๋“ค์„ ์ œ๊ฑฐํ•ด ์ค๋‹ˆ๋‹ค.

Root ๋ชจ๋“ˆ ํด๋ฆญ > New > Module..

๋‹ค์Œ์œผ๋กœ Root ๋ชจ๋“ˆ ํด๋ฆญ > New > Module.. ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ ๋˜ํ•œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

์ €๋Š” ์œ„์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ multi-module-api, multi-module-batch, multi-module-database์„ Spring Project ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • multi-module-api: API ๊ด€๋ จ ๋ชจ๋“ˆ
  • multi-module-batch: Batch ๊ด€๋ จ ๋ชจ๋“ˆ
  • multi-module-database: multi-module-api์™€ multi-module-batch์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ(์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํ˜„์žฌ ์˜ˆ์‹œ์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ)

mult-module-project > setting.gradles

๊ทธ ํ›„, mult-module-project์˜ setting.gradles์—์„œ ๋ชจ๋“ˆ๋“ค์„ include ํ•ด์ค๋‹ˆ๋‹ค.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.9'
}

repositories {
    mavenCentral()
}

bootJar.enabled = false

subprojects {
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11'

    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()
    }

    // ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ์˜ ๊ณตํ†ต dependencies
    dependencies {
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    }

    test {
        useJUnitPlatform()
    }
}

project(':multi-module-api') { // ์ปดํŒŒ์ผ ์‹œ multi-module-database ๋กœ๋”ฉ
    dependencies {
        compileOnly project(':multi-module-database')
    }
}

project(':multi-module-batch') { // ์ปดํŒŒ์ผ ์‹œ multi-module-database ๋กœ๋”ฉ
    dependencies {
        compileOnly project(':multi-module-database')
    }
}

project(':multi-module-database') { // multi-module-databse๋Š” bootJar๋กœ ํŒจํ‚ค์ง• ํ•  ํ•„์š” ์—†์Œ
    bootJar { enabled = false }
    jar { enabled = true }
}

multi-module-project, ์ฆ‰ root ํ”„๋กœ์ ํŠธ์˜ build.gradle๋Š” ์œ„๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

multi-module-database๋ฅผ bootJar๋กœ ํŒจํ‚ค์ง• ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” database์™€ ๊ฐ™์ด Entity Class๋ฅผ ์ฃผ๋กœ ๋ชจ์•„ ๋†“์€ ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ main() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. bootJar ์ž‘์—…์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ jar์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด main() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, multi-module-database๋Š” main() ์—†์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— false๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ "Could not find method compile() for arguments" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด  ์›์ธ์€ compile, testCompile, runtime, testRuntime์„ Gradle 7.0 ๋ฒ„์ „์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ Gradle 7.0 ๋ฒ„์ „ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด implementation, testImplementation, runtimeOnly, testRuntimeOnly๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation project(':multi-module-database')
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    testImplementation 'org.springframework.batch:spring-batch-test'
    implementation project(':multi-module-database')
}

multi-module-api ํ”„๋กœ์ ํŠธ์™€ multi-module-baatch์˜ build.gradle ์„ค์ •์€ ๊ฐ๊ฐ ์ˆœ์„œ๋Œ€๋กœ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด multi-module-database๊ฐ€ multi-module-api์™€ multi-module-batch์— ์ •์ƒ์ ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ง„ํ–‰

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String email;

    private String password;

    public User(String email, String password) {
        this.email = email;
        this.password = password;
    }
}


public interface UserRepository extends JpaRepository<User, Long> {
}

๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด multi-module-database์— ์—”ํ‹ฐํ‹ฐ์™€ Repository๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. 

@Controller
@RequiredArgsConstructor
public class ApiController {

    private static final String EMAIL = "email@gmail.com";
    private static final String PASSWORD = "password";

    private final UserRepository userRepository;

    @PostMapping("/sign-up")
    public void signUp() {
        userRepository.save(new User(EMAIL, PASSWORD));
    }
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ multi-module-api์—๋Š” ์œ„์™€ ๊ฐ™์ด Controller๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

API ํ˜ธ์ถœ
๊ฐ’ ์ €์žฅ ๋˜๋Š” ๊ฒƒ ํ™•์ธ

๊ทธ๋ฆฌ๊ณ  multi-module-api ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ํ›„ API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด DB์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Parameter 0 of constructor in com.example.multimoduleapi.ApiController required a bean of type 'com.example.multimoduledatabase.UserRepository' that could not be found."

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด multi-module-api์—์„œ multi-module-databse์˜ Entity์™€ Repository๋ฅผ Scan ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@SpringBootApplication
@EntityScan(basePackages = {"com.example.multimoduledatabase"})
@EnableJpaRepositories(basePackages = {"com.example.multimoduledatabase"})
public class MultiModuleApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(MultiModuleApiApplication.class, args);
    }
}

ํ•ด๊ฒฐ๋ฒ•์€ ์œ„์™€ ๊ฐ™์ด @EntityScan๊ณผ @EnableJpaRepositories๋ฅผ ์ด์šฉํ•ด basePackages ๊ฐ’์„ ์ž‘์„ฑํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

  1. https://techblog.woowahan.com/2637/
  2. https://velog.io/@soyeon207/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0

๋Œ“๊ธ€