blog

Java 17에서 레코드를 사용하여 롬복의 일부 기능 대체하기

DD의 장기 업데이트 [Java 신기능 칼럼]에서는 Java 16에서 지원되기 시작한 새로운 기능을 소개했습니다: [레코드](https...

Oct 17, 2025 · 4 min. read
シェア

Java 16에서 지원되는 새로운 기능의 사용: DD 장기 업데이트에 설명되어 있습니다.

방금 소개했지만 코딩 습관이나 사양 측면에서 향후 애플리케이션의 변화에 대해서는 이야기하지 않았습니다. 최근 일부 파트너의 코드에 대한 상호 검토로 인해 주로 기록에 초점을 맞춘 일부 논의 주제가 발생했으며 실제로 사용하는 일부 시나리오를 대체 할 수 있습니다.

오늘은 롬복을 대체할 수 있는 레코드에 대해 간략하게 정리해 보았습니다.

Lombok의 힘

Lombok은 코드를 훨씬 깔끔하게 만들어주기 때문에 항상 즐겨 사용하는 도구입니다. 예를 들어 사용자 객체를 작성해야 할 때 Lombok을 사용하지 않으면 작성해야 할 내용이 너무 많을 때가 많습니다:

public class User {
 private String username;
 private String email;
 private int userId;
 public User(String username, String email, int userId) {
 this.username = username;
 this.email = email;
 this.userId = userId;
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 public int getUserId() {
 return userId;
 }
 public void setUserId(int userId) {
 this.userId = userId;
 }
 @Override
 public boolean equals(Object o) {
 if (this == o) return true;
 if (o == null || getClass() != o.getClass()) return false;
 User user = (User) o;
 if (userId != user.userId) return false;
 if (username != null ? !username.equals(user.username) : user.username != null) return false;
 return email != null ? email.equals(user.email) : user.email == null;
 }
 @Override
 public int hashCode() {
 int result = username != null ? username.hashCode() : 0;
 result = 31 * result + (email != null ? email.hashCode() : 0);
 result = 31 * result + userId;
 return result;
 }
 @Override
 public String toString() {
 return "User{" +
 "username='" + username + '\'' +
 ", email='" + email + '\'' +
 ", userId=" + userId +
 '}';
 }
}

롬복에서는 @Data 어노테이션을 사용하여 위의 내용을 다음 줄로 줄일 수 있습니다:

@Data
public class User {
 private String username;
 private String email;
 private int userId;
}

데이터 어노테이션은 @Getter, @Setter, @EqualsAndHashCode, @toString을 포함하므로 하나의 어노테이션으로 멤버 변수의 Getter 및 Setter, 같음 및 해시코드 메서드의 재정의, toString의 재정의가 가능합니다. 코드의 양이 크게 줄어들고 코드가 더 깔끔하게 보입니다.

Lombok

롬복은 훨씬 적은 코딩으로 도움을 줄 수 있지만 여전히 다음과 같은 몇 가지 단점이 있습니다:

  1. 롬복은 Java에서 공식적으로 제공하지는 않지만 커뮤니티에 의존하여 유지 관리하는 타사 종속성입니다. 일반적으로 최신 Java 버전과의 호환성 문제가 있으며, 예측할 수 없는 이상한 오류가 발생하기 쉽습니다.
  2. IDE 호환성 제한, 모든 IDE가 롬복과 완벽하게 호환되는 것은 아니므로 결과적으로 몇 가지 이상한 오류가 발생할 수 있습니다.

대신 레코드를 사용하세요

Lombok 문서에서 클래스의 필드인 생성자, equals(), hashCode() 및 toString()을 기반으로 record 클래스를 자동으로 생성할 수 있다고 언급했습니다. 이 기능은 위에서 설명한 롬복의 @Data와 매우 유사합니다.

이렇게 한 줄로 작성하는 것도 매우 간단합니다:

public record UserRecord(String username, String email, int userId) {}

보시다시피 코드가 롬복 구현보다 훨씬 깔끔합니다. 또한 핵심은 이 기능이 Java에서 기본적으로 지원되며 타사 종속성을 도입할 필요가 없다는 점입니다!

레코드 클래스 정의가 완료되면, 다른 클래스의 일반적인 사용과 동일하게 인스턴스를 생성하고 메서드를 호출하는 구체적인 사용법은 다음과 같습니다:

UserRecord userRecord = new UserRecord("didi", "didi@didispace.com", 35);
System.out.println(userRecord.email());
System.out.println(userRecord.toString());

레코드와 롬복을 사용할 때 자동으로 생성되는 코드의 차이점만 이해하면 바로 시작할 수 있습니다.

예를 들어, 위의 예제에서 차이점을 확인할 수 있습니다. 멤버 변수 이메일을 가져올 때 여기서는 기존 게터에서처럼 getEmail()로 생성되지 않습니다.

대체가 불가능한 상황에는 어떤 것이 있나요?

기록 클래스는 이미 강력하지만 현재로서는 롬복의 완전한 대체품은 아닙니다. 주요 이유는 다음과 같습니다:

  1. 레코드에 정의된 멤버 변수는 최종 유형이며 초기화 후에는 수정할 수 없습니다.
  2. 레코드 클래스는 상속할 수 없으므로 더 이상 확장할 수 없습니다.

따라서 롬복 대신 레코드를 사용할 때는 변경될 수 있는 인스턴스 변수보다 정적 변수를 정의하는 데 더 많이 사용됩니다. 그러나 함수도 레코드로 정의할 수 있으므로 멤버 계산을 위해 얻은 콘텐츠 중 일부에 함수를 구현하여 사용할 수 있습니다.

요약

롬복과 레코드는 모두 깔끔한 코드를 작성하는 데 도움이 될 수 있습니다. 전자는 타사 라이브러리이며 예측할 수없는 문제와 IDE 호환성 문제가있을 수 있지만 기능이 더 포괄적이고 강력하며 후자는 기능이 약간 약하지만 Java의 기본 기능에 속하지만 사용하면 많은 코드 작성을 줄일 수 있으며 IDE 호환성이 더 좋습니다.

오늘의 공유는 여기까지입니다. 학습 과정에 어려움이 있으신가요? 초고품질에 참여하고, 교류와 토론에 참여하여 더 나은 학습과 발전을 이룰 수 있습니다! 더 많은 지원을 수집하고 전달하는 것을 환영합니다!

Read next

하모니OS에 대해 이야기하기

하모니OS란 무엇인가요?\n하모니OS는 휴대폰 운영 체제뿐만 아니라 모든 것의 상호 연결을 달성하기위한 운영 체제이며, 가장 직접적인 접촉은 휴대폰이며, 하모니OS는 자동차, 소형 개별 단말기, 대형 산업 시스템 등에 서비스를 제공 할 수 있습니다.\nHarmon

Oct 17, 2025 · 1 min read