Home > Spring > πŸƒ[Spring] Hibernate와 JDBCλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?

πŸƒ[Spring] Hibernate와 JDBCλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?
Spring Framework

πŸƒ[Spring] Hibernate와 JDBCλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?

  • Hibernate와 JDBC(Java Database Connectivity)λŠ” λͺ¨λ‘ μžλ°”μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” λ°©μ‹μ΄μ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ μˆ˜μ€€μ—μ„œ μž‘λ™ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.
  • HibernateλŠ” JDBC(Java Database Connectivity)λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 연결을 κ΄€λ¦¬ν•˜κ³  쿼리λ₯Ό μ‹€ν–‰ν•˜μ§€λ§Œ, κ·Έ μ—­ν• κ³Ό λͺ©μ μ΄ λ‹€λ¦…λ‹ˆλ‹€.
    • 이 λ‘˜μ˜ 관계와 차이점을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ 각 도ꡬλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1️⃣ JDBC(Java Database Connectivity)

  • JDBC(Java Database Connectivity)λŠ” μžλ°”μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 μ—°κ²°ν•˜κ³  SQL 쿼리λ₯Ό μ‹€ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” μ €μˆ˜μ€€ APIμž…λ‹ˆλ‹€.
    • JDBC(Java Database Connectivity)λŠ” κ°œλ°œμžκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— SQL(Structured Query Language) 문을 μž‘μ„±ν•˜κ³ , κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ™€ 직접 μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.
  • JDBC(Java Database Connectivity)λŠ” λͺ¨λ“  SQL(Structured Query Language) μž‘μ—…(μ‚½μž…, κ°±μ‹ , μ‚­μ œ, 쑰회)을 μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 관리, 쿼리 μ‹€ν–‰, κ²°κ³Ό μ§‘ν•©(ResultSet) 처리, μ˜ˆμ™Έ 처리 등을 κ°œλ°œμžκ°€ 직접 관리해야 ν•©λ‹ˆλ‹€.

πŸ‘‰ JDBC μ˜ˆμ‹œ.

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM Users WHERE id = ?");
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
    System.out.println(rs.getString("name"));
}
  • μœ„μ˜ μ½”λ“œμ—μ„œ κ°œλ°œμžλŠ” SQL을 직접 μž‘μ„±ν•˜κ³ , Connection 및 PreparedStatement와 같은 JDBC(Java Database Connectivity) 객체λ₯Ό μ΄μš©ν•΄ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.

2️⃣ Hibernate

  • HibernateλŠ” μžλ°”μ—μ„œ ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ 더 μΆ”μƒν™”λœ κ³ μˆ˜μ€€ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • HibernateλŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό μžλ°” 객체 κ°„μ˜ 맀핑을 톡해, 직접적인 SQL(Structured Query Language) 쿼리 μž‘μ„± 없이도 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • HibernateλŠ” λ‚΄λΆ€μ μœΌλ‘œ JDBC(Java Database Connectivity)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°ν•˜μ§€λ§Œ, κ°œλ°œμžλŠ” 이λ₯Ό 직접 λ‹€λ£° ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • λŒ€μ‹ , 객체 쀑심적인 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • HibernateλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 관리, 캐싱, 트랜 μž­μ…˜ 관리 쿼리 생성을 λͺ¨λ‘ μžλ™ν™”ν•˜κ±°λ‚˜ μ‰½κ²Œ μ²˜λ¦¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

πŸ‘‰ Hibernate μ˜ˆμ‹œ.

Session session = sessionFactory.openSession();
User user = session.get(User.class, 1); // SQL μž‘μ„± 없이 객체둜 데이터 쑰회
System.out.println(user.getName());
  • μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” SQL(Structured Query Language)을 μž‘μ„±ν•  ν•„μš” 없이 Hibernateκ°€ SQL(Structured Query Language)λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜μ—¬ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

3️⃣ Hibernate와 JDBC의 관계 및 차이점.

