1) Spring JDBC ์๊ฐ
Spring JDBC
-
JDBC ํ๋ก๊ทธ๋๋ฐ์ ๋ณด๋ฉด ๋ฐ๋ณต๋๋ ๊ฐ๋ฐ ์์๊ฐ ์์ต๋๋ค.
-
์ด๋ฌํ ๋ฐ๋ณต์ ์ธ ์์๋ ๊ฐ๋ฐ์๋ฅผ ์ง๋ฃจํ๊ฒ ๋ง๋ญ๋๋ค.
-
๊ฐ๋ฐํ๊ธฐ ์ง๋ฃจํ JDBC์ ๋ชจ๋ ์ ์์ค ์ธ๋ถ์ฌํญ์ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ฒ๋ฆฌํด์ค๋๋ค.
-
๊ฐ๋ฐ์๋ ํ์ํ ๋ถ๋ถ๋ง ๊ฐ๋ฐํ๋ฉด ๋ฉ๋๋ค.
Spring JDBC - ๊ฐ๋ฐ์๊ฐ ํด์ผ ํ ์ผ์?

Spring JDBC ํจํค์ง
org.springframework.jdbc.core
- JdbcTemplate ๋ฐ ๊ด๋ จ Helper ๊ฐ์ฒด ์ ๊ณต
org.springframework.jdbc.datasource
- DataSource๋ฅผ ์ฝ๊ฒ ์ ๊ทผํ๊ธฐ ์ํ ์ ํธ ํด๋์ค, ํธ๋์ ์ ๋งค๋์ ธ ๋ฐ ๋ค์ํ DataSource ๊ตฌํ์ ์ ๊ณต
org.springframework.jdbc.object
- RDBMS ์กฐํ, ๊ฐฑ์ , ์ ์ฅ๋ฑ์ ์์ ํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ์ ๊ณต
org.springframework.jdbc.support
- jdbc.core ๋ฐ jdbc.object๋ฅผ ์ฌ์ฉํ๋ JDBC ํ๋ ์์ํฌ๋ฅผ ์ง์
JDBC Template
-
org.springframework.jdbc.core์์ ๊ฐ์ฅ ์ค์ํ ํด๋์ค์ ๋๋ค.
-
๋ฆฌ์์ค ์์ฑ, ํด์ง๋ฅผ ์ฒ๋ฆฌํด์ ์ฐ๊ฒฐ์ ๋ซ๋ ๊ฒ์ ์์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฑ์ ํผํ ์ ์๋๋ก ํฉ๋๋ค.
-
์คํ ์ด๋จผํธ(Statement)์ ์์ฑ๊ณผ ์คํ์ ์ฒ๋ฆฌํฉ๋๋ค.
-
SQL ์กฐํ, ์ ๋ฐ์ดํธ, ์ ์ฅ ํ๋ก์์ ํธ์ถ, ResultSet ๋ฐ๋ณตํธ์ถ ๋ฑ์ ์คํํฉ๋๋ค.
-
JDBC ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ org.springframework.daoํจํค์ง์ ์ ์๋์ด ์๋ ์ผ๋ฐ์ ์ธ ์์ธ๋ก ๋ณํ์ํต๋๋ค.
์ด์ ์ ๊ตฌํ๊ธฐ
int rowCount =this.jdbcTemplate.queryForInt("select count(*) from t_actor");
๋ณ์ ๋ฐ์ธ๋ฉ ์ฌ์ฉํ๊ธฐ
intcountOfActorsNamedJoe =this.jdbcTemplate.queryForInt("select count(*) from t_actor where first_name = ?","Joe");
String๊ฐ์ผ๋ก ๊ฒฐ๊ณผ ๋ฐ๊ธฐ
String lastName =this.jdbcTemplate.queryForObject("select last_name from t_actor where id = ?",newObject[]{1212L}, String.class);
// 3๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด ํ์
๋ช
์
ํ ๊ฑด ์กฐํํ๊ธฐ
Actor actor = this.jdbcTemplate.queryForObject(
"select first_name, last_name from t_actor where id = ?",
new Object[]{1212L},
new RowMapper<Actor>() {
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
return actor;
}
});
// ๋ฆฌํด ํ์
RowMapper, mapRow() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ.
// ํ ๊ฑด์ ๊ฒฐ๊ณผ๊ฐ ResultSet์ ๋ด๊ฒจ์๊ธฐ ๋๋ฌธ์ ResultSet๊ฐ์ Actor์ ๋ด์์ ๋ฆฌํด.
์ฌ๋ฌ ๊ฑด ์กฐํํ๊ธฐ
List actors =this.jdbcTemplate.query(
"select first_name, last_name from t_actor",
newRowMapper() {
publicActor mapRow(ResultSet rs,introwNum)throwsSQLException {
Actor actor =newActor();
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
return actor;
}
});
์ค๋ณต ์ฝ๋ ์ ๊ฑฐ (1๊ฑด ๊ตฌํ๊ธฐ์ ์ฌ๋ฌ ๊ฑด ๊ตฌํ๊ธฐ๊ฐ ๊ฐ์ ์ฝ๋์ ์์ ๊ฒฝ์ฐ)
public List<Actor> findAllActors() {
return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new ActorMapper());
}
private static final class ActorMapper implements RowMapper<Actor> {
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
return actor;
}
}
// ํ ๊ฑด select์ ์ฌ๋ฌ ๊ฑด select ๋ชจ๋ ๋์ผํ RowMapper๋ฅผ ์ฌ์ฉํ๋ค.
// ๊ทธ ๋ถ๋ถ์ ๋ณ๋์ ๋ฉ์๋๋ก ์ถ์ถํจ์ผ๋ก์จ ์ฝ๋์ ์ค๋ณต์ ๋ง์ ์ ์์ต๋๋ค.
insert update delete ๋ชจ๋ jdbcTemplate.update() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์คํ.
INSERT ํ๊ธฐ
this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)", "Leonor","Watling");
// ?์ ๊ฐ์๋งํผ sql ๋ฌธ ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค
UPDATE ํ๊ธฐ
this.jdbcTemplate.update("update t_actor set = ? where id = ?", "Banjo",5276L);
DELETE ํ๊ธฐ
this.jdbcTemplate.update("delete from actor where id = ?", Long.valueOf(actorId));
JDBC ํ ํ๋ฆฟ
JDBC ํ ํ๋ฆฟ๋ง ์ด์ฉํด๋ ๊ธฐ์กด์ JDBC ํ๋ก๊ทธ๋๋ฐ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ฒ ํ๋ก๊ทธ๋๋ฐ์ ํ ์๊ฐ ์์ฃ . ํ์ง๋ง ์๋์ ํด๋์ค๋ค์ ์ด์ฉํ๋ค๋ฉด ์ข ๋ ํธํ๊ฒ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค.
NamedParameterJdbcTemplate
-
JdbcTemplate์์ JDBC statement ์ธ์๋ฅผ ?๋ฅผ ์ฌ์ฉํ๋ ๋์ ํ๋ผ๋ฏธํฐ๋ช ์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๊ฒ์ ์ง์
SimpleJdbcTemplate
-
JdbcTemplate๊ณผ NamedParameterJdbcTemplate ํฉ์ณ ๋์ ํ ํ๋ฆฟ ํด๋์ค
-
์ด์ JdbcTemplate๊ณผ NamedParameterJdbcTemplate์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ญ์ ์์ ๋ ์์ (deprecated)
SimpleJdbcInsert
-
ํ ์ด๋ธ์ ์ฝ๊ฒ ๋ฐ์ดํฐ insert ๊ธฐ๋ฅ์ ์ ๊ณต
2) Spring JDBC ์ค์ต
DTO๋?
-
DTO๋Data Transfer Object์ ์ฝ์์ ๋๋ค.
-
๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ์๋ฐ๋น์ฆ์ ๋๋ค.
-
์ฌ๊ธฐ์์ ๊ณ์ธต์ด๋ ์ปจํธ๋กค๋ฌ ๋ทฐ, ๋น์ง๋์ค ๊ณ์ธต, ํผ์์คํด์ค ๊ณ์ธต์ ์๋ฏธํฉ๋๋ค.
-
์ผ๋ฐ์ ์ผ๋ก DTO๋ ๋ก์ง์ ๊ฐ์ง๊ณ ์์ง ์๊ณ ,์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋๋ค.
-
ํ๋์ getter, setter๋ฅผ ๊ฐ์ง๋ค. ์ถ๊ฐ์ ์ผ๋ก toString(), equals(), hashCode()๋ฑ์ Object ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์์ต๋๋ค.
DAO๋?
-
DAO๋Data Access Object์ ์ฝ์๋ก๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ์ ๋ดํ๋๋ก ๋ง๋ ๊ฐ์ฒด์ ๋๋ค.
-
๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ์ ๋ดํ๋ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง๋๋ค.
ConnectionPool ์ด๋?
-
DB์ฐ๊ฒฐ์ ๋น์ฉ(์๊ฐ ๋ ๋ฑ)์ด ๋ง์ด ๋ญ๋๋ค.
-
์ปค๋ฅ์ ํ์ ๋ฏธ๋ฆฌ ์ปค๋ฅ์ ์ ์ฌ๋ฌ ๊ฐ ๋งบ์ด ๋ก๋๋ค.
-
์ปค๋ฅ์ ์ด ํ์ํ๋ฉด์ปค๋ฅ์ ํ์๊ฒ ๋น๋ ค์ ์ฌ์ฉํ ํ ๋ฐ๋ฉํฉ๋๋ค.
-
์ปค๋ฅ์ ์ ๋ฐ๋ฉํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?

