• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

intelliJ 최신버전과 kotlin 1.6버전 충돌. 빌드 오류

24.04.30 14:23 작성 조회수 89

1

안녕하세요! 혹시 사용하고 계시는 intelliJ의 버전 알수 있을까요? 저는 최신버전 2024.1을 사용중이었는데요 해당 버전으로 강사님의 build.gradle 스펙과 동일하게 하여 빌드를 하니

Downloading kotlinc-dist?

라는 말이 뜨면서 무한 로딩이 걸리며 빌드가 5분이 지나도 끝나지 않습니다 ㅜㅜ 테스트도 실행이 안되구요

kotlin버전 1.6이 최신 intelliJ 버전에서 지원하지 않는다는?? 답변을 보고 kotlin을 1.7버전으로 업그레이드 해봐도 되지 않았고, 사용중인 intelliJ 버전을 2023.1 로 다운그레이드 하여 실행하니 정상적으로 동작하긴 합니다...

 

IDE 버전에 따라 언어 버전 호환성 문제가 있는거 같습니다 ㅜㅜ

참고로 최신 intelliJ를 사용했을땐 "org.jetbrains.kotlin.plugin.jpa" 플러그인슬 설치하지 않아도 12강에 말씀하신것 처럼 Book.kt 에서 오류가 나지 않았습니다! 2023.1로 다운그레이드 하니 오류가 나네요 ㅎㅎ

답변 2

·

답변을 작성해보세요.

1

안녕하세요! cogus9504님! 😊 정말 좋은 포인트 알려주셔서 감사합니다!

우선 제가 사용했던 IntelliJ 버전은 아마 2022.2 혹은 2022.3 이었던 것으로 추측합니다! 🥺

 

제가 빠른 시일 내에 최신 IntelliJ 버전과 호환되는 기본 프로젝트를 올려 보겠습니다!

  • 지금 올라가 있는 build.gradle 로 잘 되는지 확인해보고, 잘 동작할 수 있는 프로젝트를 추가로 올려둘게요! 🙂

  • 그리고 org.jetbrains.kotlin.plugin.jpa 플러그인이 없는 경우, @Entity 가 잘동작하는지도 확인해보겠습니다.

 

업데이트 되면 공유 드리도록 하겠습니다.

감사합니다! 🙏

확인 감사합니다!

새로 코틀린 + 스프링부트 환경에서 일을 해야 해서 강의를 듣게 되었는데 너무너무너무 도움이 많이 되네요 😁😁 좋은 강의 감사합니다. 앞으로도 코틀린 강의 많이 찍어주세요..!!

0

안녕하세요 돗토리묵님! 🙂 오늘 이것저것 추가로 살펴보았는데요!

 

결론부터 말씀드리면, IntelliJ의 버그인 것 같습니다. 🥺

위와 같은 글에서도 "유료 고객이고, 스프링 2.6.x 버전을 쓰고 있어 Kotlin 1.6을 써야 하는 상황인데 IntelliJ 버전이 업데이트 되었다고 해서 고지 없이 이전 버전을 호환하지 않으면 어떻게 해야 하냐? 라는 반응을 확인할 수 있었는데요! 😭

 

바로 이전 버전인 2023.3.6 까지는 해당 build.gradle로 잘 실행되는 것으로 확인했습니다. 🙂

 

추가로, IntelliJ 2024.1 버전에서는 다음과 같은 build.gradle를 사용할 수도 있습니다!

스프링 부트를 2.6.x -> 2.7.x 로 올려두었고, 가장 최신 버전을 코틀린도 적용한 버전입니다.

import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
    id 'org.springframework.boot' version '2.7.18'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.9.23'
    id 'org.jetbrains.kotlin.plugin.jpa' version '1.9.23'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.9.23'
    id 'org.jetbrains.kotlin.kapt' version '1.9.23'
    id "org.jetbrains.kotlin.plugin.allopen" version "1.9.23"
}

allOpen {
    annotation("javax.persistence.Entity")
    annotation("javax.persistence.MappedSuperclass")
    annotation("javax.persistence.Embeddable")
}


group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.9.23'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3'
    implementation 'org.junit.jupiter:junit-jupiter:5.8.1'
    implementation 'com.querydsl:querydsl-jpa:5.0.0'
    implementation 'org.projectlombok:lombok:1.18.28'
    kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
    kapt("org.springframework.boot:spring-boot-configuration-processor")

    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

compileKotlin {
    compilerOptions {
        jvmTarget = JvmTarget.JVM_11
    }
}

compileTestKotlin {
    compilerOptions {
        jvmTarget = JvmTarget.JVM_11
    }
}

 

다만 이 때, 스프링 부트가 2.7.x 가 되면서 H2 버전업이 이루어졌고, H2 버전업에 의해 user 라는 키워드를 H2 데이터베이스에 사용하지 못하기 때문에 application.yml에 설정을 한 가지 바꿔주어야 합니다.

# ;NON_KEYWORDS=USER 가 추가되었습니다!
spring:
  datasource:
    url: 'jdbc:h2:mem:library;NON_KEYWORDS=USER' 

H2에서 user 라는 이름을 키워드로 간주하지 않게다는 옵션인데요! 이 외에도 @Table 어노테이션을 사용해 user 라는 테이블 이름 대신 users 등을 쓸 수도 있습니다.

 

추가로, 말씀해주신 JPA 플러그인을 지우고도 실행시켜 보았는데요!

제가 실행했을 때는 No default constructor for entity 라는 에러가 정상적으로 나오는 것으로 보입니다!

  • IntelliJ 2024.1 + 위의 build.gradle 을 사용했습니다.

혹시나 build.gradle에서 jpa 플러그인을 한 번 적용시킨 상태에서 build를 하신 후 코드 변경 없이 재실행을 하시는 거라면, 진작 플러그인이 적용된 상태로 컴파일된 코드가 실행되어 잘 동작하는 것처럼 보일 수도 있긴 합니다! 저도 관련해서 더 알게되면 추가로 의견 남겨두겠습니다.

 

답변이 도움이 되었으면 좋겠습니다.

감사합니다! 🙏

우와.. 답변 감사합니다! 참고로 저는 스프링부트 3.x 버전을 사용중이었고, 말씀하신대로 해당 스프링부트에서 H2 버전업으로 인해 프로젝트 소스에 있던 User, Book, UserLoanHistory 중 User테이블만 생성이 안되더라구요 🥲 이부분은 구글링 해서 예약어 이슈인거 확인하고 @Table 어노테이션으로 `users`로 지정해 사용하였습니다!

 

의존성끼리의 버전충돌은 겪어봤어도 IDE와 언어의 버전충돌은 처음 겪어보는데 한번 겪고나니 툴 버전도 신경을 써야겠다고 느꼈습니다 😭

알려주신 코틀린 최신버전 소스는 잘 참고하겠습니다. 감사합니다!!