레코드 클래스는 자바 14부터 도입된 데이터 담는 클래스로, 필드와 필드에 대한 getter 메소드, equals(), hashCode(), toString() 메소드를 자동으로 제공한다.
리플렉션은 자바가 동적으로 실행 중인 애플리케이션의 내부를 조사하고 수정할 수 있도록 해주는 기능이다. 레코드 클래스의 필드를 동적으로 접근하거나 변경하는 것은 불가능하지만, 리플렉션을 통해 레코드 클래스의 메타데이터를 얻는 것은 가능하다.
예를 들어, 아래와 같은 레코드 클래스가 있다고 하자.
public record User(String name, String email, int age) {}
이 레코드 클래스의 메타데이터를 얻기 위해 아래와 같이 리플렉션을 사용할 수 있다.
User user = new User("홍길동", "hong@gmail.com", 30);
Class<?> cls = user.getClass();
System.out.println("클래스 이름: " + cls.getName());
System.out.println("슈퍼클래스: " + cls.getSuperclass());
System.out.println("필드: " + Arrays.toString(cls.getRecordComponents()));
레코드 클래스를 JSON으로 변환하거나 JSON을 레코드 클래스로 변환하는 것도 가능하다. 이를 위해 Jackson 라이브러리를 사용할 수 있다.
예를 들어, 아래와 같이 레코드 클래스를 JSON으로 변환할 수 있다.
User user = new User("홍길동", "hong@gmail.com", 30);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
반대로, JSON을 레코드 클래스로 변환하는 것도 가능하다.
String json = "{\"name\":\"홍길동\",\"email\":\"hong@gmail.com\",\"age\":30}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user);
레코드 클래스는 간결성과 불변성 등의 장점을 가지지만, 리플렉션을 통한 동적 접근이 제한적이고 빌더 패턴을 자동으로 지원하지 않는 등의 단점도 있다. 이것에 대해선 어제 자세히 써놨으니 참고 바란다!!!
레코드클래스의 장단점