스프링 이니셜라이저로 코틀린 스프링부트 프로젝트를 만들면 기본적으로 build.gradle.kts에 두가지 코틀린 플러그인이 등록되어있다.
plugins {
id("org.springframework.boot") version "2.6.2"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.6.10"
kotlin("plugin.spring") version "1.6.10"
}
플러그인은 id()로 등록하지만 코틀린 전용 플러그인은 kotlin()으로 등록 가능하다. kotlin("pluginName")은 사실 id("org.jetbrains.kotlin.pluginName")의 축약된 형태이다. 이런 플러그인들은 Gradle Plugin 홈페이지에서 찾아볼 수 있다.
플러그인이란?
plugin이란 미리 구성해둔 task들의 그룹이다. 특정 빌드과정에서 필요한 기본정보들을 포함하고 있으며 필요에 따라 커스터마이징 할 수 있다.
코틀린은 여러 환경에서 동작하는 멀티플랫폼 언어이다. 이 플러그인은 코틀린이 jvm 프로젝트임을 명시하는 플러그인이다.
스프링부트는 2.x 버전부터 CGLIB Proxy방식으로 Bean을 관리하는데 사용하는데 코틀린의 기본 클래스 접근 지정자는 public final 이기 때문에 open임을 명시하지 않으면 상속이나 오버라이드할 수 없어 에러가 발생한다. 이를 해결하기 위해 모든 코틀린 클래스를 open으로 만들어버리면 코틀린의 사용 의미가 없어지므로 스프링에서 사용하는 특정 어노테이션 사용시 all-open 클래스로 만들어주는 플러그인이다. 이 플러그인은 all-open 플러그인과 동일하다.
all-open 클래스로 만들어주는 어노테이션
@Component
와@Component
를 상속받는 어노테이션(@Configuration, @Controller, @RestController, @Service, @Repository)- @Async
- @Transactional
- @Cacheable
- @SpringBootTest
하지만 이 플러그인이 JPA에서 사용되는 @Entity, Embeddable, @MappedSuperclass는 all-open으로 만들어주지 않기 때문에 all-open 플러그인을 적용함을 명시해야한다.
allOpen {
annotation("javax.persistence.Entity")
annotation("javax.persistence.MappedSuperclass")
annotation("javax.persistence.Embeddable")
}
JPA 사용시 argument가 없는 자바 기본생성자가 필요한 경우가 있다. 이 플러그인은 @Entity
, @MappedSupperclass
, @Embeddable
어노테이션 사용시 자동으로 기본생성자를 만들어주는 플러그인이다.
왜 이 플러그인이 필요한지는 JPA를 공부한 후 다시 알아보겠다.