
{
"diaryName": "user3@email.com 2023-09-06",
"conversation": [{"role":"user", "content": "오늘은 정말 힘든 하루였어..."}, {"role":"assistant", "content": "그랬구나 어떤 일이 있었어? 이야기 해보자."}, {"role":"user", "content": "오늘 일을 늦게 해서 과장님께 혼났어."}, {"role":"assistant", "content": "정말 힘든 하루였겠다."}, {"role":"user", "content": "그래도 얘기하니까 좀 낫다."}, {"role":"assistant", "content": "도움이 되었다니 기쁩니다."}]
}
이 과정에서 마주했던 여러 에러들과 해결 방안에 대해 공부해보겠다.
현재 4, 5번 과정을 해결하지 못해서 자꾸 에러를 마주하고 있다.
상황
SQL Error: 1366, SQLState: HY000
Incorrect string value: '\xAC\xED\x00\x05ur...' for column 'conversation' at row 1
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only] with root cause
JPA에 conversation 내용을 저장하는 과정에서 위의 에러가 발생했다.
검색 결과 유추 가능한 원인
궁금증
@Convert(converter = ConversationConverter.class) // @Convert 어노테이션을 사용하여 컨버터를 지정
@Column(name = "conversation", columnDefinition = "TEXT")
private List<Map<String,String>> conversation;
해결 방법 (해결 안 됨)
mysql > ALTER TABLE [테이블 명] convert to charset uft8;
mysql > CREATE DATABASE [데이터베이스 명] CHARACTER SET utf8 COLLATE uft8_general_ci;
=> 그러나 해결되지 않았다.
utf8은 ambiguous한 표현이므로 utf8mb4를 권장했다.
구글링해보니 이모지까지 표현하고 싶은 경우 utfmb4를 사용하는 추세인 것 같다.
utfmb3도 deprecated된 상태라고...
spring.datasource.url=jdbc:mysql://localhost:3306/toy?serverTimezone=UTC&character_set_server=utf8mb4
여전히 같은 에러 발생
해결 방법2
➡️ 데이터 구조 상 리스트 안에 딕셔너리가 여러 개 있는 구조로 저장이 힘든 것 같아서 결국 딕셔너리(JSON) 한 줄씩 MySQL 저장하는 방식으로 해결