[Spring] org.springframework.orm.jpa.JpaSystemException: Error attempting to apply AttributeConverter

2024. 9. 26. 18:34·Java/Spring

 

오늘은 에러 로그 관련해서 포스팅을 진행하려고 합니다.

 

개발 도중에 발생한 Error log인데, Error log를 먼저 보여드리고 분석한 내용에 대해 설명드리겠습니다.

 

Error log

org.springframework.orm.jpa.JpaSystemException: Error attempting to apply AttributeConverter; nested exception is javax.persistence.PersistenceException: Error attempting to apply AttributeConverter
	at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:418)
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:227)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:436)
	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:131)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
	at com.sun.proxy.$Proxy212.save(Unknown Source)
	at com.piolink.cc.app.alarm.service.AbstractAlarmService.saveAlarmNow(AbstractAlarmService.java:123)
	at com.piolink.cc.app.alarm.service.AbstractAlarmService.saveAlarmNow(AbstractAlarmService.java:123)
	at com.piolink.cc.app.alarm.service.AbstractAlarmService.saveAlarm(AbstractAlarmService.java:111)
	at com.piolink.cc.app.alarm.service.IpConflictAlarmService.alarm(IpConflictAlarmService.java:45)
	at com.piolink.cc.app.ndm.service.NdmService.conflict(NdmService.java:226)
	at com.piolink.cc.app.ndm.service.NdmService$$FastClassBySpringCGLIB$$cb7d533e.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
	at com.piolink.cc.app.ndm.service.NdmService$$EnhancerBySpringCGLIB$$e851a393.conflict(<generated>)
	at com.piolink.cc.app.ndm.service.NdmRouteService.route(NdmRouteService.java:61)
	at com.piolink.cc.app.ndm.service.NdmRouteService.event(NdmRouteService.java:38)
	...

 

간략히 읽어봤을 때, AttributeConverter를 적용하려고 시도했지만 실패하게 돼서 발생한 에러라는 것을 확인할 수 있습니다.

 

이제 여기에서 Converter라는 개념이 나왔는데, 무엇인지 간단히 짚고 넘어가도록 하겠습니다.

 

@Converter

  • Entity에 Data를 변환하여 DB에 저장할 수 있게 해주는 annotation
  • Convert를 적용할 필드에 @Convert 어노테이션과 만들어준 Convert class를 지정해 주면 됩니다

 

Converter 생성 방법

  • AttributerConverter의 convertToDatabaseColumn, convertToEntityAttribute 메서드를 override 해주어야 합니다.
  • Entity ↔ DB 간의 데이터 변환이 가능해집니다.

 

Example

@Converter(autoApply = true) // global 설정
public static class DeviceTypeConverter implements AttributeConverter<DeviceType, Integer> {

    @Override
    public Integer convertToDatabaseColumn(DeviceType deviceType) {
        return deviceType.getType();
    }

    @Override
    public DeviceType convertToEntityAttribute(Integer deviceType) {
        return DeviceType.getType(deviceType);
    }
}

 

다음과 같은 컨버터를 어떠한 필드에 적용할 때, 변환이 실패해서 Error attempting to apply AttributeConverter 에러가 발생하게 됩니다.

 

관련 클래스를 간단히 살펴보도록 하겠습니다.

 

ValueBinder

  • Object -> DB로 Data 변환 

 

ValueExtractor

  • DB -> Object로 데이터 변환

위의 데이터 변환 메서드를 참고했을 때, 해당 메서드의 try ~ catch 문에서 엔티티의 값, 도메인 값에 Null이 들어가거나 변환이 불가능하면, 발생하는 Error입니다.  

 

해당 Error를 해결하기 위해, DB <-> Entity의 변환 과정에서 null 처리를 해주면 간단히 해결할 수 있게 됩니다.

저작자표시 비영리 변경금지 (새창열림)

'Java > Spring' 카테고리의 다른 글

[Spring] Spring Cloud Gateway (+ Eureka Server)  (2) 2024.10.26
[Spring] Spring Webflux  (1) 2024.10.23
[Spring] @Transactional isolation level, propagation level, timeout  (5) 2024.09.23
[Spring] Spring Security 동작 원리 파악 (id, pw 기반의 basic auth 방식)  (0) 2024.09.06
[Spring] org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)  (0) 2024.09.04
'Java/Spring' 카테고리의 다른 글
  • [Spring] Spring Cloud Gateway (+ Eureka Server)
  • [Spring] Spring Webflux
  • [Spring] @Transactional isolation level, propagation level, timeout
  • [Spring] Spring Security 동작 원리 파악 (id, pw 기반의 basic auth 방식)
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (389) N
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (24)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (4) N
        • Effective Java (7)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (3)
        • MatJido (3)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    일본여행
    docker
    Spring
    BFS
    Wi-Fi
    다이나믹 프로그래밍
    dp
    springboot
    이펙티브 자바
    Effective Java
    컴퓨터구조
    sqld
    메타코딩
    AWS
    정보처리기사
    dfs
    정보처리기사 필기
    백트래킹
    정보처리기사 실기
    너비 우선 탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[Spring] org.springframework.orm.jpa.JpaSystemException: Error attempting to apply AttributeConverter
상단으로

티스토리툴바