TIL_014 | Multi Module 만들어보기

묘한묘랑·2023년 12월 14일
0

TIL

목록 보기
14/31

일단 Multi Module을 만들어 보기로 하였다.

그 전에 잠깐 Intellij 이야기를 해보려 한다.

우선 프로젝트를 만들고 아무 모듈이나 바로 생성해보았고, 이후 그 모듈을 삭제하려고 하니 Intellij에서는 모듈을 제거 하시겠습니까? 파일은 삭제되지 않습니다. 와 같은 문구가 떠서 위치한 경로로 가서 직접 삭제하게 되었다.

그런데 gradle 관련 작업을 하려하니 test용으로 만들어 보았던 모듈이 실패하였다고 뜨는게 아닌가.

이걸 이대로 두었다가는 계속해서 뜰게 뻔하니 안나오게 해야한다.
우선, 며칠전의 정보를 토대로 .idea를 보았다.

떡하니 gradle.xml이 있기에 들어가 보았다.

일단 저 부분을 제거 하였고, 다시 되살렸다.

왜?

사실 저 아래쪽에 register라는 부분이 있는데, - 버튼을 누르면 gradle 프로젝트 연결 해제가 된다. 실제, 저 파일도 변경이 되었다.


Multi Module 만들기 여정

우선 완성된 프로젝트의 구조는 위와 같다.

우선 첫 시작은 Spring Boot로 빠르게 프로젝트를 만든 후 src 부분을 제거하였다.

Gradle 설정

// setting.gradle.kts

rootProject.name = "multi_module_prac"

include(":api:account-api")
include(":api:admin-api")
include(":domain:member")
include(":util:crypto")
// root / build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "3.2.0"
    kotlin("plugin.spring") version "1.9.20"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.20"
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
}


allprojects {
    group = "com.prac"
    version = "0.0.1-SNAPSHOT"
    repositories {
        mavenCentral()
    }

    apply(plugin = "org.jetbrains.kotlin.jvm")
    apply(plugin = "org.jetbrains.kotlin.plugin.spring")
    apply(plugin = "org.springframework.boot")
    apply(plugin = "io.spring.dependency-management")
}

subprojects {
    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs += "-Xjsr305=strict"
            jvmTarget = "17"
        }
    }
}

최종 형태는 이런 형태이지만 사실 플러그인 부분에 true, false를 주는 방식이 있기에

plugins {
    id("org.springframework.boot") version "3.2.0" apply false
    kotlin("plugin.spring") version "1.9.20" apply false
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.20"apply false
}

알지도 못하고 이렇게 해뒀다가 implementation을 찾지도 못하고, java 또한 찾지 못하여 에러가 나는 미치고 팔짝 뛸 상황을 연출 시켜버렸다. AccountApi에 있는 gradle은 되는데 root만 안되기에 도대체 왜 안되지 하다가 차이점을 보고 나서 아, false로 준 저게 영향을 끼쳤구나 하고 알게 되어 수정을 하였다.


Api

// AccountApiApplication.kt

@SpringBootApplication
@ComponentScan(basePackages = ["member"])
class AccountApiApplication

fun main(args: Array<String>) {
    runApplication<AccountApiApplication>(*args)
}
// build.gradle

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "3.2.0"
    kotlin("plugin.spring") version "1.9.20"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.20"
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    testImplementation("org.springframework.boot:spring-boot-starter-test")


    implementation(project(":domain:member"))
    implementation(project(":util:crypto"))
}

tasks.withType<Test> {
    useJUnitPlatform()
}

API 코드도 마찬가지로 최종은 이런 형태였지만, 사실 이전에는 큰 문제가 하나 있었다.

@SpringBootApplication(scanBasePackages = ["member"])
//@ComponentScan(basePackages = ["member"])
class AccountApiApplication

fun main(args: Array<String>) {
    runApplication<AccountApiApplication>(*args)
}

위와 같이 작성하였을 때, 아주 재밌는 상황이 발생하였었다.

시작은 잘 된다.
시작은

요청을 하나 보낸 이후 이 상태로 무반응이다.

사실 scanBasePackages = ["fsdjklajflksadjfl"] 라고 적어도 실행은 된다.

그리고 지금 글을 작성하며 혹시나 하는 마음에 시도 해본 것이 있는데...

@SpringBootApplication(scanBasePackages = ["member"])
@ComponentScan
class AccountApiApplication

추가적으로 ComponentScan을 달면 잘 된다....
Toby님의 Spring Boot 강의 영상부터 다시 봐야할 것 같다.


Domain

// build.gradle.kts

import org.springframework.boot.gradle.tasks.bundling.BootJar

val jar: Jar by tasks
val bootJar: BootJar by tasks

bootJar.enabled = false
jar.enabled = true

java{
    sourceCompatibility = JavaVersion.VERSION_17
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter:3.2.0")

}

SpringBoot Annotation을 달기 위해 starter만 추가하였다.


Ref List
Multi Module Project 생성하기
Spring Boot Multi Module 관리
왕초보도 가능한 Spring Boot 멀티 모듈 구축하기
멀티 모듈 프로젝트
Spring Boot, Gradle 멀티 모듈 프로젝트 실전 예제


그리고 튜터님이 프로젝트에 대해 코드리뷰를 해주셨는데 수정할 부분이 많이 보여 내일은 그걸 토대로 리펙토링을 진행하려 한다.

Github

profile
상황에 맞는 기술을 떠올리고 사용할 수 있는 개발자가 되고 싶은 개발자

0개의 댓글