record는 불변 데이터를 객체 간에 전달하는 작업을 간단하게 만든다. Java 14부터 도입되어 16 버전에서 정식으로 채택된 클래스이다. record Type을 사용하면 불필요한 코드를 제거할 수 있고, 적은 코드로도 명확한 의도를 표현할 수 있다.
public class UserDto {
private String userName;
private String userPhoneNumber;
public UserDto(String userName, String userPhoneNumber) {
this.userName = userName;
this.userPhoneNumber = userPhoneNumber;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPhoneNumber() {
return userPhoneNumber;
}
public void setUserPhoneNumber(String userPhoneNumber) {
this.userPhoneNumber = userPhoneNumber;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserDto userDto = (UserDto) o;
return Objects.equals(userName, userDto.userName) &&
Objects.equals(userPhoneNumber, userDto.userPhoneNumber);
}
@Override
public int hashCode() {
return Objects.hash(userName, userPhoneNumber);
}
@Override
public String toString() {
return "UserDto{" +
"userName='" + userName + '\'' +
", userPhoneNumber='" + userPhoneNumber + '\'' +
'}';
}
}
유저 정보를 가지는 Dto 입니다. 이름과 전화번호만 사용하는데 보일러 플레이트 코드가 많은 것을 볼 수 있다.
보일러 플레이트 코드
최소한의 변경으로 여러 곳에서 재사용 되면 반복적으로 비슷한 형태를 가지고 있는 코드
(getter, setter, equals, hashCode,toString
public record UserRecordDto(String userName, String userPhoneNumber) { }
UserDto 코드와 비교하면 많은 것들이 사라진 것을 볼 수 있다.
Record의 구조는 recorde (header) {body}
의 구조로 되어있다. 컴파일러는 헤더를 통해 String type의 userName, userPhoneNumber 이 있다는 것을 인식 후 코드에 명시적으로 접근제어자, constructor, getter, hashCode, toString, equals의 구현을 자동으로 제공한다.
public class DtoTest {
public static void main(String[] args) {
UserDto userDto = new UserDto();
userDto.setUserName("aaaa");
userDto.setUserPhoneNumber("00000000");
System.out.println(
userDto.getUserName() + userDto.getUserPhoneNumber()
);
UserRecordDto userRecordDto = new UserRecordDto("bbbb", "1111111");
System.out.println(
userRecordDto.userName() + userRecordDto.userPhoneNumber()
);
}
}
또한 record를 사용하게 되면 getUserName(), getUserPhoneNumber()
을 사용하는 것이 아닌 userName(), userPhoneNumber()
만 사용하는 것을 볼 수 있다.
FastCampus 강의를 보다가 강의 내용에 record를 사용하는 것을 보고 실무에서 Java 16 버전 이상을 사용한다면 적용해보고 싶어서 간략하게 정리를 해봤습니다.
Oracle Java Record
openjdk
https://s7won.tistory.com/2
https://coding-start.tistory.com/355
https://devhooney.tistory.com/203
https://velog.io/@power0080/java%EC%9E%90%EB%B0%94-record%EB%A5%BC-entity%EB%A1%9C