JDBC

์Šคํ”„๋ง์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ฒ ํ•™

์Šคํ”„๋ง - ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์ƒ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋”ฉ ์ง€ํ–ฅ -> ์„œ๋น„์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ ์ €์žฅ์†Œ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š์Œ -> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•จ

์„œ๋น„์Šค ๊ฐ์ฒด(Service object)๋Š” ์ €์žฅ์†Œ ์ธํ„ฐํŽ˜์ด์Šค(Repository interface)๋ฅผ ํ†ตํ•ด์„œ ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•œ๋‹ค. ํŠน์ • ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ตฌํ˜„์— ๋ฐ€์ฐฉ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์ด๋‹ค. ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‚˜๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์— ์˜ํ•œ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์€ ํผ์‹œ์Šคํ„ด์Šค๊ธฐ์ˆ ์— ์ƒ๊ด€ ์—†์ด ์•ก์„ธ์Šค, ์˜ค์ง ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋ฉ”์†Œ๋“œ๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋…ธ์ถœ -> ์œ ์—ฐํ•œ ์„ค๊ณ„ ๊ฐ€๋Šฅ


์Šคํ”„๋ง์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ

SQLException์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ”ํ•œ ๋ฌธ์ œ -> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ / ์ฟผ๋ฆฌ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ / ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋ฏธ์กด์žฌ / ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ์‚ฌํ•ญ ์œ„๋ฐฐ ๋“ฑ

-> ๋Œ€๋ถ€๋ถ„ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋ฉฐ, ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ˆ์™ธ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ด์•ผํ•จ.

-> ๋”ฐ๋ผ์„œ ํผ์‹œ์Šคํ„ดํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ, ์˜ˆ์™ธ์— ๊ฐ„ํ•œ ๋‹ค์–‘ํ•œ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. (hibernate๋Š” 20๊ฐœ ์ด์ƒ์˜ ์˜ˆ์™ธ ์ œ๊ณต)

-> JDBC์˜ ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋„ˆ๋ฌด ํฌ๊ด„์ ์ด์–ด์„œ, ๊ณ„์ธต๊ตฌ์กฐ๋ผ๊ณ  ํ•  ๊ฒƒ๋„ ์—†์Œ

-> ์Šคํ”„๋งJDBC์—์„œ๋Š”, ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์˜ˆ์™ธ ๊ณ„์ธต์„ ์ œ๊ณตํ•œ๋‹ค. ์ผ๋ฐ˜ JDBC์™€๋Š” ๋Œ€์กฐ์ ์ž„

==> ์Šคํ”„๋งJDBC์˜ ์—์™ธ๋Š” ์ „๋ถ€, DataAccessException์„ ํ™•์žฅํ•œ๋‹ค. ํŠน๋ณ„ํ•œ ์ ์€ ๋น„๊ฒ€์‚ฌํ˜• ์˜ˆ์™ธ์ด๊ธฐ ๋•Œ๋ฌธ์—, catch๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค(์Šคํ”„๋ง์˜ ๋งŽ์€ ์˜ˆ์™ธ๊ฐ€ catch๋กœ ์žก์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์œผ๋กœ ๋ณด์ž„, ๊ฒ€์‚ฌํ˜•์˜ ๊ฒฝ์šฐ ๋นˆ catch๋ธ”๋ก๋„ ๊ฐ•์ œ๋จ)


๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํ…œํ”Œ๋ฆฟํ™”

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

* ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋Š” ์ ˆ์ฐจ์˜ ๊ณจ๊ฒฉ์„ ์ •์˜ํ•œ๋‹ค(๊ณ ์ •์ )

* ์–ด๋–ค ๋‹จ๊ณ„์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ๋‹จ๊ณ„์˜ ์ž‘์—…์„ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ์œ„์ž„ํ•œ๋‹ค. ํ•ด๋‹น ์„œ๋ธŒํด๋ž˜์Šค๋กœ ํ•˜์—ฌ๊ธˆ ๊ตฌํ˜„ ์ข…์†์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ฑ„์šฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ(๊ฐ€๋ณ€์ )

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํ…œํ”Œ๋ฆฟ

* ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ ˆ์ฐจ์— ์žˆ์–ด, ๋””๋น„ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ ˆ์ฐจ๋Š” ๋งค๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค -> ์ ˆ์ฐจ์˜ ๊ณจ๊ฒฉ(๊ณ ์ •์ )

* ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์™€, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž‘์„ฑํ•ด์•ผํ•  ๊ฐ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋กœ ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฆ„ -> ๊ฐ€๋ณ€์ ์ธ ๋‹จ๊ณ„

