우아한테크코스 테코톡
타칸의 Record
카테고리 : 우아한테크코스 테코톡
https://youtu.be/MiHxFpTgAog?si=uzJpIzoVnuNmL90H
타칸의 Record
Record 란 무엇일까?
- 레코드에 대해서 이해하기 위해서는 우선 불변객체에 대해서 이해하면 좋다
- 자바로 프로젝트를 진행하다 보면 데이터베이스 결과, 쿼리 결과, 서비스 정보와 같은 데이터를 단순히 담기 위한 객체를 생성하게 되는데 이때 대부분의 경우 불변객체를 사용하게된다 왜냐하면 불변객체를 사용하게 됨으로써 내부 필드값의 불변성을 보장해 주어서 유지보수에서 많은 이점을 챙길 수 있기 때문이다
- 불변 객체를 사용하기 위해서는 너무나 귀찮은 작업들을 해줘야 된다는 게 단점이다
- 귀찮은 작업들
- private final로 변수들을 선언
- 해당 객체를 만들기 위한 생성자 만든다
- 객체의 동등성을 비교하기 위해서 equals랑 hashCode를 구현
- 필드값에 접근 하기 위해서 getter들도 정리
- 디버깅을 위해서 toString도 정리
- 소위 말하는 Boilerplate 코드가 많다는 문제점이 발생
- Boilerplate: 최소한의 수정으로 여러 곳에서 자주 반복되는 코드
- 레코드를 사용하게 되면 간단하게 한 줄로 정의해 줄 수 있습니다
어떻게 사용할까?
- 레코드는 일반 객체와 다르게 선언 동시에 내부에서 사용할 필드값들을 정의를 해줘야 된다 만약에 여기에서 정의를 해주지 않고 내부에서 추가해주고 싶다 하면 에러가 발생하게 된다
- 하지만 예외적으로 static으로 된 정적 필드는 추가해줄 수가 있다
- 호출 부분을 살펴보면 레코드는 일반 객체와 동일하게 new 키워드를 통해서 객체를 생성한 다음에 사용하면 된다 그런데 일반 객체와 살짝 다른 점이 있다면 내부 필드값을 접근할 때 앞에 get이 붙지 않는 name getter를 고쳐줄 수 있다
- 레코드는 기존에 있던 Boilerplate 코드를 자동으로 재생성한다 근데 만약에 정의된 게 마음에 안 든다 하면 본인이 필요한 메서드만 재정의를 하면 된다
- 레코드에서는 일반 객체와 다르게 조금 특별한 기능을 제공하는데 컴팩트 생산자라는 기능을 제공한다 컴팩트 생산자 기능을 사용하면 만약에 생성자에서 사용하는 파라미터와 레코드 필드 값이 서로 동일한 경우는 생략해 줄 수가 있고
this.name = name
과 같은 할당 부분도 생략해 줄 수가 있다
왜 getXXX를 안쓸까?
- 레코드에서는 .name과 .address가 앞이 get이 붙지 않은 상태로 호출되는데 레코드의 정의를 살펴보면은 레코드를 선언할 때 간결성을 제공하지만 Boilerplate와의 전쟁을 선언하는 것이 목표가 아니다 그리고 일반 클래스의 문제를 해결하는 것이 목표가 아니다 라고 명시가 되어 있다 즉 레코드는 일반 객체의 문제점을 해결하기 위해 등장한 것이 아니기 때문에 둘을 엄연히 다른 것이다 그래서 레코드가 일반 객체의 컨벤션을 따를 필요는 없다
Lombok을 사용하면 안될까?
- 가독성 측면에서 살펴보면 레코드가 좀 더 간결하다
- 기능적으로 살펴보면 Lombok은 Data나 All Argument Constructor 뿐만 아니라 빌더, SLF4J 같은 추가적인 다양한 기능을 제공하고 있다
- 의존성 문제를 한번 살펴보면 Lombok 같은 경우는 외부 라이브러리이기 때문에 별도의 라이브러리를 설치해줄 필요성이 있다 반면에 레코드는 자바 정식 스펙이기 때문에 JDK16 이상을 사용하면 별도의 라이브러리 설치 없이 사용할 수 있다
- 상황에 맞게 사용하면 된다 간결하고 의존성이 없는 프로젝트를 만들고 싶다 하면 레코드를 사용하는 게 좋은 선택 그것보다 나는 기능과 유연성을 챙기고 싶다 Lombok을 사용하는 게 좋은 선택
도메인 객체로 사용할 수 있을까?
- 지양하는 것이 좋다 레코드의 공식 문서를 다시 살펴보면 레코드는 불변 데이터를 전달하기 위한 캐리어다 라고 정확히 명시가 되어 있다 그리고 단순한 값의 집합을 표현하는 객체지향적인 구성을 고안하고 확장 가능한 동작보다는 불변 데이터 모델링에 집중할 수 있도록 도와준다 라고 명시가 되어 있다
- 도메인 객체는 단순히 데이터를 갖고 있는 것뿐만 아니라 추가적인 비즈니스 로직이 들어가는 경우가 대부분이기 때문에 단순히 데이터만 전달하기 위해 사용되는 레코드의 목적성에는 부합하지 않는다고 볼 수 있다
- 레코드는 도메인 객체보다는 DTO에서 활용하시는 것이 좋다