Featured image of post [Toy Mario: Auth] 1. 스프링부트 프로젝트 구성하기

[Toy Mario: Auth] 1. 스프링부트 프로젝트 구성하기

안녕하세요, 마리오입니다 :)
Auth 영역 개발 처음은 스프링부트 프로젝트 구성입니다. 스프링 공식 문서에 있는 가이드를 참고하였습니다.

새 프로젝트 만들기

가이드 문서에 나온대로 Spring Initializr를 사용하여 프로젝트를 생성해보겠습니다. IntelliJ에도 통합되어 있어 IDE에서 명령줄이나 웹 UI를 사용하지 않고도 새 프로젝트를 만들고 가져올 수 있다고 하네요.

https://start.spring.io/#!language=kotlin&type=gradle-project-kotlin링크에 접속하여 언어를 Kotlin, 빌드 도구를 Gradle - Kotlin으로 설정하겠습니다.

그 외 설정은 starter.spring.io의 기본 설정으로 유지하고, Dependencies만 필요한것을 추가하여 사용하겠습니다.

  • Spring Web
  • Spring Data JPA
  • H2 Database
  • Spring Boot DevTools
  • Spring Security
  • Redis

Persistence with JPA

Kotlin에서는 무분별한 상속을 막기 위해 기본적으로 모든 클래스는 기본 변경자가 final로 처리됩니다. Hibernate의는 이러한 규칙을 강요하지않아 final entity를 받더라도 에러가 발생하지는 않지만, JPA와 관련된 클래스와 프로퍼티들은 반드시 open 되어야 합니다(KT-28525).

이에 따라 final로 해석되는 Kotlin Class를 그대로 활용할 경우 lazy fetching에 활용되는 Proxy가 정상적으로 동작하지 못해 eager fetching으로 처리되어 데이터 조회시 성능 이슈를 발생 시킬 수 있습니다.

이러한 문제는 allopen 플러그인을 통해 해결 가능하므로, 플러그인 관련 코드를 build.gradle.kts 추가해주겠습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
plugins {
    // ...
    kotlin("plugin.allopen") version "1.7.22"
}

// ...

allOpen {
    annotation("jakarta.persistence.Entity")
    annotation("jakarta.persistence.Embeddable")
    annotation("jakarta.persistence.MappedSuperclass")
}

kapt

kapt(Kotlin Annotation Processing Tool)Kotlin에서 어노테이션 프로세서(annotation processor)를 실행하고 처리하는 도구로써 Kotlin으로 어노테이션을 작성하고 실행하기 위해 사용됩니다.

Kotlin에서는 애플리케이션 프로퍼티를 사용할 때 읽기 전용 프로퍼티 사용을 권장하는데, 커스텀 프로퍼티는 IDE에서 인식하지 못하기 때문에 메타데이터 생성을 위해 spring-boot-configuration-processor 종속성을 이용하여 Kapt를 구성해야한다고 하네요.

마찬가지로 build.gradle.kts에 관련 설정을 추가하겠습니다.

1
2
3
4
5
6
7
8
9
plugins {
  //...
  kotlin("kapt") version "1.7.22"
}

dependencies {
  //...
  kapt("org.springframework.boot:spring-boot-configuration-processor")
}
  • “설정 > 플러그인” 에서 Spring Boot 플러그인이 활성되어 있는지 확인
  • “설정 > 빌드, 실행, 배포 > 컴파일러 > 어노테이션 프로세서” 에서 어노테이션 처리 활성화
  • 터미널에서 ./gradlew kaptKotlin 명령 실행하여 메타데이터 생성

끝으로

프로젝트를 생성하고 기본적으로 필요한 구성은 모두 끝난 것 같습니다. 다음 차례 부터는 구현이되겠네요!

끝까지 읽어주셔서 감사합니다 :D