🤸♂️서론
예전에 @Lob 에러 관련 글을 적은 적이 있다.
당시에는 postgresql에서 @Lob을 아예 사용할 수 없는 줄 알고 @Column(columnDefinition="TEXT") 사용을
무조건 해야 한다고 알고 있었지만 최근에 틀렸단 것을 깨닫고 글을 작성한다.
🙋♂️LOB? CLOB? 그게 일단 뭐야! 간단하게 알려줘!!
LOB - Large Objcts
------------
CLOB - Character LOBs
: DB 내부에 존재하는 대용량의 텍스트
BLOB - Binary LOBs
: Image, Sound, Video 등의 대용량의 DB내부에 존재하는 데이터
NCLOB - National Character LOBs
: DB 내부에 존재하는 대용량의 내셔널 텍스트
BFILE - Binary Files
: MPEG, JPEG, DIVX 등의 대용량의 DB외부에 존재하는 파일
아래에 있는 4개의 타입은 LOB의 종류라고 보면 된다.
이름에서부터 알 수 있듯이 LOB란 대용량의 데이터를 저장하는 타입이다.
그 아래의 타입은 어떤 형식으로 어디에 저장되는지에 대한 타입으로 나눈거라 볼 수 있다.
🏄♂️본론
이제 간단하게 lob가 무엇인지 알게 되었으니까 예제를 통해서 설명하겠다.
하나 짚고 넘어가자면, postgresql에서는 clob와 text를 text타입 하나로 정의하는 것 같다.
예제를 위해 하나 만들어봤다.
이런 테스트를 위해 직접 만들어서 해본건 처음이라.. Tree구조도 이쁘지 않다..
(파일명도)
다음엔 더 이쁜 Tree 구조를 만드는걸 찾아봐야지.
DTO는 간단하게 그냥 id와 @Lob을 붙인 data 이렇게 두개를 넣어줬다.
또한 JPA를 통해 테이블을 자동생성을 해주었고 data 객체의 타입은 text로 생성되었다.
1. @LOB
data 안에 Json 타입을 넣기 위해 간단하게 테스트메소드를 정의하였고, 이를 실행했다.
보는 바와 같이 data 안에는 CLOB타입으로 저장이 되었다.
DB값을 확인해보니..!?
이상한 숫자가 들어가 있다.
저 숫자를 OID(Object Identifier Types) 라고 부른다.
postgresql에서는 오브젝트를 oid로 관리한다.
그렇기에 system view를 통해 확인하게 되면 oid 값으로 나온다.
그러면 저 값은 어떻게 확인해봐..?
SELECT id, lo_get(cast(data as bigint)) FROM test
위와 같은 형식으로 가져올 수 있다.
뭔가 한 번 더 거쳐야 하는게 불편하게 느껴진다..
1-1 그러면 자바에서는?
(toString()을 오버라이딩한 상태이다)
@Lob 어노테이션을 통해 db data타입이 text지만 CLOB로 변경되어
정상적으로 저장한 Json형식 그대로 가져오는 걸 확인할 수 있다.
2 @Column(columnDefinition="TEXT") 를 하게되면 어떻게 될까??
타입을 TEXT로 변경했더니 data에 varchar형식으로 들어가게 되었다.
db를 확인해보니 Json형식 그대로 아니 넣는 값 그대로 텍스트로 들어간 것을 확인할 수 있다.
2-1 그럼 둘 다 불러보자.
처음 clob 형식으로 저장한 oid 값은 oid형식 그대로 출력하게 되고,
varchar 형식으로 저장된 json 형식은 그대로 출력이 된다.
이는 중간에 만약 @Lob <-> @Column(columnDefinition="TEXT") 이 변경이 되면
원하는대로 안될 수 있으니 한 번 정한 후로는 웬만해서는 변경하지 않는 것이 좋을 듯 싶다.
🙇♂️결론
흠 솔직히 oid로 저장하는 것이 무슨 장점인지는 잘 모르겠다.
테이블을 조회할 때 oid값을 따로 불러오고 싶지 않을 때 clob 타입이면 크기가 더 적기 때문에
조금 더 빠른 속도를 얻을 수 있는 장점은 있을 것 같긴 하다.
결론은
text타입과 clob 타입 둘 다 postgresql에서는 text타입으로 표시할 수 있다는 것이다.
이제 text타입을 쓸 때 생각없이 쓰는 것이 아니라 어떤 것을 사용하는게 좋을 지 한 번 생각해보고 쓸 수 있다는 점에서
하나 알아간 것 같다.
참고 사이트
'DataBase' 카테고리의 다른 글
[MySQL] Mac M1 에서 MySQL password 재설정 (2) | 2022.04.25 |
---|---|
[MS-SQL] IN 구문 사용 시 매개변수 2100개 초과 (0) | 2021.11.09 |
[PostgreSQL]COUNT 사용 시 주의 (0) | 2021.04.17 |
[SQL]IN / NOT IN / EXISTS / NOT EXISTS 은 어떻게 쓰는걸까? (0) | 2020.12.02 |
left outer join ? (0) | 2020.10.30 |