스프링부트 프로젝트에서 JPA 사용 시 @Entity 클래스 테이블 생성 안될 때 해결 방법
JPA 사용 시 엔티티 클래스에 @Entity 어노테이션을 적용했는데도 인식이 안되거나 서버 재기동 시 테이블이 자동으로 생성되지 않는 경우가 있습니다. 그 이유로는 개발 툴, 스프링 등 각종 라이브러리 버전 차이 등 다양한 문제로 인해서 엔티티를 사용할 수 없는 경우가 꾸준히 생기고 있습니다. 이를 해결하기 위한 방법을 하나 알려드리겠습니다.
@Entity 엔티티 클래스
Answer 클래스에 @Entity어노테이션을 선언해서 엔티티 클래스가 되었지만 서버 재기동 시 테이블이 생성되지 않았습니다. 인텔리제이에서는 문제가 없었지만 STS를 사용할 때 해당 문제가 발생했습니다. 개발 툴과 버전문제로 보입니다.
package com.mysite.sbb;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime createDate;
@ManyToOne
private Question question;
}
application.properties
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.mysite'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2:2.1.214'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
tasks.named('test') {
useJUnitPlatform()
}
해결방법 @EntityScan 어노테이션 사용
해당 문제는 @EntityScan을 사용함으로써 해결하였습니다.
결국 특정 환경에서 @Entity가 인식이 안되거나 사용이 불가할 때 @EntityScan을 사용해 보시면 될 것 같습니다.
테스트 환경:
개발툴: STS
자바 버전: 17
스프링부트 버전: 3.1.0
@EntityScan란? 사용법
스프링부트에서 JPA(Java Persistence API)를 사용할 때 `@EntityScan`은 스프링부트 애플리케이션의 특정 패키지나 패키지들을 스캔하여 JPA 엔티티를 찾아내도록 지정하는 어노테이션입니다. `@EntityScan`을 사용하면 JPA 엔티티 클래스들이 위치한 패키지를 설정할 수 있으며, 이는 스프링 데이터 JPA가 엔티티 관리자(Entity Manager)를 통해 해당 엔티티들을 인식하고 관리할 수 있게 해 줍니다.
예를 들어, 엔티티 클래스들이 com.mysite.sbb 패키지 안에 있다면, 스프링부트 메인 애플리케이션 클래스에 `@EntityScan`을 다음과 같이 선언할 수 있습니다:
프로젝트 메인 클래스
package com.mysite.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@SpringBootApplication
@EntityScan(basePackages = {"com.mysite.sbb"})
public class SbbApplication {
public static void main(String[] args) {
SpringApplication.run(SbbApplication.class, args);
}
}
이렇게 설정함으로써 스프링 데이터 JPA는 지정된 패키지 안의 `@Entity` 어노테이션이 붙은 클래스들을 엔티티로 인식하고, 이를 데이터베이스 테이블과 매핑하여 데이터를 영속화(persist)하는 데 사용합니다.
댓글