[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐Ÿ™†โ€โ™‚๏ธแ„‹แ…ฉแ†ฏแ„…แ…ฆแ„‹แ…ด JPAแ„‹แ…ช JDBC (Hibernate ๊ฐ™์ด ์ •๋ฆฌ)

์Šฌยท2025๋…„ 2์›” 26์ผ

ํ•„์ˆ˜์˜์ƒ

๋ชฉ๋ก ๋ณด๊ธฐ
37/40
post-thumbnail

[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐Ÿ™†โ€โ™‚๏ธแ„‹แ…ฉแ†ฏแ„…แ…ฆแ„‹แ…ด JPAแ„‹แ…ช JDBC


JDBC (Java Database Connectivity)

JDBC๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JDBC ์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ•™์ƒ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜๋Š” JDBC ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/school";
        String user = "root";
        String password = "password";
        
        try {
            Connection connection = DriverManager.getConnection(url, user, password);
            String sql = "SELECT * FROM students";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            
            while (resultSet.next()) {
                System.out.println("ํ•™์ƒ ์ด๋ฆ„: " + resultSet.getString("name"));
            }
            
            resultSet.close();
            preparedStatement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JDBC ํŠน์ง•

  • SQL ๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•จ โ†’ SQL์„ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ๋Ÿ‰์ด ๋งŽ์•„์ง.
  • Connection ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ โ†’ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์—ด๊ณ  ๋‹ซ์•„์•ผ ํ•จ.
  • PreparedStatement, ResultSet ๊ฐ์ฒด ์‚ฌ์šฉ โ†’ ์ฟผ๋ฆฌ ์‹คํ–‰๊ณผ ๊ฒฐ๊ณผ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด.

connection ๊ฐ์ฒด๊ฐ€ db์™€ app์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ ,
preparedstatement๊ฐ€ sql์„ ์ „๋‹ฌํ•˜๋ฉฐ,
resultset ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.

JPA (Java Persistence API)

JPA๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ๊ฐ์ฒด(Entity)์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

JPA ์˜ˆ์‹œ

JPA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•™์ƒ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

import jakarta.persistence.*;
import java.util.List;

@Entity
@Table(name = "students")
class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // Getter, Setter ์ƒ๋žต
}

public class JpaExample {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("schoolPU");
        EntityManager em = emf.createEntityManager();
        
        em.getTransaction().begin();
        List<Student> students = em.createQuery("SELECT s FROM Student s", Student.class).getResultList();
        
        for (Student student : students) {
            System.out.println("ํ•™์ƒ ์ด๋ฆ„: " + student.getName());
        }
        
        em.getTransaction().commit();
        em.close();
        emf.close();
    }
}

์žฅ์ 

  • SQL ๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ผ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. โ†’ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ถ€๋‹ด ๊ฐ์†Œ.
  • ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. โ†’ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ.
  • ์ž๋™์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌ๋ฅผ ํ•ด์คŒ! โ†’ ์—ฐ๊ฒฐ์„ ์—ด๊ณ  ๋‹ซ๋Š” ๋“ฑ์˜ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ด์ง.

์˜์ƒ์—์„œ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์— ๋Œ€ํ•ด์„œ๋„ ์–˜๊ธฐ๊ฐ€ ์žˆ์–ด์„œ ๊ฐ™์ด ์ •๋ฆฌํ•˜๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์•„ ์ถ”๊ฐ€ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Hibernate (ํ•˜์ด๋ฒ„๋„ค์ดํŠธ)

Hibernate๋Š” JPA์˜ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด๋กœ ORM(Object-Relational Mapping)์„ ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

Hibernate ๊ฐœ๋…

  • Hibernate๋Š” JPA์˜ ๊ตฌํ˜„์ฒด๋กœ SQL์„ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ์ฒด-ํ…Œ์ด๋ธ” ๋งคํ•‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹ฑ, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading), Fetch ์ „๋žต ๋“ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.
  • JDBC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , EntityManager๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Hibernate ํŠน์ง•

  • JPA์˜ ํ‘œ์ค€์„ ๊ตฌํ˜„ํ•œ ORM ํ”„๋ ˆ์ž„์›Œํฌ.
  • SQL ๋Œ€์‹  ๊ฐ์ฒด(Entity)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ.
  • Lazy Loading, 1์ฐจ ์บ์‹œ, 2์ฐจ ์บ์‹œ ๋“ฑ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋Šฅ ์ œ๊ณต.
  • JDBC์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ์ด ์•„๋‹ˆ๋ผ EntityManager ๋˜๋Š” Session์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•ฉ๋‹ˆ๋‹ค.

์ „์— ๊ฐ•์‚ฌ๋‹˜์˜ ์ˆ˜์—…์—์„œ JPA๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ฟผ๋ฆฌ๋ฌธ์„ ์ œ๋Œ€๋กœ ์•Œ์•„์•ผ ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€ํ•˜์…จ์Šต๋‹ˆ๋‹ค. JPA์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ด์šฉํ•ด์„œ ์ž๋™์œผ๋กœ SQL ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฟผ๋ฆฌ๋„ ์ œ๋Œ€๋กœ ๋ชจ๋ฅด๋ฉด ๋‹น์—ฐํžˆ ๋„ค์ด๋ฐ ๊ทœ์น™๋„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ฒ ์ฃ ? ใ…œ
ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” JPA์˜ ๊ฐ•๋ ฅํ•œ ORM ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‚ฌ์šฉํ•ด๋ณด๋ผ๊ณ  ๊ถŒํ–ˆ์ง€๋งŒ ์•„์ง์€ ์•„๋‹Œ๊ฑธ๋กœ.. ์˜์ƒ์—์„œ ๊ตฌ๊ธ€์— Why jpa hibernate is awful? ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๋ญ.. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ์ผ๋Š”๋ฐ ์ง€์˜ฅ์— ๋‹ค๋…€์™”๋‹ค, ๋ผ๋Š” ๋ง๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์œ ๋Š” ์ฃผ๋กœ ์ดˆ๋ฐ˜ ํ•™์Šต ๋‚œ์ด๋„๋‚˜ ๋ณต์žกํ•œ ์ตœ์ ํ™”, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ ๋•Œ๋ฌธ์ธ๋“ฏ ์‹ถ์Šต๋‹ˆ๋‹ค.
์šฐ์„  SQL๋ฌธ์„ ์ž˜ ์งค ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด๊ธฐ..!

0๊ฐœ์˜ ๋Œ“๊ธ€