728x90
반응형
환경 : Spring Boot 3.1, Kotlin 1.9, Intellij
목표 : Kotlin 기반 Spring Boot 프로젝트 생성 및 간단한 CRUD API 구현
1. 코프링(Kopring)이란?
Kotlin + Spring의 합성어. Spring Boot 프로젝트를 Kotlin으로 개발하는 것을 의미
Java 대비 주요 차이점
- Null 안정성 : Java는 런타임에 NPE 발생. Kotlin은 컴파일 타임에 체크
- 코드량 : 동일한 기능 대비 약 30~40% 감소
- 데이터 클래스 : Java는 Lombok 필요. Kotlin은
data class로 기본 제공
2. 프로젝트 생성
start.spring.io 에서 아래와 같이 설정
Project : Gradle - Kotlin
Language : Kotlin
Spring Boot : 3.1.x
Dependencies:
- Spring Web
- Spring Data JPA
- H2 Database
3. build.gradle.kts 설정
plugins {
kotlin("jvm") version "1.9.0"
kotlin("plugin.spring") version "1.9.0"
kotlin("plugin.jpa") version "1.9.0"
id("org.springframework.boot") version "3.1.0"
id("io.spring.dependency-management") version "1.1.0"
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
runtimeOnly("com.h2database:h2")
}
- plugin.spring : Kotlin 클래스는 기본이
final이라 Spring 프록시 생성과 충돌. 자동으로open처리 - plugin.jpa : JPA Entity에 필요한 기본 생성자 자동 생성
- jackson-module-kotlin : Kotlin data class 직렬화/역직렬화 지원
4. CRUD API 구현
4.1) Entity
@Entity
class Member(
val name: String,
val email: String,
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0
)
4.2) Repository
interface MemberRepository : JpaRepository<Member, Long>
4.3) Service
@Service
class MemberService(
private val memberRepository: MemberRepository
) {
fun getAll(): List<Member> = memberRepository.findAll()
fun save(name: String, email: String): Member {
return memberRepository.save(Member(name = name, email = email))
}
}
생성자에 선언하는 것만으로 의존성 주입. @Autowired 불필요
4.4) Controller
@RestController
@RequestMapping("/members")
class MemberController(
private val memberService: MemberService
) {
@GetMapping
fun getAll(): List<Member> = memberService.getAll()
@PostMapping
fun save(@RequestBody request: MemberRequest): Member =
memberService.save(request.name, request.email)
}
data class MemberRequest(
val name: String,
val email: String
)
5. 결과 확인
./gradlew bootRun
5.1) 전체 조회
curl http://localhost:8080/members
5.2) 저장
curl -X POST http://localhost:8080/members \
-H "Content-Type: application/json" \
-d '{"name":"홍길동","email":"hong@test.com"}'
5.3) 저장 후 전체 조회 결과
[{"id":1,"name":"홍길동","email":"hong@test.com"}]
728x90
반응형
