본문 바로가기
📗 JPA

[Spring Data JPA] JPA Enum 필드에 관한 문제

by GroovyArea 2023. 2. 21.

참나.

오늘 5시간 날렸다.

Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다.

 

빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말.

 

문제점

결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다.

 

문제는 JPA Enum 필드가

@Enumerated(EnumType.STRING)

ㅣ이 아니라, Ordinal로 들어가 발생한 문제다.

 

지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다.

4 이상의 숫자는 있어서는 안될 데이터다.

 

그래서 계속 이런 에러가 발생했다.

java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4

 

쿼리를 발생시켜 데이터를 매핑하는 과정에서 5의 ordinal 이 없어 index를 5로 잡아놨지만, 매핑을 못하는 바람에 저런 예외가 발생했다.

기존 데이터가 5로 들가있다.

DB 데이터 중 숫자가 5인 것을 겨우 발견했고, 수정했다.

근데, 왜 잘못된 숫자가 들어있지?? 아직도 의문이네..

 

고찰

한창 JPA를 공부하며 김영한님의 책을 읽고, 강의를 들으며 가슴에 새긴 말은 Enumerated String을 사용하라는 말인데, 

뭐 문자열로 DB 에 저장하면 뭐 가독성 좋고, 쉽게 파악되니 좋겠지 하며 넘겼다.

 

ordinal로 했을 때의 단점은 숫자이기에 값의 의미를 명확하게 파악하기 힘들어 단순히 가독성이 좋지 않겠구나라고 생각했었다.

 

하지만 잘못된 ordinal 숫자 값이 들어갔을 때는, 이런 예외가 발생할 거라고 상상을 못했다.

무엇보다 잘못된 숫자가 당연히 들어갈리 없다고 생각했다.

 

오늘 하나 배우고 갑니다.

웬만하면 String 전략을 이용하여 매핑하고, DB의 데이터를 한번 더 체크해보자라는 결론을 얻었다.

다시는 이런 삽질 않아야지..

 

 

반응형