과제테스트를 1차적으로 완성하고 마감기한에 여유가 있어 리팩토링을 진행했다.
원래는 관심사의 분리가 덜 된 곳을 분리할 계획이었는데, 최근에 java 17버전에서 추가된 기능에 대해 공부하다가 관심이 생겼던 Record가 문득 떠올라 적용해보게 되었다.
그리고 적용하자마자 신세계를 보게 되었다. 111줄짜리 코드가 33줄로 바뀌는 마법.. 더 줄이자면 줄일 수 있었지만, 가독성을 위해 적당히 줄였음에도 이전과는 확연한 차이를 볼 수 있었다.
record 적용전
record 적용후
먼저 간단히 설명하자면, Record는 Java17 버전에서 추가된 기능으로 불변 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스이다.
컴파일러가 헤더를 통해 내부 필드를 추론하기 때문에 필드와, setter, getter를 만들지 않아도 된다는 장점이 있다.
또한 생성자를 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공해주기 때문에 매우 편리하다.
말로 설명하면 어려우니 바로 코드를 확인해보자
먼저 이름과 나이를 가진 Person객체를 만들어보겠다.
필드, 생성자, getter가 있다.
여기서 Record를 이용해 변경해준다면
필드, 생성자, getter가 없어도 위와 동일한 기능을 하는 코드가 구현된다.
record 클래스가 자동으로 구현해주기 때문이다.
두 코드를 비교하다보면 아래의 코드로 위의 코드를 충분히 유추할 수 있다는걸 파악할 수 있을 것이다.
getter를 사용하고 싶다면 아래처럼 get없이 불러와서 사용하면 된다.
person.naem()
추가 정보
만약 @NotBlank, @NotNull 같은 어노테이션을 필드에 적용시키고 싶다면, 이런식으로 인자 앞에 붙여주면 된다
그러면 이런식으로 인자로 들어오는값이 공백일때 잘처리되는지 확인하는 테스트가 record로 변경해도 정상적으로 통과되는걸 확인할 수 있다.
Record를 한번 써버리니 이전으로 돌아갈 수 없을 것 같다는 생각이 든다. 이렇게 편리하다니..!
작성한 코드에서 신기술을 이용해 더 편리하고 읽기좋게 만드는게 이렇게 재밌는거구나를 깨달을 수 있는 경험이었다.
최근에 지인이 소속된 회사에서 Java 17로 업그레이드하고 record를 적용하려 했으나, 사용 중인 Spring Framework 버전에서 사용한 코드들이 호환되지 않아 실패하고 보류하게 되었다고 한다.
이처럼 회사에서 신기술을 적용하는 과정이 어려울 수는 있지만, 앞으로 개발자로서 이런 경험을 많이 할 수 있는 회사에 갈 수 있으면 좋겠다는 생각이 든다.