AWS Advanced JDBC Wrapper Driver

AWS ์—์„œ๋Š” Amazon Aurora๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ Advanced JDBC Wrapper Driver์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์กฐ์ง์—์„œ๋Š” Aurora PostgreSQL์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ PostgreSQL JDBC Driver๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋œฌ๊ธˆ์—†์ด AWS ์ธํ”„๋ผ ์žฌ๊ตฌ์„ฑ๊ณผ ๋”๋ถˆ์–ด IAM ์—ญํ•  ์ „ํ™˜์„ ํฌํ•จํ•œ IAM ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์ฆ์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AWS JDBC Wrapper๋Š” IAM ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŽ˜์ผ์˜ค๋ฒ„, ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ถ„ํ•  ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL 2์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ด์Šˆ

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์†Œ์Šค์˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ PostgreSQL JDBC Driver ์—์„œ software.amazon.jdbc.Driver ๋กœ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ค‘์ด๋˜ ์ผ๋ถ€ SQL ํ˜ธ์ถœ์—์„œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์กฐ์ง์—์„œ๋Š” JPA ๋˜๋Š” MyBatis์™€ ๊ฐ™์€ SQL ๋งคํ•‘ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ์Šคํ”„๋ง JDBC์˜ SQL ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ RowMapper์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์„œ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” PostgreSQL JDBC Driver๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ RowMapper ๋‚ด ์ฝ”๋“œ์—๋Š” PGobject ๋˜๋Š” PgArray์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋„๋ก ๋˜์–ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. AWS JDBC Wrapper๋Š” ๊ธฐ์กด ๋“œ๋ผ์ด๋ฒ„์— ๋Œ€ํ•ด ๊ธฐ๋Šฅ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ž˜ํ•‘ํ•œ ๋“œ๋ผ์ด๋ฒ„๋กœ PgResultSet์€ ResultSetWrapper๋กœ PgArray๋Š” ArrayWrapper๋กœ ๋ณ€๊ฒฝ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ Wrapper ํด๋ž˜์Šค ์•ˆ์—๋Š” ์›๋ณธ ResultSet๊ณผ Array๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์— ๋ณ„๋„๋กœ ๊ตฌํ˜„๋œ RowMapper ์—์„œ๋Š” ๋ฐฐ์—ด ๋˜๋Š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…์˜ ํ•„๋“œ๋ฅผ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ PgArray์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด instanceOf ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ž‘์„ฑ๋˜์–ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. AWS JDBC Wrapper ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ ์ˆœ๊ฐ„ ArrayWrapper ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ PgArray์— ๋Œ€ํ•œ ๋กœ์ง์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฌด์‹œ๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ๋Š” GSON์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ณ€ํ™˜์„ ์‹œ๋„ํ–ˆ๋˜ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

Array array = jdbcTemplate.queryForObject("SELECT ARRAY [[1,2,3],[4,5,6]]::BIGINT[][]", Array.class);
Long[][] arrays = (Long[][]) array.getArray();

๋”ฐ๋ผ์„œ, PostgreSQL JDBC Driver์™€ software.amazon.jdbc.Driver๋ฅผ ๋ชจ๋‘ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ์กด RowMapper์˜ ์ฝ”๋“œ๋ฅผ Array์™€ ๊ฐ™์€ JDBC ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋„๋ก ์ตœ๋Œ€ํ•œ ๋ณ€๊ฒฝํ•˜๊ณ  ์ผ๋ถ€ ์˜ˆ์™ธ ์ผ€์ด์Šค๋“ค์„ ์ฐพ์•„์„œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

No results were returned by the query

ResultSet ์—์„œ ๊ฐ€์ ธ์˜จ ArrayWrapper์˜ getArray ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ PSQLException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๊ฒฐ๊ณผ ์ƒ โ€œ[]โ€๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ๋กœ ๋นˆ ๋ฐฐ์—ด์ด ์•„๋‹Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ArrayWrapper์—๋Š” ๋น„์–ด์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์œ ๋ฌด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์—†์œผ๋‚˜ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋น„์–ด์žˆ๋Š” ๊ฐ’์ด ๋ช…ํ™•ํ•˜๋ฏ€๋กœ try-catch ๊ตฌ๋ฌธ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ResultSet.getString ์œผ๋กœ ๋นˆ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฌธ์ž์—ด์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

aws-jdbc-wrapper-test ์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ SQL ํ˜ธ์ถœ๊ณผ AWS JDBC Wrapper์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.