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

Unfazedโ—๏ธ๐ŸŽฏ

JDBC์™€ ์ตœ์‹  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ (SQL Mapper, ORM) ๋ณธ๋ฌธ

Web (back-end)/DB

JDBC์™€ ์ตœ์‹  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ (SQL Mapper, ORM)

9taetae9 2025. 2. 20. 02:24
728x90

JDBC๋Š” 1996๋…„ JDK 1.1์— ๊ณต์‹ ๋„์ž…๋œ Java์˜ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ API๋กœ, ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ์ˆ˜๋™ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ๋‚ฎ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด SQL Mapper์™€ ORM ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿ’ก ์™œ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

  • ๋ฒค๋” ์ค‘๋ฆฝ์„ฑ: ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ‘œ์ค€ JDBC ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉ → ์‹ค์ œ ๊ตฌํ˜„์€ ๊ฐ DB ๋ฒค๋”์˜ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋‹ด๋‹น
  • ํ”Œ๋žซํผ ํ˜ธํ™˜์„ฑ: OS/๋„คํŠธ์›Œํฌ ์ฐจ์ด๋ฅผ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ถ”์ƒํ™”

๐Ÿ”„ ๋™์ž‘ ํ๋ฆ„

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ → DriverManager์— ์—ฐ๊ฒฐ ์š”์ฒญ
  2. ๋“ฑ๋ก๋œ ๋“œ๋ผ์ด๋ฒ„๋“ค ์ค‘ JDBC URL ํŒจํ„ด ์ผ์น˜ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„ ์„ ํƒ
  3. ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ฌผ๋ฆฌ์  ์—ฐ๊ฒฐ ์ƒ์„ฑ ํ›„ Connection ๊ฐ์ฒด ๋ฐ˜ํ™˜

์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” ํŠน์ • DB์™€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฒˆ์—ญ๊ธฐ๋กœ, JDBC ํ‘œ์ค€์„ ๊ตฌํ˜„ํ•˜์—ฌ DB ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

 

 

JDBC์˜ ํ•ต์‹ฌ ์—ญํ• ๊ณผ ํ•œ๊ณ„

  • ์˜์˜ : connection, sql ์ „๋‹ฌ, ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์‹œ์— ํ•ด๋‹น DB์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์ž˜ ๋ชฐ๋ผ๋„ JDBC ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ๋ฒ•๋งŒ ์ˆ™์ง€ํ•œ๋‹ค๋ฉด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 
  • ์ง์ ‘์ ์ธ DB ์—ฐ๊ฒฐ: Connection, Statement, ResultSet ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด SQL ์‹คํ–‰
  • ์ˆ˜๋™ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ๋ช…์‹œ์ ์ธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ํ•„์š”
  • ๋ณต์žกํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: SQLException ์ฒดํฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ•์ œ
  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…: ResultSet์„ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ˜๋ณต ์ฝ”๋“œ ์ž‘์„ฑ ํ•„์š”
  • ํ•œ๊ณ„: ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค SQL, ๋ฐ์ดํ„ฐํƒ€์ž… ๋“ฑ์˜ ์ผ๋ถ€ ์‚ฌ์šฉ๋ฒ•๋“ค์ด ๋‹ค๋ฅด๊ณ , ANSI SQL์ด๋ผ๋Š” ํ‘œ์ค€์ด ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ถ€๋ถ„๋งŒ ๊ณตํ†ตํ™”ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŽ˜์ด์ง• SQL์€ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ์‚ฌ์šฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค. 
  • ๊ฒฐ๊ตญ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์‹œ JDBC ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ SQL์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๋„๋ก ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค.
  • JPA(Java Persistence API)๋Š” ์ด๋Ÿฌํ•œ ํ‘œ์ค€ํ™”์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ SQL์„ ์ •์˜ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋„ ๋งŽ์€ ๋ถ€๋ถ„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

 

SQL Mapper: JDBC์˜ ์‹ค์šฉ์  ๊ฐœ์„ 

- MyBatis 

๊ธฐ๋ณธ์ ์œผ๋กœ JdbcTemplate์ด ์ œ๊ณตํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

JdbcTemplate๊ณผ ๋น„๊ต ์‹œ MyBatis์˜ ํ•ต์‹ฌ ์žฅ์ 

- SQL์„ XML์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

- ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๋งค์šฐ ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

  • ์žฅ์ 
    • SQL๊ณผ ๊ฐ์ฒด ๋งคํ•‘ ์„ ์–ธ๋งŒ์œผ๋กœ CRUD ์ž๋™ํ™”
    • ๋™์  SQL ์ง€์›์„ ํ†ตํ•œ ์กฐ๊ฑด๋ถ€ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์šฉ์ด
    • 90% ์ด์ƒ์˜ JDBC ๋ฐ˜๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ 
