- @AllArgsConstructor 과 record 클래스의 차이2024년 11월 15일 15시 19분 19초에 업로드 된 글입니다.작성자: do_hyuk
아마 이 글을 읽는 사람들은 @AllArgsConstructor와 record를 왜 비교하는지 의문일 것이다.
이 의문을 가지게 된 이유는 트러블 슈팅으로부터 시작된다.
트러블 슈팅 글을 보고 난 뒤, RequireArgsConstructor 가 final로 선언된 멤버 필드만을 포함한 생성자를 만들어주기 때문에 문제라면 모든 멤버 필드를 만들어 주는 @AllArgsConstructor는 돼야 하지 않을까?라는 의문으로 테스트를 해보았다
결론은 역시 실패하고 말았다.
record 클래스도 기본 생성자를 생성하지 않는 것으로 알고 있는데 @AllArgsConstructor와 차이가 뭐지?? 라는 의문이 들어
이유를 찾아보니 record 클래스는 애초에 컴파일러에서 기본 생성자가 없으면 자동으로 생성해준다고 한다...
반면에 @AllArgsConstructor 는 기본 생성자는 생성해주지 않기 때문에 역직렬화를 위해 객체 생성을 해야 하는데 기본 생성자가 없기 때문에 문제가 발생했던 것이다.
결론
1. 기본 생성자와 Jackson의 역직렬화
- Jackson의 요구사항: Jackson은 JSON 데이터를 Java 객체로 변환(역직렬화)할 때, 객체를 생성할 수 있는 방법이 필요하다. 일반적으로, Jackson은 기본 생성자(매개변수가 없는 생성자)를 사용하여 객체를 생성한 후, JSON 필드 값을 해당 객체의 필드에 설정한다. 만약 기본 생성자가 없으면, Jackson은 객체를 생성할 수 있는 방법을 찾지 못해 HttpMessageNotReadableException 같은 오류를 발생시킨다.
2. record 클래스의 동작 방식
- 자동 생성자: record 클래스를 사용하면, 컴파일러가 생성자를 자동으로 생성된다.
'Spring' 카테고리의 다른 글
ThreadLocal이란? (1) 2024.04.28 연관관계 매핑 (1) 2024.01.22 Spring Data JPA란? (2) 2024.01.09 Spring JPA란? (1) 2024.01.09 Spring Cache란? (1) 2024.01.07 댓글