1️⃣ 좔상화(Abstraction) μˆ˜μ€€.

  • JDBC(Java Database Connectivity)λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•˜λŠ” μ €μˆ˜μ€€ APIμž…λ‹ˆλ‹€.
    • κ°œλ°œμžλŠ” SQL(Structure Query Language)을 직접 μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•΄μ•Ό ν•˜λ©°, μ—°κ²°, νŠΈλžœμž­μ…˜, μ˜ˆμ™Έ 처리 등도 관리해야 ν•©λ‹ˆλ‹€.
  • HibernateλŠ” κ³ μˆ˜μ€€ ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬λ‘œ, JDBC(Java Database Connectivity) λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ SQL(Structured Query Language) 쿼리λ₯Ό μ‹€ν–‰ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜μ§€λ§Œ, κ°œλ°œμžμ—κ²ŒλŠ” 객체 μ§€ν–₯적인 APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • λ”°λΌμ„œ SQL(Structured Query Language) λŒ€μ‹  μžλ°” 객체λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ SQL μž‘μ„±.

  • JDBC(Java Database Connectivity)λŠ” SQL(Structured Query Language)을 직접 μž‘μ„±ν•΄μ•Ό ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ” ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³  그에 λ§žλŠ” 쿼리λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • HibernateλŠ” SQL(Structured Query Language)을 μžλ™μœΌλ‘œ μƒμ„±ν•˜κ±°λ‚˜, HQL(Hibernate Query Language)κ³Ό 같은 객체 μ§€ν–₯적인 쿼리 μ–Έμ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄ SQL(Structured Query Language)을 직접 μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ λ°μ΄ν„°λ² μ΄μŠ€ 독립성.

  • JDBC(Java Database Connectivity)λŠ” νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— 맞좰 SQL을 μž‘μ„±ν•΄μ•Ό ν•˜λ―€λ‘œ λ°μ΄ν„°λ² μ΄μŠ€ 쒅속적인 μ½”λ“œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • HibernateλŠ” νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— μ’…μ†λ˜μ§€ μ•ŠμœΌλ©°, μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ μ „ν™˜μ΄ μ‰½μŠ΅λ‹ˆλ‹€.
    • SQL(Structured Query Language)을 μžλ™μœΌλ‘œ 생성할 λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ 쒅속 적인 차이λ₯Ό μ²˜λ¦¬ν•΄μ€λ‹ˆλ‹€.

4️⃣ νŠΈλžœμž­μ…˜ 및 μ—°κ²° 관리.

  • JDBC(Java Database Connectivity)μ—μ„œλŠ” κ°œλ°œμžκ°€ 직접 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  μ’…λ£Œν•΄μ•Ό ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€ 연결도 μˆ˜λ™μœΌλ‘œ 관리해야 ν•©λ‹ˆλ‹€.
  • HibernateλŠ” νŠΈλžœμž­μ…˜κ³Ό μ—°κ²° 관리λ₯Ό μžλ™ν™”ν•˜μ—¬, κ°œλ°œμžκ°€ μ΄λŸ¬ν•œ μ„ΈλΆ€ 사항을 μ‹ κ²½ μ“Έ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • νŠΈλžœμž­μ…˜μ€ μ„Έμ…˜ λ‹¨μœ„λ‘œ 처리되며, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°λ˜ μžλ™μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

5️⃣ 캐싱 및 μ„±λŠ₯ μ΅œμ ν™”.

  • JDBC(Java Database Connectivity)λŠ” 캐싱 κΈ°λŠ₯이 μ—†μœΌλ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • HibernateλŠ” 1μ°¨ μΊμ‹œμ™€ 2μ°¨ μΊμ‹œλ₯Ό μ œκ³΅ν•˜μ—¬, 반볡적인 λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μ΅œμ†Œν™”ν•˜κ³  μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ 1μ°¨ μΊμ‹œμ™€ 2μ°¨ μΊμ‹œ.

1μ°¨ μΊμ‹œμ™€ 2μ°¨ μΊμ‹œλŠ” Hibernateμ—μ„œ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 캐싱 λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.
μΊμ‹œλŠ” 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ 접근을 쀄이고, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

1️⃣ 1μ°¨ μΊμ‹œ(First-Level Cache)

