일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- kotlin spring
- PETERICA
- MySQL
- kotlin querydsl
- Kubernetes
- minikube
- 정보처리기사실기 기출문제
- 오블완
- AWS EKS
- mysql 튜닝
- 공부
- Pinpoint
- 기록으로 실력을 쌓자
- 정보처리기사 실기 기출문제
- CloudWatch
- IntelliJ
- Spring
- kotlin coroutine
- Java
- aws
- Linux
- AI
- CKA 기출문제
- 코틀린 코루틴의 정석
- 정보처리기사 실기
- CKA
- Elasticsearch
- 티스토리챌린지
- APM
- kotlin
- Today
- Total
피터의 개발이야기
[Kotlin] Kotlin에서 all-open과 no-arg의 필요성 본문
ㅁ 들어가며
ㅇ Kotlin으로 Spring 프로젝트를 개발할 때, all-open과 no-arg 플러그인은 매우 유용하다.
ㅇ 이 두 플러그인의 필요성과 역할을 잘 정리한 Kotlin으로 Spring 개발할 때을 보고 정리하였다.
ㅁ all-open 플러그인의 필요성
ㅇ Kotlin은 기본적으로 클래스와 메서드가 final로 선언된다.
ㅇ 이는 상속을 막기 때문에 Spring의 CGLIB Proxy와 같은 기능을 사용할 때 문제가 발생한다.
ㅇ CGLIB Proxy는 대상 클래스를 상속하여 프록시 객체를 생성하기 때문에, 대상 클래스가 open 상태여야 한다.
ㅇ all-open 플러그인은 특정 어노테이션이 붙은 클래스에 대해 자동으로 open 키워드를 추가해준다.
allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.Embeddable")
annotation("javax.persistence.MappedSuperclass")
}
ㅇ 예를 들어, @Entity, @Embeddealbe, @MappedSuperclass 등의 어노테이션이 붙은 클래스는 자동으로 open 키워드가 추가되어 상속이 가능해진다.
ㅇ all-open 플러그인 덕분에 자동으로 open 키워드가 추가되어 CGLIB 프록시를 통해 AOP 기능을 사용할 수 있게 한다.
ㅁ no-arg 플러그인의 필요성
ㅇ JPA와 같은 ORM 프레임워크는 리플렉션을 통해 객체를 생성할 때 기본 생성자가 필요하다.
ㅇ Kotlin에서는 기본 생성자가 자동으로 생성되지 않으며, 다른 생성자를 정의하면 기본 생성자는 사라진다.
ㅇ no-arg 플러그인은 특정 어노테이션이 붙은 클래스에 대해 기본 생성자를 자동으로 추가해준다.
noArg {
annotation("javax.persistence.Entity")
annotation("javax.persistence.Embeddable")
annotation("javax.persistence.MappedSuperclass")
}
ㅇ 이렇게 설정하면, @Entity, @Embeddable, @MappedSuperclass 어노테이션이 붙은 클래스에 대해 기본 생성자를 자동으로 추가한다.
@Entity
class Book(
val title: String,
val author: String
) {
// 기본 생성자가 자동으로 추가됨
}
ㅇ 위 Book class는 no-arg 플러그인 덕분에 기본 생성자가 자동으로 추가되어, JPA가 리플렉션을 통해 객체를 생성할 수 있게 된다.
ㅁ 기본 생성자가 없는 경우 발생하는 오류
org.hibernate.InstantiationException: No default constructor for entity: : Book
ㅇ JPA는 엔티티 객체를 생성할 때 리플렉션(reflection)을 사용한다.
ㅇ 리플렉션을 통해 객체를 생성하려면 클래스에 기본 생성자가 필요하다.
ㅇ 기본 생성자가 없으면 JPA는 객체를 생성할 수 없기 때문에 InstantiationException이 발생한다.
ㅇ 이는 Hibernate와 같은 JPA 구현체가 조회한 데이터로 엔티티 클래스를 생성할 때 발생하는 전형적인 오류이다.
ㅇ 해결방법: no-arg 플러그인을 사용하여 엔티티 클래스에 기본 생성자를 자동으로 추가할 수 있다.
ㅇ 이를 통해 JPA와 Kotlin을 문제없이 사용할 수 있다.
ㅁ 함께 보면 좋은 사이트
ㅇ 스포카에서 Kotlin으로 JPA Entity를 정의하는 방법
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin JDSL 문법 정리 (0) | 2024.08.16 |
---|---|
[Kotlin] QueryDSL의 Q클래스 생성 과정에서 Entity 참조 오류 해결 (0) | 2024.08.15 |
[kotlin] Spring Data Elasticsearch 샘플코드 (0) | 2024.08.11 |
[Kotlin] Spring Boot Kotlin 프로젝트에 ktlint 설정하기 (0) | 2024.08.05 |
[Kotlin] Spring MVC, Circular view path 에러 (0) | 2024.08.04 |