@NoArgsConstructor는 Lombok에서 제공하는 어노테이션으로,
매개변수가 없는 기본 생성자를 자동으로 생성.
@NoArgsConstructor
public class Member {
private String name;
private int age;
}
위 코드에서 @NoArgsConstructor가 붙으면 다음 코드가 자동 생성된다:
public Member() { }
JPA(Entity 클래스)에서는 기본 생성자(파라미터 없는 생성자)가 반드시 필요하다.
그 이유는 JPA가 엔티티 객체를 생성할 때 직접 new를 사용하지 않기 때문이다.
JPA는 데이터베이스에서 조회한 결과를 객체로 바꿀 때
Java Reflection API를 사용한다. (new 안씀)
이때 기본 생성자가 없으면 JPA가 객체를 생성할 방법이 없어 에러가 발생한다.
리플렉션(Reflection)은
프로그램이 런타임(실행 중)에
클래스의 구조(필드, 메서드, 생성자 등)에 접근하고 조작할 수 있게 해주는 기능이다.
예를 들어, 클래스 이름만 알고 있어도 다음처럼 접근 가능하다:
Class<?> clazz = Class.forName("com.example.Member");
Object obj = clazz.getDeclaredConstructor().newInstance(); // 기본 생성자로 객체 생성
이런 식으로 JPA는 런타임에 엔티티 클래스를 찾아서
리플렉션을 이용해 객체를 만들고, 필드에 값을 채워 넣는다.
결론적으로 @NoArgsConstructor사용하는 이유는 JPA에서는 기본 생성자가 무조건 있어야 하고, 이를 통해 생성자가 외부에서 함부로 호출되지 않게 하기 위함이다.
-> JPA 내부에서만 사용됨
-> 캡슐화와 불변성 유지