자바

Spring boot +gradle+node build with kotlin

du.study 2020. 10. 25. 16:55
728x90

현재 spring boot와 gradle을 이용하여 개발을 진행하고 있습니다.(언어는 kotlin)

 

보통은 백엔드만 개발을 진행하지만, 어드민 툴을 개발하면서 프론트 개발을 react로 같이 진행해야했고, 빌드시 자동으로 프론트코드가 빌드되어 jar안에 포함되길 원했습니다.

build시 프론트코드와 함께 같이 실행하는것을 원했기에 gradle build시 npm빌드를 하기위하여 방법을 찾던도중 다음과 같은 방법으로 해결할 수 있었습니다.

 

제 프로젝트 구조는 다음과 같습니다.

다음은 gradle 파일입니다.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.moowork.gradle.node.npm.NpmTask
import org.jetbrains.kotlin.kapt3.base.Kapt.kapt

plugins {
    ...
    id("com.github.node-gradle.node") version "2.2.4"
    ...
}

node{
    version = "14.13.0"
    distBaseUrl = "https://nodejs.org/dist"

    if(System.getenv("REQUIRE_NODE_INSTALL") != null && System.getenv("REQUIRE_NODE_INSTALL") == "TRUE"){
        download = true
    }
    else{
        download = false
    }

    workDir = file("${project.buildDir}/nodejs")
    yarnWorkDir = file("${project.buildDir}/yarn")
    nodeModulesDir = file("${project.projectDir}")
    npmWorkDir = file("${project.buildDir}/npm")
}

val installDependencies by tasks.registering(NpmTask::class) {
    setArgs(listOf("install"))
    setExecOverrides(closureOf<ExecSpec> {
        setWorkingDir("${project.projectDir}/front")
    })
}

val buildReactTask by tasks.registering(NpmTask::class) {
    // Before buildWeb can run, installDependencies must run
    dependsOn(installDependencies)
    setArgs(listOf("run", "build"))
    setExecOverrides(closureOf<ExecSpec> {
        setWorkingDir("${project.projectDir}/front")
    })
}

val copyTask by tasks.registering(Copy::class) {
    dependsOn(buildReactTask)
    from(file("${project.projectDir}/front/build"))
    into(file("${project.buildDir}/resources/main/static"))
}

tasks.bootJar {
    dependsOn(copyTask)
}

 

각각의 dependOn을 통해서 bootJar 실행전 npm install -> npm run build -> copy (빌드 파일 경로로 빌드된 폴더 copy)를 실행후 jar파일이 생성되게 됩니다.

 

bootJar를 진행해야만 build된 resource들이 bootJar안에 포함되게 되어 다음과 같이 진행하였습니다.

 

만약 tasks.build 등의 테스크에 dependon을 걸게되면 jar를 만드는 과정에선 node build파일이 포함되지않게 됩니다.

728x90