이번 글은 kotlin과 jpa를 같이 사용하며 생긴 이슈들에 대해 소개하겠습니다.
보다 자세한 글을 원하시면 우아한 형제들 기술블로그의 이 글 을 읽으시면 좋을 것 같습니다.
이번 글에 사용된 코드는 github에 있습니다 .
코틀린 + JPA를 사용하며 생긴 이슈들을 이곳에 계속 추가해나갈 예정입니다.
자바로 개발해오다가 이번에 입사를 하면서 코틀린을 사용하게 되었습니다.
맨 처음한 것이 lombok을 추가한 것인데, 그것을 본 동료가 "코틀린은 롬복이 필요없어요"라고 했습니다. 이유가 궁금했지만 왜 필요없는지 직접 깨닫고 싶어서 롬복을 지웠고, 롬복을 사용하지 않고 개발하며 만난 문제들을 해결한 방법을 소개하겠습니다.
가장 첫번째로 만난 문제는 엔티티 기본 생성자 문제였습니다.
엔티티의 기본 생성자가 필요한 이유는,
Hibernate는 Reflection을 사용해 엔티티를 생성하기 때문입니다.
1. 모든 엔티티에 기본 생성자 선언해주기
2. 롬복 사용하기
이렇게 두가지 입니다.
첫번째 방법은 모든 엔티티에 기본 생성자(default constructor)를 구현하는 것으로 이렇게 하는것은 비효율적이라 생각해서 과감히 버렸습니다.
두번째 방법은 롬복 사용인데, 이걸 쓴다면 회사 동료가 말해준 것을 이해할 수 없을 것 같았습니다.
이렇게 두 방법 모두 비효율적이라 생각해서 구글링한 결과 kotlin-jpa plugin이라는 것이 있었습니다.
kotlin-jpa plugin이란?
기본 생성자를 만들어주는 no-arg 플러그인을 래핑한 플러그인.
@Entity
,@MappedSuperClass
,@Embeddable
어노테이션이 있는 클래스의 default constructor를 자동으로 생성해줍니다.
이 플러그인을 사용하면 기본 생성자를 자동으로 만들어주므로 기본 생성자 이슈를 해결할 수 있었습니다.
※ 참고
kotlin의 클래스는 기본적으로 final이므로 상속을 할 수 없어서 Lazy Loading을 위한 프록시 객체를 생성할 수 없습니다. 이때는 all open plugin을 사용해 문제를 해결할 수 있습니다. (스프링에서는 kotlin-spring 플러그인으로 해결할 수 있습니다.)
참고 자료