일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JPA
- https go
- 공짜블로그
- 코틀린
- ruby
- Convariance
- kotlin
- IntelliJ
- 자바
- https 실습
- standard input
- https implement
- Pitest
- resize image with go
- 돌연변이 테스팅
- MySQL
- image resizer with go
- 객체지향
- 코틀린 out
- InnoDB
- 코틀린 in
- Test
- Java
- standard output
- cli 만들기
- output stream
- 개인블로그 hugo
- resizer 구현
- Mutation testing
- https 서버 구현
- Today
- Total
Rlog
Kotlin JPA 본문
Kotlin JPA 를 Gradle 기반으로 간단히 설정해보자.
위의 링크로 이동해서 아래 사진과 같이 옵션들을 골라주자.
고르고 압축풀고 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 연동법을 공부해보았다.
앞으로 계속 코틀린을 쓸거 같은데 문법에 익숙해지기 위해 많이 사이드를 해봐야겠다.
'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 |