[JPA] InstantiationException

한상희·2024년 12월 7일

JPA

목록 보기
1/2
post-thumbnail

개요

Spring 공부중 오류가 하나 Item Entity 클래스에 생성자를 추가하니깐 오류가 생겼습니다.


해결

급한 사람들 위해 먼저 설명하자면 기본 생성자를 추가해주면 오류가 없어집니다.

또는

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class ExampleEntity {
    @Id
    private Long id;
    private String name;
}

Lombok을 사용해도 됩니다.


궁금증

왜 인자가 없는 생성자를 넣어주면 오류가 없어지지?

일단 먼저 궁금증을 풀기전에 알아야되는 개념이 있는데 알아봅시다.


리플렉션

리플렉션

  • 객체를 통해 클래스의 정보를 분석해 내는 기법
  • 구체적인 Class Type을 알지 못해도, 그 Class의 생성자/메서드/변수에 접근할 수 있는 자바 API

뭔 소리임

사람 시점에서 봅시다.
우리가 이 클래스를 처음 본다고 해봅시다.

Car car = new Car();
car.{사용할 메서드} // <- 뭐 있는지 모름

그러면 Car 클래스안에 어떤 메서드가 있을까요? → 아무도 모름(저도 모름)
이제 그러면 어떤 메서드가 있는 알려면 Car 클래스를 파일에 들어가서 분석을 해야됩니다.

컴퓨터도 똑같습니다. 실행할때 Car를 분석합니다.

좀 더 있어보이게 말해보자면
런 타임에 동적으로 클래스의 정보를 분석, 추출을 하는 프로그램 기법

자바 컴파일러는 클래스 파일은 바이트 코드로 컴파일되어서 Static 영역으로 들어갑니다. 그래서 클래스 이름(Car)만 알고 있으면, 언제든 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있습니다.

즉, 이름만 알고 있으면 클래스를 뒤져서 정보를 가져옵니다.

이걸 Reflection이라고 합니다.

정리

Reflection 은 런타임에 동적으로 클래스를 분석하여 활용하는 프로그래밍 기법


궁금증 해결

리플렉션이 뭔지 알았으니 계속 설명하겠습니다.

JPA 2.0 부터 다음과 같이 적혀있습니다.

엔티티는 반드시 파라미터가 없는 public 또는 protected 생성자 있어야 합니다.

먼저 자바에서 생성자 없이 객체를 생성하면 알아서 빈 생성자를 생성해줍니다.

public class Car {

/*
	public Car() {    <- 알아서 생성
	}
*/

	String model;
	Long km;
}

그런데 만약에 파라미터가 있는 생성자가 먼저 있으면 안 만들어 줍니다.

public class Car {

	String model;
	Long km;
	
	// 파라미터 있는 생성자
	public Car(String model, Long km) {
		this.model = model;
		this.km = km;
	}

}

JPA는 리플렉션을 하기 위해 해당 Entity 객체의 default Constructor를 이용하여 객체를 생성한다.

근데 리플렉션으로 가져 올 수 없는 정보가 있습니다.
바로 Constructor의 인자(파라미터) 정보들입니다.

JPA → 생성자 접근 → 생성자(인자 있음) → 생성 못함 → 오류


요약

JPA 리플렉션은 애플리케이션을 생성할때 기본 생성자로 생성하는데 기본 인자가 있는 생성자가 있으면 생성을 못해서 기본 생성자를 생성해줘야 됨


profile
안녕하세요

0개의 댓글