Jdbc ๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ์
JDBC ๋ฐ๋ณต ๋ฌธ์
- ์ปค๋ฅ์ ์กฐํ, ์ปค๋ฅ์ ๋๊ธฐํ
- PreparedStatement ์์ฑ ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
- ์ฟผ๋ฆฌ ์คํ
- ๊ฒฐ๊ณผ ๋ฐ์ธ๋ฉ
- ์์ธ ๋ฐ์์ ์คํ๋ง ์์ธ ๋ณํ๊ธฐ ์คํ
- ๋ฆฌ์์ค ์ข ๋ฃ
try {
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, member.getMemberId());
pstmt.setInt(2, member.getMoney());
pstmt.executeUpdate();
return member;
} catch (SQLException e) {
throw exTranslator.translate("save", sql, e);
} finally {
close(con, pstmt, null);
}
Connection ๊ด๋ฆฌ๋ฅผ ๊ณ์ํด์ ํด์ค์ผ ํ๋ ๋จ์
JdbcTemplate
JdbcTemplate์ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค.
JdbcTemplate์ JDBC API๋ฅผ ์ถ์ํํ ๊ฒ์ผ๋ก,
JDBC๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค.
JdbcTemplate์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์์ฑ ๋ฐ ์ข ๋ฃ, SQL ์ฟผ๋ฆฌ ์คํ, ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๋ฑ์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
public JdbcTemplateItemRepositoryV1(DataSource dataSource) {
this.template = new JdbcTemplate(dataSource);
}
JdbcTemplate์ ์ฌ์ฉํ ๋๋ ์์ฑ์๋ก๋ถํฐ DataSource ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
์ด๋ JdbcTemplate์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
DataSource๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด์ด๋ฉฐ,
JdbcTemplate์ DataSource๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํฉ๋๋ค.
๋ฐ๋ผ์ JdbcTemplate์ ์์ฑ์์์๋ DataSource ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์ผ ํฉ๋๋ค.
template.update()
INSERT, UPDATE, DELETE์ ๊ฐ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
update() ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฐ์ต๋๋ค.
String sql = "INSERT INTO item (item_name, price, quantity) VALUES (?, ?, ?)";
int rows = jdbcTemplate.update(sql, item.getItemName(), item.getPrice(), item.getQuantity());
- sql: ์คํํ SQL ์ฟผ๋ฆฌ
- args: SQL ์ฟผ๋ฆฌ์ ์ ๋ฌํ ๋งค๊ฐ ๋ณ์
? ์ ๋ฐ์ธ๋ฉํ ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋๋ก ์ ๋ฌํ๋ฉด ๋๋ค.
update() ๋ฉ์๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ์ํฅ์ ๋ฐ์ ํ(row)์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, INSERT ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋, ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋์ด ํ ์ด๋ธ์ ํ ์๊ฐ ์ฆ๊ฐํ๊ฒ ๋๋ฏ๋ก, ์ํฅ์ ๋ฐ์ ํ์ ์๋ 1์ผ ๊ฒ์ ๋๋ค.
RowMapper
RowMapper ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐํ ๊ฒฐ๊ณผ์ธ ResultSet ์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
RowMapper๋ JdbcTemplate์ ์ฌ์ฉํ ๋ ResultSet์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
RowMapper๋ ResultSet์ ๊ฐ ๋ก์ฐ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ๋ ์ญํ ์ ํฉ๋๋ค.
ResultSet์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ Item ๊ฐ์ฒด๋ก ๋งคํํ๋ ๋ก์ง
private RowMapper<Item> itemRowMapper() {
return ((rs, rowNum) -> {
Item item = new Item();
item.setId(rs.getLong("id"));
item.setItemName(rs.getString("item_name"));
item.setPrice(rs.getInt("price"));
item.setQuantity(rs.getInt("quantity"));
return item;
});
}
์ ์ฝ๋์์๋ ResultSet์์ id, item_name, price, quantity ์ปฌ๋ผ ๊ฐ์ ์ฝ์ด์์
Item ๊ฐ์ฒด์ id, itemName, price, quantity ํ๋์ ๊ฐ๊ฐ ์ค์ ํ๊ณ ์์ต๋๋ค.
์ด์ ItemRowMapper ๋ฉ์๋๋ JdbcTemplate์ query ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ RowMapper ๊ฐ์ฒด๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
query ๋ฉ์๋๋ ResultSet์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ Item ๊ฐ์ฒด๋ก ๋ณํํ ๋, ์ด ๋ฉ์๋์์ ์ ์ํ ๋ก์ง์ ์ฌ์ฉํฉ๋๋ค.
template.queryForObject()
queryForObject๋ JdbcTemplate์ ๋ฉ์๋ ์ค ํ๋๋ก, SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๊ฐ ํ๋์ ํ๋ง ๋ฐํํ๋ ๊ฒฝ์ฐ, ์ฆ ๋จ์ผ ๊ฐ์ด ๋ฐํ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
queryForObject ๋ฉ์๋๋ ์ธ ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฐ์ต๋๋ค.
Item item = template.queryForObject(sql, itemRowMapper(), id);
- SQL ์ฟผ๋ฆฌ ๋ฌธ์์ด: ์คํํ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋๋ค.
- RowMapper ๊ฐ์ฒด: SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ๊ธฐ ์ํ RowMapper ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด์ ๋๋ค.
- Object... args: SQL ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋ ์ธ์ ๊ฐ์ ๋๋ค.
queryForObject ๋ฉ์๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ ํ, ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
๋ง์ฝ ๊ฒฐ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ,EmptyResultDataAccessException ์ด ๋ฐ์ํฉ๋๋ค.
๊ฒฐ๊ณผ๊ฐ ํ ํ ์ด์์ธ ๊ฒฝ์ฐ, IncorrectResultSizeDataAccessException์ด ๋ฐ์ํฉ๋๋ค.
queryForObject ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ์ฝ๊ฒ ๋งคํํ ์ ์์ผ๋ฉฐ,
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
template.query()
๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ผ ๋ ์ฌ์ฉํ๋ค.
template.query(sql, itemRowMapper());
query() ๋ฉ์๋๋ SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ํ๋ง๋ค RowMapper ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ Java ๊ฐ์ฒด๋ก ๋ณํํ๊ณ ,
๋ณํ๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌ์คํธ์ ์ถ๊ฐํ์ฌ ๋ฐํํฉ๋๋ค.
๋ฐํ๋๋ ๊ฒฐ๊ณผ๋ List<T> ํ์ ์ ๋๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
'Spring > Spring DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง DB 2ํธ] - 3. JdbcTemplate - ์ด๋ฆ ์ง์ ํ๋ผ๋ฏธํฐ (0) | 2023.04.08 |
---|---|
[์คํ๋ง DB 2ํธ] - 2. JdbcTemplate - ๋์ ์ฟผ๋ฆฌ ๋ฌธ์ (0) | 2023.04.07 |
[์คํ๋ง DB 2ํธ] - 0. DTO / DAO (0) | 2023.04.05 |
[์คํ๋ง DB 1ํธ] - 15. ์คํ๋ง ์์ธ ์ถ์ํ ์ดํด (0) | 2023.03.31 |
[์คํ๋ง DB 1ํธ] - 14. ์คํ๋ง ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.30 |