-> ์Šคํ”„๋ง์€ ์ด๋Ÿฐ, ์ ˆ์ฐจ์—์„œ, ๊ณ ์ •๋‹จ๊ณ„ 'ํ…œํ”Œ๋ฆฟtemplate', ๊ฐ€๋ณ€๋‹จ๊ณ„๋ฅผ '์ฝœ๋ฐฑcallback'์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•จ

=> ์Šคํ”„๋ง์€ ํผ์‹œ์Šคํ„ด์Šค ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ์„ ํƒ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณต -> ๋Œ€ํ‘œ์ ์œผ๋กœ JdbcTemplate, HibernateTemplate, JpaTemlate


๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ •

์Šคํ”„๋ง์— ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋นˆ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• - JDBC๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ์„ ์–ธ, JNDI์— ๋“ฑ๋ก, ์ปค๋„ฅ์…˜์„ ํ’€๋ง


JNDI ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ด์šฉ

๋Œ€๋ถ€๋ถ„ JEE ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋ฐฐํฌ๋Œ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์„œ๋ฒ„๋Š” JBoss, Tomcat๊ณผ ๊ฐ™์€ ์›น ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•จ. ์ด ์„œ๋ฒ„๋“ค์€ ๋ชจ๋‘ JNDI๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค - ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์ ‘๊ทผ ์‹œ์ ์— ์š”์ฒญ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Œ

JndiObjectFactoryBean ๊ตฌํ˜„

@Bean
public JndiObjectFactoryBean dataSource() {
  JndiObjectFactoryBean jndiObjectFB = new JndiObjectFactoryBean();
  jndiObjectFB.setJndiName("jdbc/SpittrDS");
  jndiObjectFB.setResourceRef(true);
  jndiObjectFB.setProxyInterface(javax.sql.DataSource.class);
  return jndiObjectFB;
}

ํ’€๋ง๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‚ฌ์šฉํ•˜๊ธฐ

JNDI๋กœ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์„ ๋•Œ, ์ฐจ์„ ์ฑ…์€ ํ’€๋ง ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ

* ์•„ํŒŒ์น˜ ๊ณตํ†ต DBCP, c3p0, BoneCP ์‚ฌ์šฉ ๊ฐ€๋Šฅ

BasicDataSource ๊ตฌํ˜„

@Bean
public BasicDataSource dataSource() {
  BasicDataSource ds = new BasicDataSource();
  ds.setDriverClassName("org.h2.Driver");
  ds.setUrl("jdbc:h2:tcp://localhost/~/spitter");
  ds.setUsername("sa");
  ds.setPassword("");   /// ์—ฌ๊ธฐ๊นŒ์ง€ 4๊ฐœ๊ฐ€ ์„ค์ •์˜ ๊ธฐ๋ณธ
  ds.setInitialSize(5); // ํ’€์ด ์‹œ์ž‘ ๋  ๋•Œ, ์ปค๋„ฅ์…˜ ์ˆ˜
  ds.setMaxActive(10);  // ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜
  return ds;
}

JDBC ๋“œ๋ผ์ด๋ฒ„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค

DriverManagerDataSource - ์ปค๋„ฅ์…˜ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค, ์ƒˆ๋กœ์šด ์ปค๋„ฅ์…˜ ๋ฐ˜ํ™˜, ํ’€๋ง ๋˜์ง€ ์•Š์Œ

SimpleDriverDataSource - OSGi ์ปจํ…Œ์ด๋„ˆ ๊ฐ™์€ ํŠน์ • ํ™˜๊ฒฝ์˜, ๋กœ๋”ฉ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณต์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ ์ œ์™ธํ•˜๋ฉด DriverManagerDataSource์™€ ๋™์ผํ•˜๋‹ค

SingleConnnectionDataSource - ์ปค๋„ฅ์…˜ ์š”์ฒญ์‹œ, ํ•ญ์ƒ ๋™์ผํ•œ ์ปค๋„ฅ์…˜ ๋ฐ˜ํ™˜, ํ’€๋ง์€ ๊ธฐ๋Šฅ์€ ์—†์ง€๋งŒ, ํ•œ ์ปค๋„ฅ์…˜๋งŒ์„ ํ’€๋งํ•˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค

-> BasicDatasource์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์œผ๋‚˜... ์ƒ์šฉ์—์„œ๋Š” ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค, ํ’€๋ง๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— '๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜'์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

-> ๊ฐœ๋ฐœ๊ณผ, ํ…Œ์ŠคํŠธ ์ด์™ธ ๋น„์ถ”

๊ตฌํ˜„ ์˜ˆ์‹œ

