Hits
SQL 2022. 10. 18. 오후 2:54:00

[오삽내]PostgreSQL oid 컬럼 text로 바꾸기

"oid로 만들어버린 컬럼을 text로 바꿔보자"
jpapostgresqlsql

오늘의 삽질 내용

PostgreSQL oid 컬럼은 like 쿼리를 쓸 수 없다.

오늘의 문제

처음 언하이드에서 작품 상세 column을 만들때 긴 텍스트 저장하려고 entity에 @Lob어노테이션을 붙여서 만들었더니 PostgreSQL에서 oid타입으로 입력이되었습니다. 처음엔 별 문제가 없었어서 그대로 쓰고 있었는데, 검색기능을 추가하려니 like쿼리가 안먹어서 적잖이 당황을 했습니다. 찾아보니 text타입으로 바꿔줘야하는데 문제는 이미 운영중인 DB라 테이블을 새로 만들 수가 없다는겁니다. 결국 로컬 DB에서 타입 바꾸는 연습을 몇번 해본뒤 덜덜 떨리는 손으로 DB에 직접 쿼리를 날려 타입을 수정해줬습니다.

  • LOB(Large Object): CLOB(텍스트), BLOB(이미지, 사운드, 영상 등) 등이 있는데 대용량의 데이터를 길이제한 없이 저장할 수 있습니다.
  • oid(Object Identifier type): PostgreSQL은 oid식별자로 Object를 관리합니다. 명확한 작동원리를 알아내지는 못했지만 jpa String객체를 입출력 할 때 oid를 사용해도 spring은 String을 정상적으로 사용하는것으로 미루어보아 oid를 식별자로 사용하는 별도의 테이블을 만들어 텍스트를 저장한 뒤 jpa에서 oid를 찾아 가져오는것으로 보입니다. 텍스트가 불필요한 조회에서는 확실히 성능에 이점을 보이지만 system view로 내용을 알기 위해선 별도의 작업을 거쳐야합니다.

해결과정

일단 테이블을 바로 바꾸다가는 어떤 불상사가 발생할지 모르니까 테이블을 복사해준 뒤 복사한 테이블에 작업해주도록 하겠습니다.

create table new_artworks as
select * from artworks;

이제 아래의 쿼리를 날려 타입을 바꿔줍니다.

alter table new_artworks
    alter column description type text using convert_from(lo_get(cast(description as bigint)), 'UTF-8');

using 뒤의 구문들에 대해 알아보겠습니다.

  • convert_from: 문자열을 복원하는 기능을 합니다. convert_to는 문자열을 변환합니다. 위 코드에서는 ‘UTF-8’로 복원합니다.
  • lo_get: Large Object의 원본데이터를 추출해줍니다.
  • cast(A as B): A를 B 타입으로 캐스팅해줍니다.

수정할땐 몰랐는데 블로그로 정리하고 보니 convert_from은 안써도 되지 않았을까…하는 생각이 드네요.

참고자료