반응형
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
)
반응형
'Languages' 카테고리의 다른 글
Spring Boot과 JPA에 대해서 알아 봅니다. (0) | 2023.04.04 |
---|---|
spring boot에서 외부 static path 사용하기 (0) | 2023.04.04 |
spring boot 실행하는 방법과 외부 properties 설정 파일 읽기 (0) | 2023.04.04 |
서버에서 spring boot 애플리케이션 실행할 때 옵션과 실행 방법 (0) | 2023.04.04 |
Spring Boot에서 Main Class가 2개 일 때 빌드 하기 (0) | 2023.04.04 |