1. 소개
이 빠른 사용방법(예제)에서는 JPA 사양 에 정의된 어노테이션을 사용하여 PostgreSQL TEXT 유형을 관리하는 방법을 설명합니다 .
2. PostgreSQL의 TEXT 유형
PostgresSQL로 작업할 때 주기적으로 랜덤의 길이로 문자열을 저장해야 할 수도 있습니다.
이를 위해 PostgreSQL은 세 가지 문자 유형을 제공합니다.
- 문자(n)
- VARCHAR(n)
- 텍스트
불행히도 TEXT 유형은 SQL 표준에서 관리하는 유형의 일부가 아닙니다. 이는 지속성 엔티티에서 JPA 어노테이션을 사용하려는 경우 문제가 발생할 수 있음을 의미합니다 .
JPA 사양이 SQL 표준을 사용하기 때문입니다. 결과적으로 예를 들어 @Text 어노테이션을 사용하여 이러한 유형의 개체를 처리하는 간단한 방법을 정의하지 않습니다.
운 좋게도 PostgreSQL 데이터베이스의 TEXT 데이터 유형을 관리할 수 있는 몇 가지 가능성이 있습니다.
- @Lob 어노테이션 을 사용할 수 있습니다.
- 또는 columnDefinition 속성 과 결합된 @Column 어노테이션 을 사용할 수도 있습니다.
이제 @Lob 어노테이션 으로 시작하는 두 가지 솔루션을 살펴보겠습니다 .
3. @롭
이름에서 알 수 있듯이 로브는 큰 개체 입니다 . 데이터베이스 측면에서 lob 열은 매우 긴 텍스트 또는 바이너리 파일을 저장하는 데 사용됩니다 .
두 가지 종류의 로브 중에서 선택할 수 있습니다.
- CLOB - 텍스트를 저장하는 데 사용되는 문자 로브
- BLOB – 이진 데이터를 저장하는 데 사용할 수 있는 이진 lob
JPA @Lob 어노테이션을 사용하여 큰 필드를 큰 데이터베이스 개체 유형에 매핑할 수 있습니다.
String 유형 속성에 @Lob 레코드를 사용할 때 JPA 사양은 지속성 공급자가 큰 문자 유형 개체를 사용하여 속성 값을 저장해야 한다고 말합니다. 결과적으로 PostgreSQL은 문자 lob을 TEXT 유형으로 변환할 수 있습니다.
랜덤의 길이를 가질 수 있는 설명 필드가 있는 간단한 Exam 엔터티 개체 가 있다고 가정해 보겠습니다 .
@Entity
public class Exam {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Lob
private String description;
}
설명 필드에 @Lob 어노테이션을 사용하여 우리는 Hibernate가 PostgreSQL TEXT 유형을 사용하여 이 필드를 관리하도록 지시합니다.
4. @컬럼
TEXT 유형을 관리하는 또 다른 옵션은 columnDefinition 속성 과 함께 @Column 어노테이션을 사용하는 것입니다.
동일한 Exam 엔터티 개체를 다시 사용하지만 이번에는 랜덤의 길이가 될 수 있는 TEXT 필드를 추가합니다.
@Entity
public class Exam {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Lob
private String description;
@Column(columnDefinition="TEXT")
private String text;
}
이 예에서는 @Column(columnDefinition=”TEXT”) 어노테이션을 사용합니다 . columnDefinition 속성을 사용 하면 이 유형에 대한 데이터 열을 구성할 때 사용할 SQL 조각을 지정할 수 있습니다.
5. 모든 것을 하나로 모으기
이 섹션에서는 솔루션이 작동하는지 확인하기 위해 간단한 단위 테스트를 작성합니다.
@Test
public void givenExam_whenSaveExam_thenReturnExpectedExam() {
Exam exam = new Exam();
exam.setDescription("This is a description. Sometimes the description can be very very long! ");
exam.setText("This is a text. Sometimes the text can be very very long!");
exam = examRepository.save(exam);
assertEquals(examRepository.find(exam.getId()), exam);
}
이 예제에서는 새 Exam 개체를 만들고 데이터베이스에 유지하는 것으로 시작합니다. 그런 다음 데이터베이스에서 Exam 개체 를 검색하고 결과를 생성한 원래 시험과 비교합니다.
요점을 설명하기 위해 Exam 엔터티의 설명 필드를 빠르게 수정하면:
@Column(length = 20)
private String description;
테스트를 다시 실행하면 오류가 표시됩니다.
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Value too long for column "TEXT VARCHAR(20)"
6. 결론
이 사용방법(예제)에서는 PostgreSQL TEXT 유형과 함께 JPA 어노테이션을 사용하는 두 가지 접근 방식을 다루었습니다.
TEXT 유형이 무엇에 사용되는지 설명하는 것으로 시작한 다음 JPA 어노테이션 @Lob 및 @Column 을 사용하여 PostgreSQL에서 정의한 TEXT 유형을 사용하여 String 객체 를 저장 하는 방법을 보았습니다.
항상 그렇듯이 기사의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .