게시판 create 함수를 작성하던 와중 250자 정도 까지는 작성이 가능하지만, 이상의 글자수에 대해서는 오류를 반환하는 것을 볼 수 있었다. 로컬환경에서는 제대로 실행되었으며 prod 환경에서 실행했을 때만 오류가 발생하였다.
java.sql.SQLSyntaxErrorException: (conn=158694) Data too long for column 'content' at row 1
post 의 domain의 어노테이션 안에 TEXT를 넣어 해결하였다. 그런데 이를 배포한 뒤에도 클라이언트 측에서는 여전히 오류가 난다고 하여 잘못된 요청을 하고있는 게 아닐까? 라고 생각했다.
@Column(nullable = false, columnDefinition = "TEXT")
private String content;
local 과 prod 환경이 아무런 차이가 없다고 생각하여 로컬에서만 시도하고 있었는데, prod에서 시도해 보았을 때 나에게도 동일한 에러가 발생하고 있었다. SQL 문이 잘못되었다는 에러였다.
java.sql.SQLSyntaxErrorException: (conn=164398) Incorrect string value: '\xE3\x85\x8DLor...' for column `patientpal`.`posts`.`content` at row 1
위 에러는 해당 문자열이 컬럼의 문자 집합(character set)과 호환되지 않는 경우, 주로 입력하려는 문자열이 컬럼의 문자 집합으로 표현될 수 없는 경우에 발생한다.
lcoal 환경은 H2 , prod 환경은 MariaDB를 사용하고 있었는데 여기서 오는 차이였던 것이다.
- H2: 기본적으로 UTF-8을 사용하며, 문자 집합에 대한 제한이 명확하지 않거나 유연하게 설정될 수 있다.
- MariaDB: utf8과 utf8mb4는 문자당 저장되는 바이트 수가 다르다. utf8은 최대 3바이트를 사용하고, utf8mb4는 최대 4바이트를 사용.
운영 환경(MariaDB)에서 utf8mb4로 설정해주어야 UTF-8의 모든 문자를 지원하며, 4바이트 문자를 포함한 모든 유니코드 문자도 올바르게 저장할 수 있다.
더 많은 바이트 수를 사용하는 utf8mb4로 설정해주어야 too long 에러가 해결되는 것이 이상하다고 생각했는데, 생각해보니 이것은 @Column(nullable = false, columnDefinition = "TEXT") 로 해결이 되었고, 이후부터는 인코딩 호환의 문제여서 utf8mb4 로 설정해주어야 하는 것이었다.
아래와 같이 sql 을 설정해줌으로써 해결하였다.
ALTER TABLE posts MODIFY COLUMN content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
'error' 카테고리의 다른 글
[NestJS] .env 경로 설정 (0) | 2024.09.29 |
---|---|
[JPA] @Query 어노테이션 사용시 주의점 정리 (0) | 2024.08.04 |
[Redis] Unable to connect to Redis : 로컬에 Redis init 시 config 파일 가져오기 (0) | 2024.07.28 |
Unsupported Java. Your build is currently configured to use Java 22.0.1 and Gradle 8.7. (0) | 2024.07.09 |
iptables NAT 테이블을 활용한 포트포워딩 에러 해결 (0) | 2024.07.09 |