이번에 카드 엔티티의 질문(Question) 속성과 설명(Description) 속성의 허용 길이를 늘려달라고 부탁받았다. Description의 경우 원래 CLOB이기에 큰 문제 없었지만 질문속성의 경우 VARCHAR2(2000)으로 정의되어있었다. 이를 5만자로 허용하기 위해서는 CLOB으로 변환해야 했다. 그래서 application code를 수정하고 validate -> update로 hibernate:ddl-auto를 수정했는데 application 시작에는 큰 문제가 없었지만 조회시 다음과 같은 에러가 발생했다.
2023-07-14 18:07:06.010 WARN 1 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 17004, SQLState: 99999
2023-07-14 18:07:06.013 ERROR 1 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : Invalid column type: getCLOB not implemented for class oracle.jdbc.driver.T4CVarcharAccessor
2023-07-14 18:07:06.016 ERROR 1 --- [nio-8080-exec-6] a.m.c.e.GlobalControllerExceptionHandler : could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query
쿼리를 실행할수 없고 invalid column type이라 쿼리할 수 없다는 것이였다.
그래서 실제 db장소인 oracle cloud를 확인해보니 CLOB이 아닌 VARCHAR2로 설정되어 있었다. 그래서 타입을 직접 수정하려고 하니 다음과 같은 에러가 발생했다.
직접 바꾸는 것은 불가능하다. 그렇다면 타입을 안전하게 바꾸는 방법은 없을까? 불가능하지 않다.
혹시 문제를 풀면서 서로 변수를 스왑할 때를 기억하는가?
이런 아이디어를 생각해서 적용하면 컬럼을 안전하게 교체할 수 있다.
우선 아이디어는 다음과 같다.
이와 같이 적용하기 위해서 사용하는 SQL은 다음과 같다.
alter table card add (tmp_question CLOB);
update card set tmp_question = QUESTION;
commit;
alter table card drop column question;
alter table card rename column tmp_question to question;
그 결과 성공적으로 별다른 데이터 문제 없이 Question(VARCHAR2(2000) -> CLOB)컬럼 변경에 성공했고 문제없이 잘 동작했다.