Back-end/Spring

[Spring] JdbcTemplate ์‚ฌ์šฉ๋ฒ• - update(), queryForInt(), queryForObject(), query()

๐Ÿ’ก update()

 

JdbcTemplate๋Š” DAO๊ฐ์ฒด์—์„œ DB์™€ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด SQL ์—ฐ์‚ฐ๋“ค์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ ์ธ๋ฐ,

update()๋Š” SQL ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐฑ์‹ ์‹œ์ผœ์ค„ ๋•Œ(INSERT, DELETE, UPDATE) ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

 

โœ๏ธ INSERT

 

์น˜ํ™˜์ž(?)๋ฅผ ๊ฐ€์ง„ SQL๋กœ PreparedStatement๋ฅผ ๋งŒ๋“ค๊ณ  ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„

update() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SQL๊ณผ ํ•จ๊ป˜ ๊ฐ€๋ณ€์ธ์ž๋กœ ์„ ์–ธ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

this.jdbcTemplate.update("insert into users(id, name, password) values(?,?,?)",
						user.getId(), user.getName(), user.getPassword());

 

โœ๏ธ UPDATE

 

INSERT์˜ ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์น˜ํ™˜์ž๋ฅผ ๊ฐ€์ง„ SQL์„ ๋งŒ๋“  ํ›„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

this.jdbcTemplate.update("update users set name=? where password=?",
					user.getName() , user.getPassword());

 

โœ๏ธ DELETE

 

์น˜ํ™˜์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ณ , ์น˜ํ™˜์ž๊ฐ€ ํ•„์š”์—†์„ ๋•Œ๋Š” SQL๋ฌธ๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

this.jdbcTemplate.update("delete from users");

 

๐Ÿ’ก queryForInt()

 

SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ •์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’(Integer ํƒ€์ž…)์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

return this.jdbcTempalte.queryForInt("select count(*) from users");

 

๐Ÿ’ก qyeryForObject()

 

SQL์˜ DML ์ค‘ SELECT๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด(Object) ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด, getCount()์— ์ ์šฉํ–ˆ๋˜ RowMapper ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

๐Ÿ” RowMapper๋ž€?
ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋ถ€ํ„ฐ ResultSet์„ ์ „๋‹ฌ๋ฐ›๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์„œ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

ResultSet์˜ ๋กœ์šฐ ํ•˜๋‚˜๋งŒ์„ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

 

/* Deprecated 
return this.jdbcTemplate.queryForObject(
				"select * from users where id =?", 
				new Object[] {id},
				new RowMapper<User>() {
					public User mapRow(ResultSet rs, int rowNum) throws SQLException {
						User user = new User();
						user.setId(rs.getString("id"));
						user.setName(rs.getString("name"));
						user.setPassword(rs.getString("password"));
						return user;
					}
			
		});*/

// =================================================

// Replaced
return this.jdbcTemplate.queryForObject(
				"select * from users where id =?", 
				new RowMapper<User>() {
					public User mapRow(ResultSet rs, int rowNum) throws SQLException {
						User user = new User();
						user.setId(rs.getString("id"));
						user.setName(rs.getString("name"));
						user.setPassword(rs.getString("password"));
						return user;
					},
                 @Nullable Object... args
				
			
		});

 

  • ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : PreparedStatement๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ SQL
  • ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : SQL์˜ ์น˜ํ™˜์ž์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ’, Object ํƒ€์ž… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • ์„ธ๋ฒˆ์งธ (๋งˆ์ง€๋ง‰) ํŒŒ๋ผ๋ฏธํ„ฐ : RowMapper ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด์ฃผ์ž

 

  • ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : PreparedStatement๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ SQL
  • ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : RowMapper ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด์ฃผ์ž
  • ์„ธ๋ฒˆ์งธ (๋งˆ์ง€๋ง‰) ํŒŒ๋ผ๋ฏธํ„ฐ : SQL์˜ ์น˜ํ™˜์ž์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ’์„ ์ฐจ๋ก€๋Œ€๋กœ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

Replaced ๋œ ์ด์œ ?

  • Object[] ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ฐฐ์—ด์— ๋„ฃ๋Š” ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋ณ€์ธ์ž (VarArg)๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒด

 

โ€ป SQL ์‹คํ–‰์‹œ ๋กœ์šฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด EmptyResultDataAccessException์„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด์ฃผ์ž.

 

(  "๋ฐ˜์นฉ์‹ญ์‹ ์ž…๊ฐœ๋ฐœ์ž"๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ์— ์˜ํ•ด Deprecated๋œ ์ฝ”๋“œ๋ฅผ Replaced ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค. )

์ข‹์€ ํ”ผ๋“œ๋ฐฑ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

 

 

 

 

๐Ÿ’ก query()

 

queryForInt()๊ฐ€ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ์ธ ๋ฐ˜๋ฉด, ๋งŽ์€ ๊ฒฐ๊ณผ ๊ฐ’(๋กœ์šฐ ๊ฐ’)์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

List ํ˜•์‹์„ ํ™œ์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋กœ์šฐ ๊ฐ’๋“ค์„ ์ €์žฅ์‹œ์ผœ์ฃผ์ž

 

return this.jdbcTemplate.query("select * from users order by id" ,
				new RowMapper<User>() {
			public User mapRow(ResultSet rs, int rowNum) throws SQLException {
				User user = new User();
				user.setId(rs.getString("id"));
				user.setName(rs.getString("name"));
				user.setPassword(rs.getString("password"));
				return user;
				
			}
		}

 

  •  ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ์‹คํ–‰ํ•  SQL ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  •  ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ๋ฐ”์ธ๋”ฉํ•  ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•ด์ฃผ์ž.
  •  ์„ธ๋ฒˆ์งธ (๋งˆ์ง€๋ง‰) ํŒŒ๋ผ๋ฏธํ„ฐ : RowMapper ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด์ฃผ์ž.

 

RowMapper์—์„œ ๋งŒ๋“ค์–ด์ง„ User ์˜ค๋ธŒ์ ํŠธ๋Š” ํ…œํ”Œ๋ฆฟ์ด ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ List ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€๋˜๋ฉฐ,

์ž‘์—…์„ ๋งˆ์น˜๋ฉด ๋ชจ๋“  ๋กœ์šฐ์— ๋Œ€ํ•œ User ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” List ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

 

๐Ÿ“ƒ์ •๋ฆฌ

๋„ค๊ฑฐํ‹ฐ๋ธŒ ํ…Œ์ŠคํŠธ๋ฅผ ์žŠ์ง€๋ง์ž!

 

์ฐธ๊ณ  ๋ฌธ์„œ : 

ํ† ๋น„์˜ ์Šคํ”„๋ง3 (์ด์ผ๋ฏผ)

๋ฐ˜์‘ํ˜•