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에서 사용할 수 있습니다 .

Persistence footer banner