본문 바로가기

개발중/troubleshooting

[JPA] org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

728x90
반응형

 

InvalidDataAccessResourceUsageException 오류 발생

InvalidDataAccessResourceUsageException 예외는 스프링 프레임워크에서 데이터 액세스 중에 잘못된 사용으로 인해 발생하는 일반적인 예외입니다. 이 예외는 주로 데이터베이스와 상호 작용할 때 잘못된 SQL 문법, 잘못된 데이터베이스 스키마 이름, 존재하지 않는 테이블에 대한 쿼리, 데이터 타입 불일치 등 데이터 액세스 계층에서 발생하는 다양한 문제들을 나타냅니다.

 

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

 

 

실제 도메인은 아래와 같이 구성되어있습니다.

 

@Entity
@Table(name = "FILE_PATH")
public class FileDomain {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long seq;

    @Column(name = "type", nullable = false)
    private String type;
}

 

 

file_path 라는 테이블이 존재하지 않는다고 에러 메세지가 발생하였습니다.

 

Caused by: java.sql.SQLSyntaxErrorException: Table 'SOOBIN.file_path' doesn't exist

 

 

문제는 FileDomain 엔티티가 참조하고 있는 "FILE_PATH" 테이블이 데이터베이스 SOOBIN에 존재하지 않기 때문에 발생하고 있습니다. 

 

이러한 경우는 대소문자 구분이 발생하는 환경에서 자주 볼 수 있는데, 특히 Linux 기반의 MySQL 서버에서는 테이블명의 대소문자가 구분됩니다.

첫 번째로 확인해야 할 사항은 실제 테이블의 이름이 어떻게 생성되었는지입니다. 만약 데이터베이스가 대소문자를 구분하는 설정(lower_case_table_names=0)으로 되어 있다면, FILE_PATH와 file_path는 서로 다른 테이블로 인식됩니다.

 

 

하지만 db 설정을 바꾸는 것이 부담되기 때문에 Spring Boot 설정으로 @Table 에 명시된 테이블 명으로 조회가 가능하도록 수정하였습니다.

 

spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

 

해당 설정을 추가하니 Table 명이 명시된 대로 정상적으로 동작하는 것을 확인할 수 있었습니다.

728x90
반응형