티스토리 뷰

사이드 프로젝트로 간단한 채팅 시스템을 만들어보기로 했다.
나는 백엔드 담당이고 kotlin, spring boot로 진행하기로 했다.

 

gradle 설정하기

업무에서는 maven기반으로 개발하고 있어서 사이드나 다른 신규 프로젝트를 하게 될 경우에는 가급적 gradle로 진행하려고 한다.

이유는,

  1. maven과 gradle의 차이를 작년 프로젝트를 진행하면서 비교한 결과 (그 문서 작성을 왜 안했을까..) 결론적으로는 maven이 출시된지 오래됐고, 레퍼런스도 많지만 빌드 속도 측면에서 gradle이 월등했고, 세부 커스텀도 가능한 점이 있었다.
  2. 실제 업무에서도 모듈이 많거나 라이브러리가 많은 경우 maven으로 빌드했을 때 약 2분 가량 소요되고 있으며, 이것도 최적화를 한다면 속도를 줄일 수 있겠지만 동일한 라이브러리 사용 기준으로 했을 때 maven과 gradle 빌드 속도를 비교한 자료를 어디 레퍼런스에서 제공했던 것을 참고한 결과 (찾아서 문서 수정 예정) gradle이 빌드 속도가 훨씬 빨랐다.

gradle 빌드 속도가 maven보다 빠른 이유

  • maven도 .m2 폴더에 캐시를 사용하지만, maven은 빌드할 때마다 처음부터 전부 다시 빌드를 진행하게 되고,
  • gradle은 한번 캐시된 라이브러리는 재빌드를 하지 않고 신규로 추가된 라이브러리만 빌드하여 속도에서 차이가 나게된다.
    • 이 구조를 보면서 느낀 건 jpa 더티체킹과 동일한 매커니즘으로 보였다. jpa 더티체킹의 경우에도 이미 기존에 있는 데이터라면 I/O 쿼리가 발생되지 않고 신규 데이터 한정으로 I/O 쿼리가 발생한다.

그렇다고 gradle 관리가 더 쉽냐고 한다면 그것도 아니다. 오히려 gradle이 세부 커스텀을 할 수 있기 때문에 더 능숙한 관리 능력이 요구된다.

나는 다른 것보다 빌드 속도가 같은 라이브러리 사용 하는 기준으로 gradle이 더 빠르기 때문에 우선 gradle로 설정한다.

 

kotlin을 사용하는 경우에는 gradle설정을 groovy DSL기반이 아닌 kotlin DSL로 사용한다. (gradle 레퍼런스 참고)

groovy DSL과 kotlin DSL 파일을 동시 사용할 수 없으니 둘 중 하나만 사용해서 빌드한다.

 

Gradle Kotlin DSL Primer

Gradle’s Kotlin DSL provides an alternative syntax to the traditional Groovy DSL with an enhanced editing experience in supported IDEs, with superior content assist, refactoring, documentation, and more. This chapter provides details of the main Kotlin D

docs.gradle.org

이 레퍼런스에서 빌드 오류 시 트러블 슈팅에 대한 내용도 안내되고 있어서 자주 참고하게 될 것 같아 아예 포스팅한다.

 

초기 설정은 spring initialzr를 통해 추가한다.

사용하고자 하는 라이브러리를 확인해서 추가한다. 다 추가한 것은 아니지만 필수로 쓸 것들을 우선 추가했다.

# build.gradle.kts

plugins {
    id("org.springframework.boot") version "3.3.1"
    id("io.spring.dependency-management") version "1.1.5"
    kotlin("plugin.jpa") version "1.9.24"
    kotlin("jvm") version "1.9.24"
    kotlin("plugin.spring") version "1.9.24"
}

group = "com.chat"
version = "0.0.1-SNAPSHOT"

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.flywaydb:flyway-core")
    implementation("org.flywaydb:flyway-mysql")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.springframework.boot:spring-boot-starter-web")
    runtimeOnly("com.mysql:mysql-connector-j")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

kotlin {
    jvmToolchain {
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(17))
    }
    sourceSets["main"].kotlin.srcDirs("src/main/kotlin")
    sourceSets["test"].kotlin.srcDirs("src/test/kotlin")
}

tasks.withType<Test> {
    useJUnitPlatform()
}
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함