๊ธฐ์ˆ  ํŠน์ง• ์‚ฌ์šฉ ์‚ฌ๋ก€
JdbcTemplate ์Šคํ”„๋ง์˜ ์ €์ˆ˜์ค€ ์ถ”์ƒํ™” ๊ณ„์ธต ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ
MyBatis XML/์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ SQL ๊ด€๋ฆฌ ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ ํ•„์š” ์‹œ

native sql์„ ์‚ฌ์šฉํ•ด์•ผ ๋  ๊ฒฝ์šฐ jdbcTemplate๊ณผ mybatis ์ค‘ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

ORM: ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜

๊ธฐ์ˆ  ๊ตฌ์กฐ

[Java Object] ↔ [ORM ์—”์ง„] ↔ [Database Table]

 

  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • ์ž๋™ ์ฟผ๋ฆฌ ์ƒ์„ฑ (HQL, JPQL)
    • ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)๊ณผ ์บ์‹ฑ
    • 1์ฐจ ์บ์‹œ๋ฅผ ํ†ตํ•œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ

JPA ๊ตฌํ˜„์ฒด ๋น„๊ต

๊ตฌํ˜„์ฒด ํŠน์ง• ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋Šฅ
Hibernate ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ์…‹, ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ์„ฑํ™” 2์ฐจ ์บ์‹œ, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
EclipseLink JPA ํ‘œ์ค€ ์—„๊ฒฉ ์ค€์ˆ˜ ์ฟผ๋ฆฌ ํžŒํŠธ ์ตœ์ ํ™”

 

์„ฑ๋Šฅ ๋น„๊ต ๋ถ„์„

  1. ๋‹จ์ˆœ ์กฐํšŒ: SQL Mapper > ORM (5-15% ๋น ๋ฆ„)
  2. ๋ณต์žกํ•œ ์กฐ์ธ: ORM (N+1 ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
  3. ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: SQL Mapper์˜ Native SQL์ด ์œ ๋ฆฌ

๊ทผ๋ณธ ์›๋ฆฌ ์ดํ•ด์˜ ์ค‘์š”์„ฑ

๋ชจ๋“  ํ•˜์ด๋ ˆ๋ฒจ ๊ธฐ์ˆ ์€ ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ปค๋„ฅ์…˜ ํ’€๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ดํ•ด, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”, ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์„ค์ • ๋“ฑ์˜ ๊นŠ์€ ์ดํ•ด๋Š” JDBC ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์•Œ์•„์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ORM์˜ ์ง€์—ฐ ๋กœ๋”ฉ์€ JDBC์˜ ResultSet ์ปค์„œ ๋ฐฉ์‹์„ ํ™œ์šฉํ•œ ๊ตฌํ˜„์ด๋‹ค.

ํŠนํžˆ ๋‹ค์Œ JDBC ํ•ต์‹ฌ ์š”์†Œ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • DriverManager์˜ ์—ฐ๊ฒฐ ์ƒ์„ฑ ๊ณผ์ •
  • PreparedStatement vs Statement ์„ฑ๋Šฅ ์ฐจ์ด
  • ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ์„ค์ •(commit(), rollback())
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(DatabaseMetaData) ํ™œ์šฉ ๊ธฐ๋ฒ•

ex) ORM์—์„œ ๋ฐœ์ƒํ•˜๋Š” LazyInitializationException์ด๋‚˜ SQL Mapper์˜ ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  JDBC ์ˆ˜์ค€์˜ ์ดํ•ด๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.

 

 

๊ฒฐ๋ก 

JDBC๋Š” ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์˜ ํ† ๋Œ€ ์—ญํ• ์„ ํ•˜๋ฉฐ, SQL Mapper์™€ ORM์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ถ”์ƒํ™” ์ˆ˜์ค€์—์„œ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ, ํŒ€์˜ ์ˆ™๋ จ๋„, ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ํ‰๊ฐ€ํ•ด ๊ธฐ์ˆ  ์Šคํƒ์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‘ ๊ธฐ์ˆ ์„ ํ˜ผ์šฉํ•ด ORM์œผ๋กœ ๊ธฐ๋ณธ CRUD๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ณต์žกํ•œ ํ†ต๊ณ„ ์ฟผ๋ฆฌ๋Š” SQL Mapper๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ์ด ํšจ๊ณผ์ ์ด๋‹ค.

 

 

์ฐธ๊ณ  ์ž๋ฃŒ : 

์Šคํ”„๋ง DB1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ (๊น€์˜ํ•œ ๊ฐ•์‚ฌ) 

728x90