μ„Έμ…˜ λ²”μœ„μ˜ μΊμ‹œλ‘œ, Hibernateμ—μ„œ 기본적으둜 μ œκ³΅λ˜λŠ” μΊμ‹œμž…λ‹ˆλ‹€.
μ„Έμ…˜(Session) λ™μ•ˆλ§Œ μœ μ§€λ˜λ©°, 각 μ„Έμ…˜λ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€.
즉, λ™μΌν•œ μ„Έμ…˜μ—μ„œ 반볡적으둜 λ™μΌν•œ 데이터λ₯Ό μ‘°νšŒν•  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ‹€μ‹œ μ ‘κ·Όν•˜μ§€ μ•Šκ³  μΊμ‹œλœ 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
1μ°¨ μΊμ‹œλŠ” μžλ™μœΌλ‘œ ν™œμ„±ν™”λ˜μ–΄ 있으며, κ°œλ°œμžκ°€ 직접 μ„€μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
1μ°¨ μΊμ‹œ 덕뢄에, 같은 μ„Έμ…˜ λ‚΄μ—μ„œ λ™μΌν•œ μ—”ν‹°ν‹°λ₯Ό μ—¬λŸ¬ 번 μ‘°νšŒν•΄λ„ λ°μ΄ν„°λ² μ΄μŠ€μ— λΆˆν•„μš”ν•œ 접근을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ 2μ°¨ μΊμ‹œ(Second-Level Cache)

μ„Έμ…˜ νŒ©ν† λ¦¬(SessionFactory) λ²”μœ„μ˜ μΊμ‹œλ‘œ, μ—¬λŸ¬ μ„Έμ…˜μ— 걸쳐 데이터λ₯Ό κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ„ νƒμ μœΌλ‘œ ν™œμ„±ν™”ν•΄μ•Ό ν•˜λ©°, 기본적으둜 ν™œμ„±ν™” λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
κ°œλ°œμžκ°€ 직접 섀정을 톡해 ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
2μ°¨ μΊμ‹œλŠ” μ—¬λŸ¬ μ„Έμ…˜ 간에 데이터λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬, 자주 μ‘°νšŒλ˜λŠ” 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€ 접근을 μ€„μž…λ‹ˆλ‹€.
즉, λ™μΌν•œ 데이터에 λŒ€ν•΄ μ„Έμ…˜μ„ μ’…λ£Œν•œ 후에도 2μ°¨ μΊμ‹œμ— μ €μž₯된 데이터λ₯Ό μ—¬λŸ¬ μ„Έμ…˜μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
2μ°¨ μΊμ‹œλŠ” λ‹€μ–‘ν•œ μΊμ‹œ 제곡자(예: EHCache, Infinispan)λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 있으며, Hibernateκ°€ μ œκ³΅ν•˜λŠ” 섀정을 톡해 μ œμ–΄λ©λ‹ˆλ‹€.

4️⃣ κ²°λ‘ .

  • HibernateλŠ” JDBC(Java Database Connectivity)λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜μ§€λ§Œ, JDBC(Java Database Connectivity)보닀 더 높은 좔상화(Abstraction) μˆ˜μ€€μ—μ„œ ORM(Object-Relational Mapping) κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, κ°œλ°œμžκ°€ 객체 μ§€ν–₯적으둜 데이터λ₯Ό μ²˜λ¦¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • JDBC(Java Database Connectivity)λŠ” SQL(Structured Query Language)을 직접 μž‘μ„±ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μ €μˆ˜μ€€ μž‘μ—…μ„ λ‹€λ£¨λŠ” 반면, HibernateλŠ” μ΄λŸ¬ν•œ μ„ΈλΆ€ 사항을 좔상화(Abstraction)ν•˜μ—¬ 더 μ‰½κ²Œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
    • HibernateλŠ” μ‹€μ§ˆμ μœΌλ‘œ JDBC(Java Database Connectivity)의 κΈ°λŠ₯을 기반으둜 λ™μž‘ν•˜μ§€λ§Œ, 더 높은 μˆ˜μ€€μ˜ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.