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
반응형

+ Recent posts