์น์ 2. ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ - ์คํ๋ง JdbcTemplate ์๊ฐ ์๋ฃ!!
JdbcTemplate ์ฅ์
์ค์ ์ ํธ๋ฆฌํจ
spring-jdbc
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์๋๋ฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ๋ง์ผ๋ก JDBC๋ฅผ ์ฌ์ฉํ ๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.๋ฐ๋ณต ๋ฌธ์ ํด๊ฒฐ
JdbcTemplate์ ํ ํ๋ฆฟ ์ฝ๋ฐฑ ํจํด์ ์ฌ์ฉํด์, JDBC๋ฅผ ์ง์ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋๋ถ๋ถ์ ๋ฐ๋ณต ์์ ์ ๋์ ์ฒ๋ฆฌํด์ค๋ค.
statement
๋ฅผ ์ค๋นํ๊ณ ์คํstatement
, resultset
์ข
๋ฃ๊ฐ๋ฐ์๋ SQL์ ์์ฑํ๊ณ , ์ ๋ฌํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ๊ณ ์๋ต ๊ฐ์ ๋งคํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
JdbcTemplate ๋จ์
template.queryForObject()
RowMapper
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐํ ๊ฒฐ๊ณผ์ธ ResultSet
์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.EmptyResultDataAccessException
์์ธ๊ฐ ๋ฐ์ํ๋ค.IncorrectResultSizeDataAccessException
์์ธ๊ฐ ๋ฐ์ํ๋ค.template.query()
RowMapper
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐํ ๊ฒฐ๊ณผ์ธ ResultSet
์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.์์๋๋ก ๋ฐ์ธ๋ฉ
JdbcTemplate์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋๋ก ๋ฐ์ธ๋ฉํ๋ค.
ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋๋ก ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ ํธ๋ฆฌํ์ง๋ง, ์์๊ฐ ๋ง์ง ์์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
์ด๋ฆ ์ง์ ๋ฐ์ธ๋ฉ
JdbcTemplate์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด NamedParameterJdbcTemplate
์ด๋ผ๋, ์ด๋ฆ์ ์ง์ ํด์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด๋ฆ ์ง์ ํ๋ผ๋ฏธํฐ
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด Map
์ฒ๋ผ key
, value
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ ์ ๋ฌํด์ผ ํ๋ค.
์ฌ๊ธฐ์ key
๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ, value
๋ ํด๋น ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด ๋๋ค.
์ด๋ฆ ์ง์ ๋ฐ์ธ๋ฉ์์ ์์ฃผ ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ์ ์ข ๋ฅ๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
BeanPropertyRowMapper๋ ResultSet์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์๋ฐ ๋น ๊ท์ฝ์ ๋ง์ถฐ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค.
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ ๊ฒฐ๊ณผ๊ฐ select id, price๋ผ๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
Item item = new Item();
item.setId(rs.getLong("id"));
item.setPrice(rs.getInt("price"));
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ ๊ฒฐ๊ณผ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก setId()
, setPrice()
์ฒ๋ผ ์๋ฐ ๋น ํ๋กํผํฐ ๊ท์ฝ์ ๋ง์ถ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
๋ณ์นญ as
๋ฅผ ์ฌ์ฉํด์ SQL ์กฐํ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ ์ด๋ฆ๊ณผ ๊ฐ์ฒด ์ด๋ฆ์ด ๋ค๋ฅผ ๋ ๋ณ์นญ์ ํตํด ํด๊ฒฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ member_name
์ด๋ผ ๋์ด ์๋๋ฐ, ๊ฐ์ฒด์ username
์ด๋ผ๊ณ ๋์ด ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ ์ ์๋ค.
select member_name as username
์๋ฐ ๊ฐ์ฒด๋ ์นด๋ฉ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ฉด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ฃผ๋ก ์ค๋ค์ดํฌ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
BeanPropertyRowMapper
๋ ์ค๋ค์ดํฌ ํ๊ธฐ๋ฒ์ ์นด๋ฉ๋ก ์๋ ๋ณํํด์ค๋ค. ๋ฐ๋ผ์ select item_name
์ผ๋ก ์กฐํํด๋ setItemName()
์ ๋ฌธ์ ์์ด ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
JdbcTemplate์ INSERT SQL์ ์ง์ ์์ฑํ์ง ์์๋ ๋๋๋ก SimpleJdbcInsert
๋ผ๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
withTableName
: ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ
์ด๋ธ ๋ช
์ ์ง์ ํ๋ค.usingGeneratedKeyColumns
: key๋ฅผ ์์ฑํ๋ PK ์ปฌ๋ผ ๋ช
์ ์ง์ ํ๋ค.usingColumns
: INSERT SQL์ ์ฌ์ฉํ ์ปฌ๋ผ์ ์ง์ ํ๋ค. ํน์ ๊ฐ๋ง ์ ์ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์๋ต ๊ฐ๋ฅํ๋ค.JdbcTemplate
: ์์ ๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์ง์ํ๋ค.
NamedParameterJdbcTemplate
: ์ด๋ฆ ๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์ง์ํ๋ค. (๊ถ์ฅ)
SimpleJdbcInsert
: INSERT SQL์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
SimpleJdbcCall
: ์คํ ์ด๋ ํ๋ก์์ ๋ฅผ ํธ๋ฆฌํ๊ฒ ํธ์ถํ ์ ์๋ค.
โ๏ธ ์คํ๋ง DB 2ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํ์ฉ ๊ธฐ์ ์น์
0~2 ์ ๋ฆฌ ์๋ฃ
โ๏ธ HTTP vs HTTPS ์ ๋ฆฌ ์๋ฃ (๋๋์ด...)