fix(테이블타입): constraints SQL ARRAY_AGG → text 캐스트로 일원화

이전 PR (#15) 의 Java parseColumnArray 분기 추가가 실제 운영 환경에서
빈 배열을 그대로 반환 — MyBatis ↔ PostgreSQL JDBC 의 array 타입 변환이
java.sql.Array 가 아닌 다른 경로로 도착하는 듯.

방식 변경: SQL 단에서 ARRAY_AGG(...)::text 캐스트 → PostgreSQL 가
"{email,phone}" String 으로 반환. parseColumnArray 의 기존 String 분기
(중괄호 제거 + 쉼표 split) 가 자연스럽게 처리.

장점:
- JDBC 드라이버 / MyBatis 변환 동작에 의존하지 않음
- parseColumnArray 코드 단순 복원 (List/String 2분기)
- 한 줄 SQL 변경으로 PK/IDX 두 쿼리 모두 해결

검증:
- gradle compileJava BUILD SUCCESSFUL
- solution.invyone.com 에서 customer_mng PK columns / email IDX columns
  비어있지 않음 확인 예정

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-14 09:18:26 +09:00
parent 0365b743f5
commit 1e1b3e103c
2 changed files with 2 additions and 17 deletions
@@ -10,7 +10,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
@@ -942,20 +941,6 @@ public class TableManagementService extends BaseService {
@SuppressWarnings("unchecked")
private List<String> parseColumnArray(Object cols) {
if (cols instanceof List) return (List<String>) cols;
if (cols instanceof java.sql.Array arr) {
try {
Object raw = arr.getArray();
if (raw instanceof Object[] arrObj) {
return Arrays.stream(arrObj)
.filter(Objects::nonNull)
.map(Object::toString)
.filter(s -> !s.isBlank())
.collect(Collectors.toList());
}
} catch (SQLException e) {
log.warn("parseColumnArray: java.sql.Array decode 실패 — fallback", e);
}
}
if (cols instanceof String s) {
return Arrays.stream(s.replace("{", "").replace("}", "").split(","))
.filter(c -> !c.isBlank())
@@ -389,7 +389,7 @@
<select id="getTablePrimaryKeyList" parameterType="map" resultType="map">
SELECT
TC.CONNAME AS constraint_name
, ARRAY_AGG(A.ATTNAME ORDER BY X.N) AS columns
, ARRAY_AGG(A.ATTNAME ORDER BY X.N)::text AS columns
FROM PG_CONSTRAINT TC
JOIN PG_CLASS C
ON TC.CONRELID = C.OID
@@ -411,7 +411,7 @@
SELECT
I.RELNAME AS index_name
, IX.INDISUNIQUE AS is_unique
, ARRAY_AGG(A.ATTNAME ORDER BY X.N) AS columns
, ARRAY_AGG(A.ATTNAME ORDER BY X.N)::text AS columns
FROM PG_INDEX IX
JOIN PG_CLASS T
ON IX.INDRELID = T.OID