๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/Boost Course Web

3.3 Spring JDBC

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 ์ธ์ž๋ฅผ ?๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ง€์›

  • NamedParameterJdbcTemplate ์˜ˆ์ œ

SimpleJdbcTemplate

  • JdbcTemplate๊ณผ NamedParameterJdbcTemplate ํ•ฉ์ณ ๋†“์€ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค

  • ์ด์ œ JdbcTemplate๊ณผ NamedParameterJdbcTemplate์— ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ ์˜ˆ์ •๋  ์˜ˆ์ •(deprecated)

  • SimpleJdbcTemplate ์˜ˆ์ œ

SimpleJdbcInsert

  • ํ…Œ์ด๋ธ”์— ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ insert ๊ธฐ๋Šฅ์„ ์ œ๊ณต

  • SimpleJdbcInsert ์˜ˆ์ œ


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