๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

JDBC์™€ Spring JDBC ๊ธฐ๋ณธ ์ดํ•ดํ•˜๊ธฐ ๋ณธ๋ฌธ

Study/Java

JDBC์™€ Spring JDBC ๊ธฐ๋ณธ ์ดํ•ดํ•˜๊ธฐ

Shinjio 2024. 11. 19. 22:12
๋ฐ˜์‘ํ˜•

JDBC(Java Database Connectivity)

JDBC๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ, ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ž๋ฐ” API์ด๋‹ค. ์ž๋ฐ” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค์–‘ํ•œ DBMS์— ๋Œ€ํ•ด ์ผ๊ด€๋œ API๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๊ฒ€์ƒ‰, ์ˆ˜์ •, ๊ด€๋ฆฌ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ž๋ฐ”๋กœ ๊ฐœ๋ฐœ์‹œ์—๋Š” DBMS ์ข…๋ฅ˜์— ๊ด€๊ณ„์—†์ด JDBC API๋งŒ์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ DBMS๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšŒ์‚ฌ์—์„œ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ž๋ฐ” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ JDBC ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. 

 

๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” DBMS๊ฐ€ ๋ฐ”๊ปด๋„ ์ด์— ๋”ฐ๋ฅธ JDBC ๋“œ๋ผ์ด๋ฒ„๋งŒ ๋กœ๋“œํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—๋Š” DBMS ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ •์ด ํ•„์š” ์—†๋‹ค.

  • JDBC ๋“œ๋ผ์ด๋ธŒ ๋งค๋‹ˆ์ € : ์ž๋ฐ” API์—์„œ ์ง€์›ํ•˜๋ฉฐ DBMS๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
  • JDBC ๋“œ๋ผ์ด๋ฒ„: DBMS๋งˆ๋‹ค ๊ณ ์œ ํ•œ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, JDBC ๋“œ๋ผ์ด๋ฒ„์™€ DBMS๋Š” ์ „์šฉ ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜๋ฆฌ

JDBC์˜ ์ฃผ์š” ์—ญํ• 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ
  • SQL ์ฟผ๋ฆฌ ์‹คํ–‰
  • ๊ฒฐ๊ณผ ์„ธํŠธ(ResultSet) ์ฒ˜๋ฆฌ
  • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ

JDBC API ๊ตฌ์„ฑ

  • DriverManager: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ๋ฐ ๊ด€๋ฆฌ
  • Connection: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋ƒ„
  • Statement, PreparedStatement, CallableStatement: SQL ์‹คํ–‰
  • ResultSet: SQL ์‹คํ–‰ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
  • SQLException: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

JDBC ๋“œ๋ผ์ด๋ฒ„

JDBC ๋“œ๋ผ์ด๋ฒ„๋ž€ JDBC API๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”์‚ฌ์—์„œ ์ž์‚ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

JDBC ๋“œ๋ผ์ด๋ฒ„ ์ฃผ์š” ์—ญํ• 

  • JDBC API ํ˜ธ์ถœ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‘๋‹ต์„ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜

์ฃผ์š” JDBC ๋“œ๋ผ์ด๋ฒ„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค JDBC ๋“œ๋ผ์ด๋ฒ„ ์ด๋ฆ„ ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค๋ช…
MySQL MySQL Connector/J com.mysql.cj.jdbc.Driver
MariaDB MariaDB Connector/J org.mariadb.jdbc.Driver
Oracle Oracle JDBC Thin Driver oracle.jdbc.OracleDriver
PostgreSQL PostgreSQL JDBC Driver org.postgresql.Driver
Microsofe SQL Server Microsoft JDBC Driver for SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver

JDBC์™€ JDBC ๋“œ๋ผ์ด๋ฒ„์˜ ์ฐจ์ด

๊ตฌ๋ถ„ JDBC JDBC ๋“œ๋ผ์ด๋ฒ„
์—ญํ•  ํ‘œ์ค€ API๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ์ •์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์‹ค์ œ ํ†ต์‹  ๊ตฌํ˜„
์ œ๊ณต ์ฃผ์ฒด Java ํ”Œ๋žซํผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”
๊ตฌ์ฒดํ™” ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณต ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž์ถ˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„
์ข…์†์„ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์  ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์— ์ข…์†์ 

 

์ฆ‰, JDBC๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ํ‘œ์ค€ API๋ฅผ ์ œ๊ณตํ•˜๋Š” Java ๊ธฐ์ˆ ์ด๊ณ , JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ต์‹ ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค.


 

Spring JDBC

