jdk 17 의 기능 중 record 에 대한 내용이다.
record 의 쓰임새
record 는 언제 쓰는 게 좋을까 ?
record 는 데이터를 저장하기위한 클래스로 생성된 인스턴스의 값을 변경할 수 없다.
그렇기 때문에, 서로 다른 계층 간 불변 데이터를 전송할 때 유용하게 쓰일 수 있으며 기본 메서드를 자동으로 생성해주어 편리하게 사용할 수 있다.
또한, 공식문서에서 확인할 수 있듯이 equals(), hashCode(), toString() 를 제공한다.
record 사용방법
1. DTO with record
사용자의 입력을 저장하여 데이터를 전달하는 MemberDTO 가 있다고 하자.
MemberDTO 가 사용자의 이메일, 비밀번호, 이름 필드를 가진다고 했을 때 record 로 생성한 예가 아래와 같다.
레코드 구성 요소는 레코드의 헤더에 선언되어야 하고 private final 로 정의된다.
또한, 생성자를 구현하지 않는다면 디폴트는 모든 필드를 갖는 생성자로 정의된다.
- record 로 구현한 MemberDTO
public record MemberDTO(
String email,
String passwd,
String name,
String mobile
) {
public MemberDTO(String email, String passwd, String name) {
this(email, passwd, name, "010-xxxx-xxxx");
}
}
- MemberDTO 인스턴스 생성
MemberDTO memberDTO = new MemberDTO("test@test.com","1234","홍길동");
- MemberDTO → Entity 변환
{
Member member = Member.builder()
.name(memberDTO.name())
.email(memberDTO.email())
.passwd(memberDTO.passwd())
.build();
}
record 에서 값을 꺼내려면 get필드명() 이 아닌, ~DTO.필드명() 을 사용하면 된다.
2. DTO without record
그렇다면 이제 record를 사용하지않고 같은 동작을 하는 MemberDTO를 구현해보자.
위와 동일하게 하기위해, 필드 모두를 전달받는 생성자만 작성했다.
- record 없이 구현한 MemberDTO
public class MemberDTO {
private String email;
private String passwd;
private String name;
public MemberDTO(String email, String passwd, String name) {
this.email = email;
this.passwd = passwd;
this.name = name;
}
@Override
public String toString() {
return "MemberDTO{" +
"email='" + email + '\'' +
", passwd='" + passwd + '\'' +
", name='" + name + '\'' +
'}';
}
public String getEmail() {
return email;
}
public String getPasswd() {
return passwd;
}
public String getName() {
return name;
}
}
정리
코드가 훨씬 간결해보여 때에 따라 사용하면 좋을 것 같다.
DTO 말고도 테스트 데이터로 사용할 수 있다고 하는데 관련 예제들을 좀 더 찾아봐야겠다.
참고
https://javatechonline.com/java-17-features/
https://javatechonline.com/record-in-java-with-examples/
'JAVA' 카테고리의 다른 글
[이펙티브자바] Item1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2023.10.15 |
---|---|
[Java] Access Level 에 관하여 (0) | 2023.09.24 |
[Java] stream.map() 동작 및 예제 (0) | 2023.08.20 |
[Java] stream.filter() 동작 및 예제 (0) | 2023.07.19 |
[Java] stream.reduce() 동작 및 예제 (2) | 2023.07.11 |