DataSource๋?
-
DataSource๋ ์ปค๋ฅ์ ํ์ ๊ด๋ฆฌํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๋๋ค.
-
DataSource๋ฅผ ์ด์ฉํด์ปค๋ฅ์ ์ ์ป์ด์ค๊ณ ๋ฐ๋ฉํ๋๋ฑ์ ์์ ์ ์ํํฉ๋๋ค.
Spring JDBC๋ฅผ ์ด์ฉํ DAO์์ฑ ์ค์ต

<์ค๋ช >
Directed Association (์ฐ๊ด) ์ค์ ํ์ดํ
ex) RoleDao๋ ์ธ์คํด์ค ๋ณ์๋ก ์ฐธ์กฐ
Dependency (์์กด์ฑ) ์ ์ ํ์ดํ
ex) RoleDao๋ RoleDaoSqlsํด๋์ค์ ํ๋์ ๋ฉ์๋๋ฅผ ์. ์์กดํด๋์ค(RoleDaoSqls)๋ life cycle์ด ๋ ๋ฆฝ์
๋จผ์ Spring ์ปจํ ์ด๋์ธ ApplicationContext๋์ค์ ํ์ผ๋ก ApplicationConfig๋ผ๋ ํด๋์ค๋ฅผ ์ฝ์ด ๋ค์ธ๋ค.
ApplicationConfig์๋ componentScanAnnotaition์ด DAOํด๋์ค๋ฅผ ์ฐพ๋๋ก ์ค์ ํ ๊ฒ์ด๋ค.
์ฐพ์ ๋ชจ๋ DAO ํด๋์ค๋ Spring ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
Application Context๋ DBConfig ํด๋์ค๋ฅผ importํ๋ค.
DBConfig ํด๋์ค์์๋ ๋ฐ์ดํฐ ์์ค์ ํธ๋์ญ์ ๋งค๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
DAO๋ ํ๋๋ก NamedParameterJdbcTemplate๊ณผ SimpleJdbcInsert๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
๋ ๊ฐ์ ๊ฐ์ฒด๋ ๋ชจ๋ Data Source๋ฅผ ํ์๋ก ํ๋ค.
๋ ๊ฐ์ ๊ฐ์ฒด ๋ชจ๋ SQL์ ์คํ์ ํธ๋ฆฌํ๊ฒ ํ๋๋ก Sprint JDBC์์ ์ ๊ณตํ๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ DB ์ฐ๊ฒฐ์ ์ํด์ ๋ด๋ถ์ ์ผ๋ก DataSource๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ ๊ฐ์ ๊ฐ์ฒด๋ RoleDao ์์ฑ์์์ ์ด๊ธฐํํ๋ค.
RoleDao ์์ฑ์์์ ์ด๊ธฐํ๋ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ RoleDao์ ๋ฉ์๋๋ค์ ๊ตฌํํ๊ฒ ๋๋ค.
Spring JDBC๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ ํ๋ผ๋ฏธํฐ์ SQL์ ๊ฐ์ฅ ๋ง์ด ์ ๊ฒฝ ์จ์ผ ๋๋ค.
SQL์ RoleDao SQL์ ์์๋ก ์ ์๋ฅผ ํด๋์์ผ๋ก์จ ๋์ค์ SQL์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์ ์ข ๋ ํธํ๊ฒ ์์ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ ๊ฑด์ Role ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ์ ๋ฌํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก Role DTO๊ฐ ์ฌ์ฉ๋๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
'Spring > Boost Course Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4.3 WEB API (0) | 2020.11.19 |
---|---|
4.2 Layered Architecture (0) | 2020.11.19 |
4.1 Spring MVC (0) | 2020.11.19 |
3.2 Spring Test (0) | 2020.11.19 |
3.1 Spring Core (0) | 2020.11.19 |
2.6 JSTL & EL (0) | 2020.11.19 |