본문 바로가기
Languages

spring boot과 JPA 에서 InvalidDataAccessApiUsageException 에러 해결하기

by lucidiz 2023. 4. 4.
반응형

Spring Boot

Spring Boot에서 JPA는 자바 ORM 기술의 표준 스펙인 JPA(Java Persistence API)를 사용하여 데이터베이스에 접근하는 방법입니다. JPA를 사용하면 데이터베이스와의 상호작용을 추상화할 수 있으며, 데이터베이스의 변경 사항에 대응하는 코드 변경을 최소화할 수 있습니다.

 

Spring Boot에서 JPA를 사용 시, 다음과 같은 에러가 발생하였습니다.

 

처음 URL을 호출할 때는 정상, 두 번째 호출할 때는 아래와 같은 에러 발생



org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [\] did not match expected type [java.lang.String (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [\] did not match expected type [java.lang.String (n/a)]

	at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:235)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551)
	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
 

 

위의 에러의 원인은 Spring Boot 버전과 JPA의 버전의 문제였습니다. 그리고 저는 다음과 같이 해결하였습니다. 

변경전 변경후
Spring Boot 2.6.6
JPA 2.6.6
Spring Boot 2.6.2
JPA 2.6.2

 

위의 에러에 대해서 문제가 발생한 코드는 다음과 같습니다.

3-1, 3-2 모두 결과는 동일하고 정상 코드입니다. 개인적으로는 3-1이 깔끔해서 선호합니다.

 

< 3-1 >

FlashCardsRepository.kt

interface FlashCardsRepository : JpaRepository<Flashcards, Int> {
    fun findByEngEndsWith(eng: String?): List<Flashcards>
}
 

FlashcardRestController.kt

@RestController
class FlashcardRestController (private val flashcardRepository: FlashCardsRepository) {
    @GetMapping("/getFlashcard/{eng}")
    fun getFlashcard(@PathVariable eng: String): List<Flashcards> {
        return flashcardRepository.findByEngEndsWith(eng)
    }
}

 

< 3-2 >

FlashCardsRepository.kt
interface FlashCardsRepository : JpaRepository<Flashcards, Int> {
    fun findByEngEndsWith(eng: String?): Iterable<Flashcards>
}
 

FlashcardRestController.kt

@RestController
class FlashcardRestController (private val flashcardRepository: FlashCardsRepository) {
    @GetMapping("/getFlashcard/{eng}")
    fun getFlashcard(@PathVariable eng: String): Iterable<RenderedFlashcard> {
        return flashcardRepository.findByEngEndsWith(eng).map { it.render() }
    }
}

fun Flashcards.render() = RenderedFlashcard(
        id,
        eng,
        kor,
        image_file,
        sound_file,
        sound_type
    )

    data class RenderedFlashcard(
        val id: Int,
        val eng: String,
        val kor: String,
        val image_file: String,
        val sound_file: String,
        val sound_type: String
    )

 

 
반응형