record 란?
기존 코드
package number.study;
import lombok.Getter;
@Getter
public final class practice {
private final String name;
private final int age;
public practice(String name, int age) {
this.name = name;
this.age = age;
}
}
record 사용 코드
package number.study;
public record practice(String name, int age) {
}
레코드를 사용하면 위의 코드가 아래의 코드로 변하게 된다
레코드는 보일러 플레이트 코드를 제거하기 위해 등장했다
(위의 클래스에선 private final, @Getter, 생성자 등이 해당)
레코드는 보일러 플레이트 코드를 제거하여 간결하게 표현하도록 도와주고, 불변 객체를 손쉽게 만들도록 도와준다
접근자와 생성자, toString, equals, hashCode 등을 선언하지 않아도 자동으로 구현되어있다
레코드는 DTO 로서 적합한 형태이다
읽어오는 것은 허용하되, private final 로 모든 필드를 설정하고 @Setter 를 제한하기에 한 번 값이 정해지고 나면 값이 변질되지 않는다
... 그래서 나도 record 를 DTO 로 사용하던 중 생각치못한 불편함을 겪게 되었다
내가 겪었던 불편함
예를 들어 이런 클래스가 있다고 생각해보자
package number.study;
public final class Practice1 {
private final String name;
private final int age;
private Practice1(String name, int age) {
this.name = name;
this.age = age;
}
public static Practice1 of(String name, int age) {
return new Practice1(name, age);
}
}
private 으로 생성자가 외부에서 호출되는 것을 막았다
이후, 정적 팩토리 메서드를 사용하여야만 이 객체를 생성할 수 있도록 구현하였다
이것을 record 로 바꾸면 어떻게 될까?
package number.study;
public record Practice(String name, int age) {
private Practice(String name, int age) { // 컴파일 에러 발생!
this.name = name;
this.age = age;
}
public static Practice of(String name, int age) {
return new Practice(name, age);
}
}
컴파일 에러가 발생하게 된다
결국 record 를 사용하는 경우 정적 팩토리 메서드로'만' 객체를 생성할 수 있게 만드는 것은 불가능 하다
record 에 대한 나의 생각
레코드는 보일러 플레이트 코드를 줄여주는 매력적인 도구이다
하지만 레코드가 너무 많은 필드를 가져버려서, 혹은 다른 이유로 '정적 팩토리 메서드로만 생성하게 하고 싶은 경우' 에는 레코드는 별로 좋은 선택지가 아니라고 생각한다 (물론 클래스가 너무 많은 필드를 가진다는 것 자체가 좋지 않은 상황이다)
위에 서술한 특수한 경우를 제외하고는 record 를 dto 로 사용하는 것은 꽤 좋은 선택이라고 생각한다
레코드의 단점들로 흔히 언급되는 상속 불가, abstract 선언 불가 등 대부분의 단점들은 dto 는 예외인 경우가 많기 때문이다
record 를 사용하기 전에 다시 한번 생각해보아야 한다
과연 이 클래스를 record 로 만들어도 되는가? 정적 팩토리 메서드를 배제하여도 괜찮은가?
만일 우선 record 로 만들고나서 코드를 작성하다보니 아닌거같으면 이후에 수정하는 것이 많이 힘들테니..
'Java > Java 기본' 카테고리의 다른 글
함수 파라미터에 final 을 붙이는 이유 (매개변수의 재할당 금지) (0) | 2024.08.30 |
---|---|
DIP 와 인터페이스 소유권의 역전 (0) | 2024.08.26 |
[간단] id 의 타입을 long 이 아니라 굳이 Long 으로 주는 이유 (0) | 2024.08.19 |
컴파일러와 JVM 을 곁들인 상속의 원리 (동적 바인딩) (1) | 2024.07.24 |
클래스와 다형성, 그리고 오버라이딩 (2) | 2024.07.23 |