๋งŒ์•ฝ Spring Framework๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด JDBC API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , Spring JDBC ํ˜น์€ Spring ORM์„ ์‚ฌ์šฉํ•˜์—ฌ DB์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ๊ณผ์ •์—์„œ Spring์ด JDBC API๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ, ์ด๋ฅผ ๊ฐ์‹ธ๋Š” ์ถ”์ƒํ™” ๋ ˆ์ด์–ด ๋•๋ถ„์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ JDBC ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Spring JDBC ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

DataSource

  • ์—ญํ• : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • Spring JDBC๋Š” javax.sql.DataSource ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ถ”์ƒํ™”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€(Connection Pool)๋„ ์ง€์›ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ HikariCP, Apache DBCP, Tomcat JDBC Connection Pool๊ณผ ๊ฐ™์€ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
Database ์—ฐ๊ฒฐ ํ’€(Connection Pool)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ซ๋Š” ๊ณผ์ •์€ ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” ๊ณผ์ •์ธ๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๋งŒ ์—ฐ๊ฒฐ ์ƒ์„ฑ ๋น„์šฉ์ด ์ปค์ ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์˜ ๋ณ‘๋ชฉ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ ํ’€์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ด๋ฏธ ์ƒ์„ฑ๋œ ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€ ๊ตฌํ˜„์ฒด๋กœ๋Š” HikariCP, Apache DBCP, C3P0, Tomcat JDBC Connection Pool์ด ์žˆ๊ณ , ํ˜„์žฌ์˜ Spring Boot์—์„œ๋Š” HikariCP๊ฐ€ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ํ’€์ด๋ฉฐ, 1.x ๋ฒ„์ „๋Œ€์—์„œ๋Š” Tomcat JDBC Connection Pool์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

 

  1. JdbcTemplate
    • ํ•ต์‹ฌ ํด๋ž˜์Šค๋กœ JDBC ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•œ๋‹ค.
    • SQL ์‹คํ–‰, PreparedStatement ์ƒ์„ฑ, ResultSet ์ฒ˜๋ฆฌ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ์ฃผ์š” ๋ฉ”์„œ๋“œ:
      • query(): SELECT ์‹คํ–‰
      • update(): INSERT, UPDATE, DELETE ์‹คํ–‰
      • execute(): DDL ๋˜๋Š” ๋ณต์žกํ•œ SQL ์‹คํ–‰
      • batchUpdate(): ๋Œ€๋Ÿ‰ ์—…๋ฐ์ดํŠธ
  2. RowMapper
    • ์—ญํ•  : ResultSet์˜ ๋ฐ์ดํ„ฐ๋ฅผ java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•œ๋‹ค.
    • JdbcTemplate์ด SQL ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ๊ธฐ๋ณธ ์ œ๊ณต ํด๋ž˜์Šค:
      • BeanPropertyRowMapper: ResultSet์„ Java Bean์œผ๋กœ ๋งคํ•‘
      • RowMapper: ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ๊ฐ€๋Šฅ
  3. Exception Translation
    • JDBC API์˜ SQLException์„ Spring์˜ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ์˜ˆ์™ธ ๊ณ„์ธต์œผ๋กœ ๋ณ€ํ™˜
    • ์ฃผ์š” ์˜ˆ์™ธ ๊ณ„์ธต:
      • DataAccessException: Spring JDBC์˜ ์ตœ์ƒ์œ„ ์˜ˆ์™ธ
      • DuplicateKeyException, DataIntergrityViolationException ๋“ฑ ์„ธ๋ถ„ํ™”๋œ ์˜ˆ์™ธ ์ œ๊ณต

Spring JDBC vs ์ˆœ์ˆ˜ JDBC

ํŠน์ง• Spring JDBC ์ˆœ์ˆ˜ JDBC
์ฝ”๋“œ ๋ณต์žก๋„ ๊ฐ„๊ฒฐํ•จ(์ž๋™ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ฐ ์ž์› ์ •๋ฆฌ) ๋ณต์žกํ•จ(์—ฐ๊ฒฐ, ์ž์› ์ˆ˜๋™ ๊ด€๋ฆฌ ํ•„์š”)
์˜ˆ์™ธ ์ฒ˜๋ฆฌ Spring์˜ DataAccessException ๊ณ„์ธต ์‚ฌ์šฉ SQLException ์ˆ˜๋™ ์ฒ˜๋ฆฌ ํ•„์š”
ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ Spring ํŠธ๋žœ์žญ์…˜ ์ง€์›(@Transactional) ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”
๊ฒฐ๊ณผ ๋งคํ•‘ RowMapper๋กœ ๊ฐ„๋‹จํžˆ ๋งคํ•‘ ๊ฐ€๋Šฅ ์ˆ˜๋™์œผ๋กœ ResultSet ์ฒ˜๋ฆฌ ํ•„์š”

 

๋ฐ˜์‘ํ˜•