본문 바로가기
스프링

[스프링] Kotlin + JPA 를 사용하면서 생긴 이슈 ( No-args )

by 코딩하는경준 2022. 7. 26.

최근에 Kotlin 공부를 시작을 했습니다.

Kopring(Kotlin + spring)을 사용하기 위해서 입니다.

 

간단하게 JPA를 사용해보려고 했는데 엔티티를 생성하는 과정에서 에러가 발생해서 이를 해결했던 과정을 기록하려합니다.

 

에러내용 : Class '클래스명' should have [public, protected] no-arg constructor

간단하게 JPA 를 사용해보려고

build.gradle.kt 에 

implementation("org.springframework.boot:spring-boot-starter-data-jpa:2.7.2")

이렇게 jpa 의존성도 추가하고 

자바에서 하던것처럼 UserEntity 엔티티를 생성을 했습니다.

생성을 했는데 클래스 명에서 자꾸 에러를 뱉어서 읽어보았더니

"Class '클래스명' should have [public, protected] no-arg constructor" 이라는 에러였습니다.

이 에러는 기본생성자가 있어야하는데 없어서 나는 에러입니다.

 

기본생성자는 왜 꼭 필요할까?

JPA 의 구현체인 Hibernate는 Reflection 을 사용해서 엔티티를 생성합니다.

그렇기 때문에 기본생성자가 꼭 필요합니다.

 

하지만 

위 사진처럼 매번 기본생성자를 이렇게 만들어준다면 매우 번거롭고 놓치는부분도 있을거기 때문에, 

저희는 plugin.jpa plugin 을 사용할겁니다.

 

plugin.jpa ?

plugin.jpa 는 @Entity, @Embeddable, @MappedSuperclass 어노티이션이 붙은 클래스에
컴파일시점에 자동으로 기본생성자를 만들어주는 플러그인 입니다.

저희는 @Entity 어노테이션이 붙은 클래스에 기본생성자를 만들것이기에 필요합니다.

 

그렇다면 어떻게 사용할까요?

간단합니다, 그냥 build.gradle.kt 에 아래와 같이 추가해주면 적용이 됩니다.

plugins {
  kotlin("plugin.jpa") version "1.6.21"
}

 

 

다른 해결 방법

위 문서를 읽다보니 noarg 라는 플러그인에서도 같은 기능을 지원한다고 합니다. 

plugins {
   kotlin("plugin.noarg") version "1.6.21"
}
...

noArg {
   annotation("javax.persistence.Entity")
}

위와 같이 추가를 해도 기본생성자가 자동으로 생깁니다.

 

 

참고한 자료

https://kotlinlang.org/docs/no-arg-plugin.html#jpa-support

 

No-arg compiler plugin | Kotlin

 

kotlinlang.org

 

'스프링' 카테고리의 다른 글

[스프링] 스프링에서의 트랜잭션 관리  (0) 2022.05.17

댓글