๋ฐ์ํ
์คํ๋ง JdbcTemplate ๋ฆฌํฌ์งํ ๋ฆฌ ์์ฑ
์ค์ ์ Jdbc ์ค์ ๊ณผ ๋์ผํ๊ฒ ํ๋ฉด ๋๋ค.
์คํ๋ง Jdbc Data Access Layer ์ดํด
DataSource ๋?
- DB์ ๊ด๊ณ๋ Connection ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, bean์ผ๋ก ๋ฑ๋กํ์ฌ ์ธ์๋ก ๋๊ฒจ์ค๋ค.
์ด ๊ณผ์ ์ ํตํด Spring์ DataSource๋ก DB์์ ์ฐ๊ฒฐ์ ํ๋ํ๋ค.
DataSource ์ค์ ๋ฐ ๋น ๋ฑ๋ก๋ฐฉ๋ฒ
application.properties
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
#url : db์ url์ ๋ฃ์ด์ฃผ๋ฉด ์๋์ผ๋ก connection์ด ๋จ.
spring.datasource.driver-class-name=org.h2.Driver
#h2๋ฅผ ์ฌ์ฉ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
springConfig.java
ํ์ผ์ ์์ฑํ์ฌ ๋น ์ค์ ํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
package me.iseunghan.plainjdbc;
import me.iseunghan.plainjdbc.Accounts.AccountRepository;
import me.iseunghan.plainjdbc.Accounts.AccountService;
import me.iseunghan.plainjdbc.Accounts.JdbcAccountRepository;
import me.iseunghan.plainjdbc.Accounts.JdbcTemplateAccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.management.MXBean;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private final DataSource dataSource;//์ด๋ฏธ spring์ด ๋ฑ๋กํด๋จ๊ธฐ๋๋ฌธ์ ์ฃผ์
๋ฐ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
JdbcAccountRepository jdbcAccountRepository;
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
public AccountService accountService() {
return new AccountService(accountRepository());
}
@Bean
public AccountRepository accountRepository() {
//return new JdbcAccountRepository(dataSource);
return new JdbcTemplateAccountRepository(dataSource);
}
}
JdbcTemplate ๋?
JDBC Template
์Spring JDBC
์ ๊ทผ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ๋ด๋ถ์ ์ผ๋กPlain JDBC API
๋ฅผ ์ฌ์ฉํ์ง๋ง ์์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ ์ ๊ฑฐํ ํํ์ Spring์์ ์ ๊ณตํ๋ class์ด๋ค. ํธ๋ฆฌํ๋ค.
JdbcTemplate Repository code
package me.iseunghan.plainjdbc.Accounts;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
public class JdbcTemplateAccountRepository implements AccountRepository{
private final JdbcTemplate jdbcTemplate;
//DataSource๋ฅผ ์ฃผ์
๋ฐ์ JdbcTemplate ์์ฑ์์๊ฒ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค๋ค.
public JdbcTemplateAccountRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Account save(Account account) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("Account").usingGeneratedKeyColumns("id");
Map<String, Object> parameter = new HashMap<>();
parameter.put("name", account.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameter));
account.setId(key.longValue());
return account;
}
@Override
public Optional<Account> findById(Long id) {
List<Account> result = jdbcTemplate.query("select * from Account where id = ?", accountRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<Account> findByName(String name) {
List<Account> result = jdbcTemplate.query("select * from Account where name = ?", accountRowMapper(), name);
return result.stream().findAny();
}
@Override
public List<Account> findAll() {
return jdbcTemplate.query("select * from Account",accountRowMapper());
}
private RowMapper<Account> accountRowMapper() {
return (rs, i) -> {
Account account = new Account();
account.setId(rs.getLong("id"));
account.setName(rs.getString("name"));
return account;
};
}
// lamda๋ฅผ ์ด์ฉํ ํํ
/*private RowMapper<Account> accountRowMapper() {
return new RowMapper<Account>() {
@Override
public Account mapRow(ResultSet rs, int i) throws SQLException {
Account account = new Account();
account.setId(rs.getLong("id"));
account.setName(rs.getString("name"));
return account;
}
};
}*/
}
์ฐธ๊ณ :
Spring Jdbc์ ์ดํด์ ์๋ฆฌ ์์๋ณด๊ธฐ
JdbcTemplate์ ์ดํด์ ์๋ฆฌ ์์๋ณด๊ธฐ
๋ฐ์ํ