스프링부트에서 코틀린 사용하기

tkppp·2021년 12월 31일
0

SpringBoot with Kotlin

목록 보기
4/12
post-custom-banner

코틀린 플러그인

스프링 이니셜라이저로 코틀린 스프링부트 프로젝트를 만들면 기본적으로 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들의 그룹이다. 특정 빌드과정에서 필요한 기본정보들을 포함하고 있으며 필요에 따라 커스터마이징 할 수 있다.

kotlin("jvm")

코틀린은 여러 환경에서 동작하는 멀티플랫폼 언어이다. 이 플러그인은 코틀린이 jvm 프로젝트임을 명시하는 플러그인이다.

kotlin("plugin.spring")

스프링부트는 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")
}

kotlin("plugin.jpa)

JPA 사용시 argument가 없는 자바 기본생성자가 필요한 경우가 있다. 이 플러그인은 @Entity, @MappedSupperclass, @Embeddable 어노테이션 사용시 자동으로 기본생성자를 만들어주는 플러그인이다.

왜 이 플러그인이 필요한지는 JPA를 공부한 후 다시 알아보겠다.

References

post-custom-banner

0개의 댓글