Java Generci을 보면 int와 같이 데이터 타입이 아닌 Intger과 같이 Class를 사용해야 하는 것을 볼 수 있다.
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
User findByUsername(String username);
User findByPassword(String password);
}
이 예시처럼 JpaRepository에 들어가는 User의 Entity 말고, Integer에서 Class가 들어간다.
그 이유를 알아보자
Java에서 Generics는 컴파일 시점에 타입을 체크하고 타입 안전성을 보장하는 메커니즘이다.
기본형 타입 int, double 등의 값은 스택에 저장되는 값이고,
Generic은 힙 메모리에 할당되는 객체 참조를 다루기 때문에,
객체로 다뤄지는 참조형 타입만 지원되는 것이다.
한줄 요약 : JpaRepository의 경우 깐깐한 놈이라서 Generic 규칙을 보다 잘 지켜야 한다.
// 불가능한 코드
public interface UserRepository extends JpaRepository<User, int> { // 오류 발생
}
: 위 코드는 int가 기본형이므로 컴파일 오류가 발생한다.. Generics는 기본형을 허용하지 않기 때문에 반드시 참조형인 Integer를 사용해야 한다.