@Bean
public DataSource dataSource() {
  DriverManagerDataSource ds = new DriverManagerDataSource();
  ds.setDriverClassName("org.h2.Driver");
  ds.setUrl("jdbc:h2:tcp://localhost/~/spitter");
  ds.setUsername("sa");
  ds.setPassword("");
  return ds;
}

์ž„๋ฒ ๋””๋“œ ๋ฐ์ดํ„ฐ ์†Œ์Šค

- ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ, ๊ดœ์ฐฎ์€ ์„ ํƒ , ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ์Œ

- ๋”ฐ๋กœ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๊ด€ํ•œ, ํŽธ์˜์„ฑ ์ œ๊ณต์€ ์—†์Œ(xml ์„ค์ •์—๋Š” ์กด์žฌ).. EmbeddedDatabaseBuilder ์‚ฌ์šฉ

@Bean
public DataSource dataSource() {
  return new EmbeddedDatabaseBuilder()
             .setType(EmbeddedDatabaseType.H2)
             .addScript("classpath:schema.sql")
             .addScript("classpath:test-data.sql")
             .build();
}

๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ ํƒ์„ ์œ„ํ•œ ํ”„๋กœํŒŒ์ผ๋ง

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์‹œ, ํ™˜๊ฒฝ๋ณ„๋กœ dev๋Š” ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•œ ์ž„๋ฒ ๋””๋“œ ๋ฐ์ดํ„ฐ์†Œ์Šค, qaํ™˜๊ฒฝ์—์„œ๋Š” BasicDataSource, ๊ทธ๋ฆฌ๊ณ  ์ƒ์šฉํ™˜๊ฒฝ์—์„œ๋Š” jndiDataSource๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜์ž.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์Šคํ”„๋ง์˜ ํ”„๋กœํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ dataSource๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ ์˜ˆ์‹œ

@Configuration
public class DataSourceConfiguration {
  @Profile("dev") // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  @Bean
  public DataSource embeddedDataSource() {
    return new EmbeddedDatabaseBuilder()
               .setType(EmbeddedDatabaseType.H2)
               .addScript("classpath:schema.sql")
               .addScript("classpath:test-data.sql")
               .build();
  }
  
  @Profile("qa") // QA ํ™˜๊ฒฝ
  @Bean
  public DataSource Data() {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("org.h2.Driver");
    ds.setUrl("jdbc:h2:tcp://localhost/~/qa");
    ds.setUsername("sa");
    ds.setPassword("");
    ds.setInitialSize(5);
    ds.setMaxActive(10);
    return ds;
  }

  @Profile("prod") // ์ƒ์šฉํ™˜๊ฒฝ
  @Bean
  public DataSource dataSource() {
    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    jndiObjectFactoryBean.setJndiName("jdbc/DS_PROD"); 
    jndiObjectFactoryBean.setResourceRef(true); 
    jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class); 
    return (DataSource) jndiObjectFactoryBean.getObject();
  } 
}

์Šคํ”„๋ง๊ณผ JDBC

JDBC ์žฅ์  : ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์–ธ์–ด์ธ SQL์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ, ๊ฐœ๋ณ„ ์นผ๋Ÿผ์— ์•ก์„ธ์Šค๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํŠนํžˆ ๋ฆฌํฌํŒ… ๋ถ€๋ฅ˜์— ํŽธ๋ฆฌํ•จ.

JDBC ๋‹จ์  - ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•˜๋‹ค(๊ฐ„๋‹จํ•œ ๊ฐ์ฒด ํ•˜๋‚˜์— 20์ค„ ์ด์ƒ ์ฝ”๋“œ), SQLException ํ•˜๋‚˜๋กœ ๋ชฝ๋•… ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ์š•์‹ฌ(์˜ˆ์™ธ ๋ช…ํ™•ํ•˜์ง€์•Š๊ณ , catch๋„ ๋‘๋ฒˆ์ด๋‚˜ ํ•ด์•ผํ•จ), 20%์˜ ์ฝ”๋“œ๋งŒ์ด ์‹ค์ œ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์ด๊ณ  80%๋Š” ๋‹จ์ˆœ ๋ฐ˜๋ณต์ฝ”๋“œ

====> ์Šคํ”„๋ง์€ ์ด๋Ÿฐ JDBC์˜ ์žฅ์ ์€ ๊ฐ€์ ธ์˜ค๊ณ , ๋‹จ์ ์€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ณด์™„ํ•œ๋‹ค.


JDBC ํ…œํ”Œ๋ฆฟ

