Kotlin

Kotlin JPA

dev_roach 2021. 11. 16. 21:27
728x90

Kotlin JPA 를 Gradle 기반으로 간단히 설정해보자.

 

https://start.spring.io/

위의 링크로 이동해서 아래 사진과 같이 옵션들을 골라주자.

고르고 압축풀고 Intellij 를 통해서 열어주자.

 

Kotlin 은 JPA 를 쓰기 위해서 여러가지 설정이 필요한데 그 이유는

 

첫번째로, JPA 는 기본적으로 클래스를 final 형태로 사용하는데 이는 Hibernate 와 별로 어울리지 않습니다.

그 이유는 JPA 에서는 지연로딩을 하게 될 경우 프록시 객체를 만들어야 하는데

이때 class 에 final 이 있게 되면 프록시 객체를 만들 수 없게 됩니다.

따라서 all-open plugin 을 이용해야 합니다.

 

뭐, 이런 문제 때문에 data class 를 이용하는 사람들도 있지만

스프링 공식문서에서도 아직까지는 data class 는 추천하지 않는다고 적혀있으니 Intelij 가 만들어준 plugin.spring 을 이용합시다.

 

저와 같이 만들었다면 아마도 gradle 에 plugin.spring 이 추가되어 있을 것입니다.

Plugin.Spirng ?

해당 플러그인은 Intellij 에서 만들었으며 공식문서에 적혀있는 내용은 아래와 같습니다.

위의 어노테이션에 붙어있는 Class 에 대해서는 자동적으로 open class 로 만들어주게 됩니다.

우리가 원하는 기능이죠.

 

하지만 문제가 있습니다. 우리는 @Entity 또한 OpenClass 로 만들어주어야 합니다.

그래서 공식문서를 따라 아래와 같이 Gradle 에 추가 옵션을 해주어야 합니다.

일단은 Entity 만 해주셔도 됩니다.

다른 어노테이션을 추가할때 마다 다섯 가지에 없다면 allOpen Group 에 추가하면 됩니다.

 

일단 이렇게 해서 우리가 해결해야 하는 첫번째 문제인 Entity 를 open class 로 만드는데 성공했습니다.

또 한가지 문제가 더있는데 두번째 문제는 아래와 같습니다.

두번째로, JPA 는 Reflection 을 통한 Entity 를 생성하므로 기본생성자를 필요로 합니다.

이 또한 Kotlin 에서 기본생성자를 만들어 주지 않는데

그래서 Reflection 을 이용한 Entity 생성이 불가능하게 된다.

그래서 Intellij 에서 plugin.jpa 라는 플러그인을 제공하는데 제공하는 기능은 아래와 같다.

위의 어노테이션이 붙은 class 에 대해서 no-args 생성자를 자동으로 생성해주게 된다.

이제 위의 기능을 통해서 두번째 문제또한 해결했다.

 

이젠 실제 코드를 한번 작성해보자.

예시코드

만약 Java 진영에서 JPA 를 했다면 익숙하기도 하지만 'lateinit' 과 같은 새로운 키워드도 있을 것이다.

 

lateinit 은 간단하게 지연 초기화라고 생각하면 편하다.

만약 참조할 당시에 초기화 되어 있지않다면 Exception 을 발생시킨다.

우리가 Intellij 가 제공해준 여러 플러그인이 제대로 잘 적용되고 있는지 확인하기 위해 Converting 된 Java Code 를 보자.

기본생성자가 생성됨

일단 기본적으로 no-args plugin 이 잘 적용된 모습을 볼수있다.

클래스 또한 open class 처럼 final 이 없어진 것을 확인할 수 있다.

 

우리는 플러그인 적용을 통해서 Kotlin JPA 를 사용할때의 문제를 처리한 것을 확인할 수 있게 되었다.

 

이제 문제도 해결했으니 간단하게 TestCode 를 작성해서 잘 동작하는지 확인해보자.

TestCode

이렇게 했을때 name 도 잘 들어갔는지 확인할 수 있고

지연초기화를 요청한 createdAt, updatedAt 도 잘 @Auditing 되었는지 확인해볼 수 있을 것이다.

테스트는 잘 통과하는 것을 볼 수 있다.

일단 눈으로도 한번 제대로 확인해보기 위해서 @Transactional 어노테이션을 제거해보았다.

지연 초기화 또한 잘된 모습을 확인할 수 있다.

 

오늘은 아주 간단하게 kotlin 과 JPA 연동법을 공부해보았다.

앞으로 계속 코틀린을 쓸거 같은데 문법에 익숙해지기 위해 많이 사이드를 해봐야겠다.

728x90

'Kotlin' 카테고리의 다른 글

[Mac] Kotlin 설치 및 CLI 에서 사용하기  (0) 2021.12.06
Kotlin Null 처리  (0) 2021.11.18
Kotlin JPA - 상속 관계 맵핑  (0) 2021.11.17
Kotlin object  (0) 2021.11.15
Kotlin 변수 선언  (0) 2021.11.13