본문 바로가기
IT/JPA

[JPA] - 스프링부트 프로젝트에서 JPA 사용 시 @Entity 클래스 테이블 인식이나 생성 안될 때 해결 방법

by 차이나는 개발자 2024. 2. 18.
728x90
반응형

스프링부트 프로젝트에서 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)하는 데 사용합니다.

 

 

 

728x90
반응형

댓글