관리 메뉴

피터의 개발이야기

[Kotlin] Kotlin에서 all-open과 no-arg의 필요성 본문

Programming/Kotlin

[Kotlin] Kotlin에서 all-open과 no-arg의 필요성

기록하는 백앤드개발자 2024. 8. 14. 10:10
반응형

ㅁ 들어가며

ㅇ 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으로 Spring 개발할 때

 Kotlin JPA 필수 지식

스포카에서 Kotlin으로 JPA Entity를 정의하는 방법

 

반응형
Comments