이번 프로젝트에서는 Java가 아닌 Kotlin을 활용해 보기로 결정하면서, 프로젝트 생성 및 세팅 과정부터 개발 과정에서의 어려움까지 기록하려 한다.
해당 글에서는 Kotlin+Spring boot 프로젝트를 생성하고 세팅하는 과정과 AWS RDS 연결까지 다뤄볼 예정이다.
1. 프로젝트 생성
IntelliJ IDE를 통해 바로 Spring Initializer를 활용하여 새 프로젝트를 생성할 수 있다.
Name 부분에는 우리 서비스의 이름을 적어주고, Location에는 프로젝트가 저장될 위치를 지정해준다. 그리고 Github에 해당 프로젝트를 올릴 것이기 때문에 Local git repository도 함께 생성되도록 체크해줬다.
Language는 Kotlin으로 선택하고, Type도 Gradle - Kotlin을 선택해준다. Group과 Artifact는 각각 팀명과 서비스명으로 채워준다. JDK는 17버전으로, Java는 23으로 지정했지만 추후 세팅 과정에서 21로 수정해줬다. 그리고 Packaging은 Jar 방식으로 선택한다.
+) Kotlin은 JVM 위에서 동작하기 때문에 Java가 아닌 Kotlin을 활용하더라도 JDK가 필요하다. 또한, Gradle을 사용하기 때문에 사용할 Java 버전도 꼭 지정해줘야 한다.

다음 단계로 넘어가면 아래와 같이 Spring Boot 버전과 Dependencies를 선택할 수 있는 화면이 나온다.
Spring Boot 버전은 stable한 버전 중 가장 최신 버전을 골라주고, Dependency는 추후에 얼마든지 자유롭게 수정할 수 있기 때문에 우선 필요한 것들만 추가해준다.
해당 프로젝트에서는 Spring Web, Spring Data JPA, MySQL Driver, Spring Data Redis, WebSocket을 선택했다.
+) Java를 사용한다면 Lombok을 필수로 선택하겠지만, Kotlin을 사용하면 data class, Null-safety, property 등을 통해 Lombok의 annotation들의 기능들을 자동 제공해주기 때문에 Lombok은 제외했다.

2. 프로젝트 초기 세팅
build.gradle.kts
plugins {
kotlin("jvm") version "1.9.25"
kotlin("plugin.spring") version "1.9.25"
id("org.springframework.boot") version "3.4.1"
id("io.spring.dependency-management") version "1.1.7"
kotlin("plugin.jpa") version "1.9.25"
}
group = "com.goosesdream"
version = "0.0.1-SNAPSHOT"
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-websocket")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0") // swagger를 위한 dependency 추가
runtimeOnly("com.mysql:mysql-connector-j")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
kotlin {
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict")
}
}
allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.MappedSuperclass")
annotation("jakarta.persistence.Embeddable")
}
tasks.withType<Test> {
useJUnitPlatform()
}
추후 Swagger를 사용할 예정이어서 dependencies 부분에 Spring doc 관련 dependency를 추가해줬다.
application.yml
spring:
datasource:
url: jdbc:mysql://{{rds endpoint}}:3306/{{DB name}}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Seoul
username: # master username
password: # master pw
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
default_batch_fetch_size: 100
format_sql: true
dialect: org.hibernate.dialect.MySQLDialect
springdoc:
swagger-ui:
tags-sorter: alpha
operations-sorter: method
disable-swagger-default-url: true
display-request-duration: true
api-docs:
path: /api-docs
show-actuator: true
default-consumes-media-type: application/json
default-produces-media-type: application/json
paths-to-match:
- /api/**
application.yml 파일에는 rds 연결을 위한 datasource 내용과 swagger-ui 관련 설정들을 작성해준다.
spring.datasource 관련 데이터들은 아래와 같이 기재해주면 된다.
spring:
datasource:
url: jdbc:mysql://{{rds endpoint}}:3306/{{DB name}}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Seoul
username: # master user
password: # master pw
driver-class-name: com.mysql.cj.jdbc.Driver
3. 프로젝트에 RDS 연결
우선 프로젝트 초기 세팅은 위와 같이만 해주고, 이제 IntelliJ에서 미리 생성해둔 AWS RDS를 연결해보자.

IntelliJ 오른쪽 툴바에서 Database를 클릭해 패널을 열어 Data Source를 추가해보자. RDS를 MySQL로 생성했기 때문에 MySQL을 골라준다.

위와 같이 Data Source를 추가해주는 화면에서 아래의 정보들을 채워주면 된다.
- Name: 내가 지정할 수 있는 DB 이름으로, 구분하기 쉽게 지어주는게 좋다.
- Host: RDS의 endpoint를 넣어준다.
- Port: 마찬가지로 RDS 생성 시 설정한 port number를 적어준다. MySQL을 기본적으로 3306 port를 사용한다.
- User&Password: RDS 생성 시 같이 생성해준 master user name과 password를 적어준다.
- Database: RDS 생성 시 설정한 DB name을 적어준다. 이 값으로 스키마를 찾기 때문에 꼭 정확히 적어주어야 한다.
- URL: Host값과 Database값으로 이 부분이 아래와 같이 자동으로 채워졌을텐데, 추가로 더 설정해줄 것들이 있다면 url에 붙여준다.
URL
위에 채워준 Host, Port, Database 값으로 다음과 같이 URL이 기본적으로 채워진다.
jdbc:mysql://{{Host}}:{{Port}}/{{Database}}
이 프로젝트에서는 SSL을 사용하지 않고 DB 연결을 할 것이기 때문에 아래와 같이 useSSL 값을 false로 지정해준다.
jdbc:mysql://{{Host}}:{{Port}}/{{Database}}?useSSL=false
🔥 Trouble Shooting-"Public Key Retrieval is not allowed"
jdbc:mysql://{{Host}}:{{Port}}/{{Database}}?useSSL=false
URL값을 이렇게 설정하고 Test Connection을 시도했을 때 아래 이미지와 같이 Public Key Retrieval is not allowed 에러가 발생하며 연결에 실패했다.

MySQL 8.X 버전 이상에서 발생하는 에러로, MySQL 서버가 RSA 공개키를 전송하는 방식으로 Password값을 인증하는데 클라이언트가 이 인증을 허용하고 있지 않을 때 발생한다.
다음과 같이 URL에 useSSL=false와 함께 allowPublicKeyRetrieval=true를 설정해주자.
jdbc:mysql://{{Host}}:{{Port}}/{{Database}}?allowPublicKeyRetrieval=true&useSSL=false
Test Connection에 성공하면 문제없이 설정해준 것이니 OK를 눌러 연결해주자.
그러면 다음과 같이 Database 목록에 방금 연결한 RDS가 뜬다!

만약 해당 RDS를 눌러도 생성해준 Database(스키마)가 목록에 뜨지 않는다면 DB 우클릭 > Properties에 들어가 Schema 메뉴에 들어가보자. 목록에 어떤 스키마를 노출시킬 것인지 선택할 수 있으니, 원하는 스키마를 체크해 노출시킬 수 있다.

