1. Kotlin을 처음 쓰는 Spring 개발자를 위한 핵심 문법 가이드

2026. 8. 3. 00:13·Language·CS/Java·Kotlin

이 글은 Velog에서 이전한 글입니다. Velog 원문 보기

근래 개발 연합 동아리 YAPP 27기에서 Server 파트로 활동하게 되었어요.
OT에서 함께 프로젝트를 진행할 동료 Server 개발자와 기술 스택에 대해 이야기를 나누면서, 프로젝트는 하나의 언어로 맞추는 것이 좋겠다는 결론을 내렸습니다.

저는 Java 기반 백엔드 개발자로 활동해왔고, 함께하는 동료는 Kotlin 개발자였어요. 자연스럽게 Kotlin을 사용하는 방향으로 논의하게 되었고, 예전부터 Kotlin을 배워보고 싶었던 만큼 이번 기회에 언어를 전환하기로 결정했습니다.

이 글은 Java만 사용해온 백엔드 개발자가 Kotlin을 학습해 가는 과정을 기록한 내용으로 구성했습니다.

총 5개의 글로 정리해볼까 생각 중이에요

    1.    Kotlin을 처음 쓰는 Spring 개발자를 위한 핵심 문법 가이드
    2.    Spring MVC를 Kotlin답게 작성하는 방법
    3.    확장 함수로 Spring 코드를 깔끔하게 정리해봤어요
    4.    Kotlin 기반 Spring Boot 프로젝트 세팅 올인원 정리
    5.    코루틴으로 구현하는 Spring 비동기 로직

Java 개발자가 먼저 이해해야 할 Kotlin 포인트

Kotlin을 사용하면서 가장 먼저 느꼈던 건 코드가 짧아지고, NPE가 줄어드는 경험이었어요.
하지만 짧아진 이유와 안전해지는 구조를 이해하지 못하면 오히려 혼란스럽습니다.

Sring 개발자가 먼저 이해해야 하는 영역은 다음 네 가지입니다.

  1. Null Safety
  2. data class 중심의 객체 구조
  3. 표현식 기반 문법 (expression-oriented)
  4. 기본 생성자와 프로퍼티 선언 방식

이 네 가지는 Controller-Server-DTO에 직결되는 부분이라 가장 먼저 짚고 넘어가는 게 좋았습니다.


val/var, 기본 생성자, data class

val/var

Kotlin에서 변수 선언은 val과 var로 구분돼요.

  • val: 변경 불가 (immutable)
  • var: 변경 가능 (mutable)

Spring에서 불변 객체 사용은 권장되는 패턴이기 때문에, DTO나 Server 내부 값은 자연스럽게 val이 기본이 됩니다.

예시:

val name: String = "상민"   // 변하지 않는 값
var count: Int = 0         // 변경 가능한 값
---
name = "박상민" <- 오류 발생
count = 1 <- 가능

기본 생성자 (Primary Constructor)

Kotlin은 클래스 선언과 동시에 프로퍼티를 정의할 수 있어요.
Java처럼 필드와 생성자를 반복해서 작성할 필요가 없어서 코드가 훨씬 간결했습니다.

Java:

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Kotlin:

