어제 오늘 내일

[Java] "롬복(Lombok) 이제 안녕?" Java 17/21 필살기: Record, Switch, Text Block 완벽 정리 본문

IT/SpringBoot

[Java] "롬복(Lombok) 이제 안녕?" Java 17/21 필살기: Record, Switch, Text Block 완벽 정리

hi.anna 2026. 3. 23. 09:57

 
스프링 부트 3.x 버전부터는 Java 17 이상이 필수입니다. 그런데 아직도 Java 8 스타일로 코딩하고 계신가요?
오늘은 여러분의 코드를 절반으로 줄여줄 마법 같은 문법들을 소개합니다. (이걸 알면 다시는 예전으로 못 돌아갑니다.)


1. DTO의 혁명: 레코드 (Record)

DTO(Data Transfer Object)를 만들 때마다 private final, 생성자, getter, equals, hashCode, toString... 지겨우셨죠? 롬복(@Data)을 써도 되지만, 이제는 자바가 순정 기능으로 지원합니다.

❌ Before (Java 11 이하 / 롬복)

@Getter
@RequiredArgsConstructor
public class MemberDto {
    private final String name;
    private final int age;
    // (롬복 없으면 여기에 코드 50줄 추가됨)
}

✅ After (Java 17 Record)

public record MemberDto(String name, int age) {
}

끝입니다. 믿기지 않겠지만 이게 답니다.

  • 특징:
  • 모든 필드는 private final (불변 객체)
  • gettergetName() 대신 name()으로 자동 생성
  • 생성자, toString, equals 등 자동 생성
  • 용도: 불변 데이터를 나르는 DTO로 쓰기에 완벽합니다.

2. 더 똑똑해진 스위치: Switch Expression

지긋지긋한 break, case, 그리고 "값을 리턴하려면 변수를 따로 선언해야 했던" 불편함이 사라졌습니다.

❌ Before (Java 11 이하)

String dayType;
switch (day) {
    case MONDAY:
    case FRIDAY:
        dayType = "평일";
        break;
    case SUNDAY:
        dayType = "주말";
        break;
    default:
        throw new IllegalArgumentException("???");
}

✅ After (Java 17 Switch Expression)

String dayType = switch (day) {
    case MONDAY, FRIDAY -> "평일"; // 화살표(->) 사용! break 필요 없음
    case SUNDAY -> "주말";
    default -> throw new IllegalArgumentException("???");
};
  • 특징: 값을 바로 리턴할 수 있습니다. 코드가 훨씬 직관적이고 안전해졌죠?

3. SQL, JSON 지옥 탈출: 텍스트 블록 (Text Blocks)

자바에서 HTML이나 SQL 쿼리를 문자열로 넣을 때, +\n으로 도배된 코드를 보면 현기증이 납니다.

❌ Before (Java 11 이하)

String json = "{\n" +
              "  \"name\": \"John\",\n" +
              "  \"age\": 30\n" +
              "}";

✅ After (Java 17 Text Block)

String json = """
              {
                "name": "John",
                "age": 30
              }
              """;
  • 특징: 큰따옴표 3개(""")로 감싸면 보이는 그대로 문자열이 됩니다. SQL 쿼리 짤 때 정말 행복해집니다.

4. 형변환 귀찮아: instanceof 패턴 매칭

"이 객체가 String이면 형변환해서 써라." 이 로직은 너무나 빈번하게 쓰입니다.

❌ Before (Java 11 이하)

if (obj instanceof String) {
    String s = (String) obj; // 의미 없는 강제 형변환
    System.out.println(s.length());
}

✅ After (Java 17 Pattern Matching)

if (obj instanceof String s) { // 검사와 동시에 변수 s 선언!
    System.out.println(s.length());
}
  • 특징: 캐스팅(Casting) 코드가 사라져서 실수를 줄여줍니다.

5. (보너스) Java 21의 신기능: 가상 스레드 (Virtual Threads)

아직 실무 도입은 이르지만, 알아두면 면접에서 점수 따기 좋은 개념입니다.
기존 자바 스레드는 OS 스레드를 1:1로 매핑해서 무겁고 개수 제한이 있었지만, 가상 스레드는 수백만 개를 동시에 띄울 수 있는 경량 스레드입니다.

// Java 21
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}

이 코드는 기존 방식으로는 서버가 뻗었겠지만, Java 21에서는 거뜬합니다. (논-블로킹 I/O의 혁명!)


마치며

오늘의 결론입니다.

  1. Record: DTO 만들 때 롬복 @Data 대신 쓰세요. 코드가 한 줄로 줄어듭니다.
  2. Switch Expression: break 빼먹어서 버그 내지 말고 화살표(->)를 쓰세요.
  3. Text Block: SQL, JSON 문자열은 """로 감싸세요.
  4. Pattern Matching: 형변환((String) obj) 하지 마세요.

자바는 늙은 언어가 아닙니다. 계속 젊어지고 있죠.
여러분의 프로젝트 build.gradlesourceCompatibility = '17'을 적는 순간, 개발의 질(Quality of Life)이 달라질 것입니다.

 
 

반응형
Comments