Avoid Lombok. Use Records to write cleaner code in Java 17.
Medium
"코드를 읽고 쓰는 데 걸리는 시간의 비율은 10대 1이 훨씬 넘는다." 클린코드의 저자 Robert C. Martin이 한 말입니다.
"User" 클래스를 정의해야 한다고 가정해 봅시다. User 클래스는 유저 데이터를 저장하고, username, email, userId 필드를 가지고 있습니다. 단순히 getter, setter, toString 등의 메소드를 정의하려면 적어도 65줄의 코드가 필요할 것입니다.
📌 롬복으로 고치기
좋은 방법은 롬복 라이브러리를 사용하는 것입니다. 롬복은 반복적으로 나타나는 코드(보일러 플레이트)들을 줄여줍니다. 하나의 어노테이션으로 65줄의 코드를 5줄로 바꿔줍니다.
@Data 어노테이션은 자동으로 모든 getter, setter, toString, constructor, hashCode, equals 메소드를 만들어 줍니다. 혹은 개별적인 어노테이션을 사용하여 필요한 기능만 사용할 수도 있습니다.
📌 롬복의 문제점
다만 롬복에는 몇 가지 문제점이 있는데, 가장 큰 두 가지는 다음과 같습니다.
Third-party 의존성: 새로운 자바 버전과 호환성 문제가 있거나 라이브러리가 지원되지 않는 경우 코드에 문제가 생길 수 있습니다.
IDE 호환성: 일부 IDE는 롬복 기능을 지원하지 않아 코드를 생성하는데 문제가 있을 수 있습니다.
📌 좋은 대안이 있을까요?
네, 레코드를 사용할 수 있습니다. 레코드는 무엇일까요?
레코드는 자바 16에서 도입된 새로운 기능입니다. 레코드는 데이터를 캡슐화하기 위한 클래스를 정의할 수 있는 간단한 방법을 제공합니다. 클래스의 필드를 기본으로 생성자, equals, hashCode, toString과 같은 일반적은 메소드를 자동으로 생성하는 클래스 유형입니다.
📌 레코드는 어떻게 사용하나요?
User 클래스의 레코드를 정의하기 위해, 다음과 같은 코드가 필요합니다.
```
public record UserRecord(String username, String email, int userId) {
}
```
이것이 끝입니다. 단지 한 줄의 코드로 65줄의 전통적인 코드와 5줄의 롬복 코드를 대체할 수 있습니다. 또한, 롬복과 다르게 써드 파티 라이브러리에 의존하지 않습니다.
📌 레코드 알아보기
```
// Initialize the record.
UserRecord userRecord = new UserRecord("rana", "rana@yopmail.com", 1234);
// get the properties
System.out.println(userRecord.email());
System.out.println(userRecord.toString());
```
명심하세요. 레코드는 getter 메소드에서 'get' 키워드를 사용하지 않습니다. 단지 변수 이름을 메소드 이름처럼 사용합니다. getEmail()이 아닌 email()을 사용합니다.
한번 초기화된 레코드의 변수를 바꿀 수는 없습니다. 모든 변수가 final입니다. 즉 레코드는 불변입니다.
📌 롬복 vs 레코드
불변성: 롬복(X) 레코드(O)
확장성: 롬복(O) 레코드(X)
보일러 플레이트 코드: 롬복(줄임) 레코드(줄임)
가독성: 롬복(비교적 어려움) 레코드(비교적 쉬움)
써드 파티 의존성: 롬복(O) 레코드(X)
IDE 호환성: 롬복(쉽지 않음) 레코드(쉬움)
다음 내용이 궁금하다면?
이미 회원이신가요?
2023년 10월 30일 오전 10:16
생성자로만 사용하게되면 멤버변수가 수정되었을때 생성자가 사용된 코드 전체를 수정해야하는 불편함이 있을 것 같은데 해결 방안이 있을까요?
실제로도 많이 사용되나요? 사용되지 않는다면 이유가 뭘까요?
갑론을박이 많이 있네요. 레코드에는 기본 생성자가 없기 때문에 현재 JPA 엔터티에 도움이 될 수 없어서 아직도 많은 사람들이 Lombok을 사용하고 있고 아직까지는 모든 기능에서 Lombok 을 완벽하게 대체할 수 없다고 합니다.
@대드래곤 저도 이 부분에 동의합니당
단점은 원하지 않은 public 함수 노출
클린 코드라고 부르기엔 아직까진 부족한 느낌이 듭니다. 제가 생각하는 클린 코드는 같은 언어를 개발하는 개발자가 와서 보기에 가독성이 뛰어난 코드라고 생각하고 있는데 레코드는 것은 아직 주변에서 애용하지않기에 가독성이 뛰어나지 않고 레코드를 모른다면 레코드에 대해 공부해야하는 부분이 발생할 수도 있다고 생각됩니다.
VO를 좋아해서 record를 애용하고 있습니다. 다만 롬복을 완벽히 대체하기보다는 같이 조화롭게 쓰고 있어요. 빌더를 통해 레코드 인스턴스를 생성한다던가..!
VO나 DTO 사용 시 좋습니다. JPA entity랑은 아쉽게도 잘 맞지 않지만.. 지저분한 어노테이션들이 뇌를 더 많이 일하게 만들기 때문에 충분히 가치가 있다고 생각해요.
1
... 더 보기1
... 더 보기