class User(
    val name: String,
    val age: Int

Spring에서 DTO를 만들 때 이 구조가 특히 깔끔해졌습니다.

data class

Spring에서 Response DTO, Command 객체를 만들 때 data class는 필수로 사용하게 됩니다.

특징:

  • equals, hashCode, toString, copy 자동 생성
  • 값 중심 객체에 적합
  • JPA Entity에는 사용하지 않는 것이 좋음

예시:

data class UserResponse(
    val id: Long,
    val name: String
)

data class는 사실상 Spring 애플리케이션의 DTO 표준 구조라고 보면 됩니다.


Null Safety와 Spring에서의 활용

Kotlin에서 가장 강력한 기능이 Null Safety였습니다.
Spring 로직에서 Optional을 자주 쓰던 부분이 훨씬 자연스러워졌어요.

nullable 타입

val name: String? = null

작동 원리

  1. 타입 시스템 수준에서 "null이 들어올 수 있는 변수"라고 명시하는 방식이에요.
  2. String?로 선언되는 순간, Kotlin 컴파일러는 다음을 강제합니다.
  • 이 변수에 접근할 때 직접적인 멤버 호출 금지
  • 반드시 안전한 방식(?., ?: 등)을 사용해야 함
  1. Java에서는 컴파일러가 null 여부를 체크하지 않지만, Kotlin은 컴파일 타임에 방지해서 NPE 가능성을 크게 줄입니다.

결과

  • Stirng(non-null) 타입과 완전히 별개 타입으로 취급
  • 컴파일러가 null-safe 코드를 강제해서 NPE를 설계 단계에서 차단

안전 호출(?.)

val length = name?.length

작동 원리
?. 연산자가 붙는 순간 컴파일러는 다음과 같은 코드를 내부적으로 생성합니다.

의사코드로 표현하면:

if (name != null) name.length else null

즉,

  • name이 null이 아니면 -> name.length 실행
  • name이 null이면 -> 전체 식의 결과가 null

으로 평가됩니다.

특징

  • NullPointerException을 발생시키지 않음
  • 체이닝으로도 안전하게 사용 가능
    user?.address?.city

Elvis 연산자(?:)

val length = name?.length ?: 0

작동 원리

  1. 먼저 name?.length를 계산
  2. 만약 그 결과가
  • null이 아니면 → 해당 값 반환
  • null이면 → ?: 오른쪽 값을 반환

즉, Kotlin 컴파일러는 내부적으로 다음과 같은 분기 코드를 생성합니다.

의사코드:

val temp = if (name != null) name.length else null
val length = if (temp != null) temp else 0

not-null 단언(!!)

지양해야 하는 방식이지만, 가끔 필요한 경우가 있습니다.

val length = name!!.length

작동 원리
컴파일러에게 강제로 “이 값은 null이 아니라고 믿어도 된다”라고 선언하는 방식이에요.
하지만 컴파일러는 실제 null 여부를 확인하지 않아요.

실제 런타임에서는 다음과 같이 동작합니다:

  1. 객체가 null일 수 있는 타입이어도 체크하지 않음
  2. 실제 실행 시 name이 null이면
    • 즉시 NullPointerException 발생
  3. null이 아니라면 정상적으로 멤버 호출 실행

의사코드:

if (name == null) {
    throw NullPointerException()
}
val length = name.length

특징

  • 런타임 NPE 발생 가능성이 있어서 위험
  • 정말 “절대 null일 수 없다”는 확신이 있는 경우에만 사용
  • Spring 개발에서는 RequestBody 강제 값 보장 등 극히 제한된 영역에서만 사용

Spring에서 실제 활용 예

Repository 조회 이후 처리 흐름:

Java:

User user = repository.findById(id).orElse(null);
if (user == null) {
    throw new CustomException();
}
return new UserResponse(user);

Kotlin:

val user = repository.findById(id).orElse(null)
    ?: throw CustomException()

return UserResponse(user)

불필요한 null 체크가 제거되고 읽는 흐름이 훨씬 간결해졌습니다.


표현식 기반 문법 정리

Kotlin은 "문(statement)"보다 표현식(expression)을 선호합니다.
즉, 거의 모든 것이 값을 반환해요.

if 문도 표현식

Java:

int score;
if (age > 20) {
    score = 10;
} else {
    score = 5;
}

Kotlin:

val score = if (age > 20) 10 else 5

when 문도 표현식

val result = when(role) {
    "ADMIN" -> 1
    "USER" -> 2
    else -> 0
}

Spring의 예외 처리나 Validator에서 이 방식이 특히 깔끔했습니다.


Java ↔ Kotlin 비교 예시

Controller 요청 DTO

Java:

public class CreateUserRequest {
    private String name;
    private int age;

    public CreateUserRequest(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Kotlin:

data class CreateUserRequest(
    val name: String,
    val age: Int
)

Service 로직

Java:

public UserResponse create(CreateUserRequest request) {
    User user = repository.save(new User(request.getName(), request.getAge()));
    return new UserResponse(user);
}

Kotlin:

public UserResponse create(CreateUserRequest request) {
    User user = repository.save(new User(request.getName(), request.getAge()));
    return new UserResponse(user);
}

마무리

지금까지 Java 기반으로 개발을 해왔지만, Kotlin을 사용해보니 Spring 애플리케이션 구조가 훨씬 단순해졌어요.
특히 Null Safety, data class, 표현식 문법, 간결한 생성자 구조는 실무 코드의 가독성을 크게 높여 줬습니다.

다음 글에서는 실제 Spring MVC 구조를 Kotlin 스타일로 작성하는 방법을 정리해볼 예정입니다.

'Language·CS > Java·Kotlin' 카테고리의 다른 글

코루틴 기반 Spring 비동기 처리 (With WebFlux)  (0) 2026.08.03
Kotlin + Spring Boot 프로젝트 환경 구성  (0) 2026.08.03
3. 확장 함수(Extension Function)로 Spring 코드 최적화  (0) 2026.08.03
2. Spring MVC를 Kotlin답게 작성하는 방법  (0) 2026.08.03
'Language·CS/Java·Kotlin' 카테고리의 다른 글
  • 코루틴 기반 Spring 비동기 처리 (With WebFlux)
  • Kotlin + Spring Boot 프로젝트 환경 구성
  • 3. 확장 함수(Extension Function)로 Spring 코드 최적화
  • 2. Spring MVC를 Kotlin답게 작성하는 방법
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    HTTP WEB 기본 지식
    OS
    jpa
    트러블슈팅
    척척학사
    Spring MVC
    BOJ
    개념 정리!
    CS Interview
    Algorithm
    Python
    나의 작은 프로젝트
    Project
    object
    interview
    Book
    java
    게시판
    Spring
    http
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
1. Kotlin을 처음 쓰는 Spring 개발자를 위한 핵심 문법 가이드
상단으로

티스토리툴바