| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 문자열
- 단위테스트
- IntelliJ
- ArrayList
- input
- 배열
- vscode
- string
- CSS
- js
- junit5
- list
- 자바스크립트
- math
- 스프링부트
- Java
- Array
- java테스트
- 자바문법
- Visual Studio Code
- html
- 인텔리제이
- HashMap
- 정규식
- junit
- 자바
- javascript
- SpringBoot
- 테스트자동화
- Eclipse
- Today
- Total
어제 오늘 내일
[Java] "롬복(Lombok) 이제 안녕?" Java 17/21 필살기: Record, Switch, Text Block 완벽 정리 본문
[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(불변 객체) getter는getName()대신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의 혁명!)
마치며
오늘의 결론입니다.
- Record: DTO 만들 때 롬복
@Data대신 쓰세요. 코드가 한 줄로 줄어듭니다. - Switch Expression:
break빼먹어서 버그 내지 말고 화살표(->)를 쓰세요. - Text Block: SQL, JSON 문자열은
"""로 감싸세요. - Pattern Matching: 형변환(
(String) obj) 하지 마세요.
자바는 늙은 언어가 아닙니다. 계속 젊어지고 있죠.
여러분의 프로젝트 build.gradle에 sourceCompatibility = '17'을 적는 순간, 개발의 질(Quality of Life)이 달라질 것입니다.
