TECH/웹개발

[Java] Record와 Text Blocks: 자바 17에서 코드를 우아하게 만드는 두 가지 무기

런코리치 2026. 2. 28. 08:00

[Java] 자바 코드가 우아해지는 마법: Record와 Text Blocks 완벽 가이드

자바 개발자들을 가장 괴롭히던 것 중 하나가 바로 "데이터를 담기 위해 만들어야 하는 수십 줄의 단순 반복 코드"였습니다. 하지만 Java 17 LTS 버전부터는 RecordText Blocks 덕분에 코드가 믿기지 않을 정도로 간결하고 명확해졌습니다. 오늘은 이 두 기능의 핵심 개념부터 실무 활용법까지 자세히 알아보겠습니다.


1. Record: 불변 데이터 객체의 혁명

그동안 자바에서 데이터를 전달하기 위한 객체(DTO, VO)를 만들려면 필드 선언, 생성자, Getter, equals(), hashCode(), toString()까지 수십 줄의 코드가 필요했습니다. 롬복(Lombok)의 @Data나 @Value로 대체하곤 했지만, 이제 자바 표준 기능인 Record가 그 역할을 대신합니다.

① Record란 무엇인가?

Record는 "데이터를 운반하기 위한 목적으로 설계된 불변(Immutable) 데이터 클래스"입니다. 클래스 선언 시 필드만 명시하면 컴파일러가 나머지 필수 메서드들을 자동으로 생성해 줍니다.

② 비포 & 애프터(Before & After) 예시

  • 기존 방식 (Java 11 이하)
Java
public class UserDto {
    private final String name;
    private final int age;

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

    public String getName() { return name; }
    public int getAge() { return age; }

    @Override
    public boolean equals(Object o) { /* ... 중복 코드 ... */ }
    @Override
    public int hashCode() { /* ... 중복 코드 ... */ }
    @Override
    public String toString() { return "UserDto{name='" + name + "', age=" + age + "}"; }
}
  • 모던 방식 (Java 17+ Record)
Java
public record UserDto(String name, int age) {}

③ Record의 특징과 제약

  • 불변성: 모든 필드는 private final로 선언됩니다. 한 번 생성된 객체의 값은 변경할 수 없습니다.
  • 상속 불가: Record는 암시적으로 java.lang.Record를 상속받으며, final 클래스이므로 다른 클래스를 상속하거나 다른 클래스가 Record를 상속할 수 없습니다.
  • 컴팩트 생성자: 생성 시 데이터 검증(Validation)이 필요한 경우 가독성 좋게 처리할 수 있습니다.
Java
public record UserDto(String name, int age) {
    public UserDto {
        if (age < 0) throw new IllegalArgumentException("나이는 0보다 커야 합니다.");
    }
}

2. Text Blocks: 더 이상 플러스(+) 기호에 시달리지 마라

SQL 쿼리나 JSON 데이터를 자바 코드 내에 문자열로 넣을 때, 우리는 항상 줄바꿈(\n)과 문자열 연결(+) 기호 때문에 고생했습니다. Text Blocks는 이를 해결하기 위해 도입된 다중행 문자열 리터럴입니다.

① Text Blocks 문법

세 개의 따옴표(""")를 사용하여 문자열의 시작과 끝을 감쌉니다.

② 실무 예시: SQL과 JSON

  • 기존 방식 (가독성 최악)
Java
String query = "SELECT id, name, email\n" +
               "FROM users\n" +
               "WHERE status = 'ACTIVE'\n" +
               "ORDER BY id DESC;";
  • Text Blocks 방식 (가시성 최고)
Java
String query = """
    SELECT id, name, email
    FROM users
    WHERE status = 'ACTIVE'
    ORDER BY id DESC;
    """;

③ 주요 특징: "스마트한 들여쓰기"

Text Blocks는 가장 왼쪽의 공백(Common White Space)을 지능적으로 판단하여 제거합니다. 덕분에 코드의 들여쓰기를 유지하면서도 실제 문자열 데이터에는 불필요한 공백이 포함되지 않게 관리할 수 있습니다.


3. Record와 Text Blocks의 환상적인 시너지

이 두 기능을 조합하면 데이터 처리 로직이 매우 깔끔해집니다. 예를 들어, API 응답 테스트를 위한 Mock 데이터를 만들 때 Record로 객체를 정의하고 Text Blocks로 JSON 응답 결과물을 정의하면 코드의 가독성이 극대화됩니다.


🏁 마무리하며: "LTS 버전을 써야 하는 이유"

Java 11에서 17로 넘어오며 가장 크게 체감되는 변화가 바로 이 두 기능입니다.

  • Record는 객체 지향 모델링에서 데이터의 무결성을 보장하고 가독성을 높여줍니다.
  • Text Blocks는 외부 리소스(SQL, JSON, HTML)를 자바 안에서 다룰 때의 피로도를 획기적으로 낮춰줍니다.

아직도 구버전 스타일로 코드를 짜고 계신다면, 이번 기회에 Record와 Text Blocks를 프로젝트에 적극 도입해 보시길 바랍니다. 생산성의 차이를 즉시 느끼실 수 있을 것입니다.