๋‹จ์ˆœ ๋ฐ˜๋ณต์ ์ธ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ฝ”๋“œ๋ฅผ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค๋’ค๋กœ ์ถ”์ƒํ™”ํ•ด์„œ ์ˆจ๊ธด๋‹ค.

* JdbcTemplate - ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ JDBCํ…œํ”Œ๋ฆฟ, ์ƒ‰์ธ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜์˜ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค

* NamedParameterJdbcTemplate - SQL๊ฐ’๋“ค์„ ์ƒ‰์ธ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋Œ€์‹ , ๋ช…๋ช…๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰

* SimpleJdbcTemplate - ์ž๋ฐ”5๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์˜คํ† ๋ฐ•์‹ฑ, ์ œ๋„ค๋ฆญ์Šค ๋“ฑ์„ ํ™œ์šฉํ•ด ์‰ฝ๊ฒŒ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ


JdbcTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

JdbcTemplate์€, DataSource๊ฐ€ ์žˆ์–ด์•ผ ๋™์ž‘

@Bean
pbulic JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

=> ์ด์ œ, jdbcTemplate์„ ์ €์žฅ์†Œ๋กœ ์™€์ด์–ด๋ง๋„ ํ•  ์ˆ˜์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šค๋„ ๊ฐ€๋Šฅ

@Repository
public class JdbcCoffeeRepository implements CoffeeRepository {
  private JdbcOperations jdbcOperations;
  
  @Inject
  public JdbcSpitterRepository(JdbcOperations jdbcOperations) {
    this.jdbcOperations = jdbcOperations; // JdbcTemplate์œผ๋กœ ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ๋™์ž‘.. ๋Š์Šจํ•œ ๊ฒฐํ•ฉ
  }
  ~~~~~
}

///////////

@Bean
public CoffeeRepository coffeeRepository(JdbcTemplate jdbcTemplate) {
    return new JdbcCoffeeRespository(jdbcTemplate);
}

==> ๋‹จ์ˆœํ™”ํ•œ JdbcTemplate ๊ธฐ๋ฐ˜์˜ INSERT ํ•จ์ˆ˜

private static final String SQL_INSERT_COFFEE = "insert into coffee (name, shot) values (?, ?)";

public void addCoffee(Coffee coffee) {
  jdbcOperations.update(INSERT_COFFEE, coffee.getName, coffee.getShot);
}

==> ๋‹จ์ˆœํ™”ํ•œ JdbcTemplate์˜ SELECTํ•จ์ˆ˜(rowMapper ๋žŒ๋‹ค ์‚ฌ์šฉ / ์ฐธ๊ณ  https://codeday.me/ko/qa/20190404/236877.html )

public static final String SQL_SELECT_COFFEE_BY_NAME = "select name, shot from coffee where name = ?";

public Coffee findOne(String name) {
  return jdbcOperations.queryForObject(
    SELECT_COFFEE_BY_NAME
    , (rs, rowNum) -> {
        return new Coffee(
        rs.getString("name")
        , rs.getInt("shot"));
      }
    , id); 
}

๋ช…๋ช…๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๊ฐ€, ๋ถ€๋“์ดํ•˜๊ฒŒ SQL์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€๋‹ค๊ฑฐ๋‚˜ ํ•˜๋ฉด, ๋ชฉ๋ก์— ๋งž๊ฒŒ ์ฝ”๋“œ๋„ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ช…๋ช…๋˜์–ด ์žˆ๋‹ค๋ฉด SQL์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค

๋ช…๋ช…ํ™”๋œ ํŒŒ๋ผ๋ฏธํ„ฐ SQL๋ฌธ ์˜ˆ์‹œ

private static final String SQL_INSERT_COFFEE = "inster into coffee (name, shot) values (:name, :shot)";
// ๊ธฐ์กด (?, ?)์—์„œ (:name, :shot) ์œผ๋กœ ๋ณ€๊ฒฝ

* NamedParameterJdbcTemplate ์‚ฌ์šฉ

@Bean
pbulic NamedParameterJdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new NamedParameterJdbcTemplate(dataSource);
}

=> ๋ช…๋ช…ํ™”๋œ ํŒŒ๋ผ๋ฏธํ„ฐ INSERT ์˜ˆ์‹œ

private static final String SQL_INSERT_COFFEE = "insert into coffee (name, shot) values (?, ?)";

public void addCoffee(Coffee coffee) {
  Map<String, Object> paramMap = new HashMap<Sring, Object>;
  paramMap.put("name", coffee.name);
  paramMap.put("shot", coffee.shot);
  
  jdbcOperations.update(INSERT_COFFEE, paramMap);
}

Last updated