markdown 포스팅 블로그를 만드는 중에 해당 에러가 발생했다. 로그를 읽어보니 현재 작성한 content가 너무 길어서 데이터베이스에 넣을 수 없다는 것이었다. JPA를 사용 했고 String으로 선언했으니 (content Column을 String으로 선언함) Mysql에서도 String 같이 길의 제한이 거의 없는 수준일거라고 멍청하게 생각했다. 하지만 아니였다.....
이러한 에러가 발생해서 Mysql을 열어서 생성된 테이블의 구조를 다시보는데 아래와 같이 나왔다.
즉, String으로 선언된 Column은 JPA에서 varchar(255)로 변환 시켜주는 것이다. 결국 content는 255바이트까지의 제한이 있었던것이었다. 하지만 이것은 내가 생각한 것도 매우 적은 값이었다. 그렇기 때문에 제한을 늘려야했다.
Mysql에서 content의 데이터 타입을 text로 변경해주는 방법이다.
TINYTEXT = 255 bytes
TEXT = 64 KiB
MEDIUMTEXT = 16 MiB
LONGTEXT = 4 GiB
각 타입의 제한 길이는 위와 같다. Tiny는 현재와 바꾸는 의미가 없고, Medium과 Long은 너무 길다고 생각되어 현재는 text로 하기로 결정했다.
프리서버라 데이터베이스 용랑이 없어
이제 JPA한테 "이제 TEXT로 만들어줘" 라고 어떻게 말해야 하냐 그것은 아래와 같이 모델 객체에 적어주면 된다.
@Column(columnDefinition = "TEXT")
private String text
그리고 64KiB 보다 높은 용량을 필요로 한다면 아래와 같이 하면 된다.
@Lob
private String description;
위와 같이 선언하면 LONGTEXT로 타입이 설정된다. 다만 이것은 제한 길이가 4GiB까지 임으로 사용자에게 제한을 두고 싶거나 해당 내용에 많은 64KiB보다 많은 용량이 필요로 하지 않는다면 사용하지 않는것이 좋다.
아래는 Lob 어노테이션에 대한 설명이다.
9.1.19 Lob Annotation
Lob 어노테이션은
A Lob annotation specifies that a persistent property or field should be persisted as a large object to a database-supported large object type. Portable applications should use the Lob annotation when mapping to a database Lob type. The Lob annotation may be used in conjunction with the Basic annotation. A Lob may be either a binary or character type. The Lob type is inferred from the type of the persistent field or property, and except for string and character-based types defaults to Blob.