Light Red Pointer [Spring] 05.์Šคํ”„๋ง ORM๊ณผ JPA - Hibernate
 

[Spring] 05.์Šคํ”„๋ง ORM๊ณผ JPA - Hibernate


 

 
 

๋ชฉ์ฐจ

1. JPA

2. ORM

3. Hibernate

4. ์ •๋ฆฌ

 

 

 

์„œ๋ก 

๊ฐœ๋ฐœ์„ ํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋น ์งˆ๋ž˜์•ผ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

ํŠนํžˆ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๊ฐ„๊ทน์„ ์–ด๋–ป๊ฒŒ ์ขํž ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด ๋ฐ”๋กœ ORM์ด๋‹ค. ๋˜ํ•œ Java์—์„œ๋Š” JPA์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์  ํ”„๋ ˆ์ž„์›Œํฌ์ธ Hibernate ๊ฐ€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ORM๊ณผ JPA ๊ทธ๋ฆฌ๊ณ  Hibernate์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ•ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

JPA(Java Persistent API)

- Java ORM ๊ธฐ์ˆ ์— ๋Œ€ํ•œ API ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ์˜๋ฏธ

- ORM์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ์•„๋‘” ๊ฒƒ →  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ORM์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ Java์˜ ๊ณต์‹ ๋ฌธ๋ฒ• ๋ฐ ๊ณต์‹

- JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JPA๋ฅผ ๊ตฌํ˜„ํ•œ Hibernate, EclipseLink, DataNucleus ์™€ ๊ฐ™์€ ORM ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

> JPA์˜ ์—ญํ• 

- ORM์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ” API

- ๊ฐœ๋ฐœ์ž๋Š” JPA ๋ฌธ๋ฒ•์œผ๋กœ๋งŒ ์ฝ”๋”ฉํ•˜๊ณ , ์‹ค์ œ ๋™์ž‘์€ ๊ตฌํ˜„์ฒด(Hibernate ๋“ฑ)๊ฐ€ ์ฒ˜๋ฆฌํ•จ

 

> ์ฃผ์š”๊ธฐ๋Šฅ

- Entity(์—”ํ‹ฐํ‹ฐ) ๋งคํ•‘

- JPQL(Java Persistence Query Language) ์ง€์›

- ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ

 

 

ORM(Object Relational Mapping)

- ๊ฐ์ฒด์™€ DB์˜ ํ…Œ์ด๋ธ”์ด ๋งคํ•‘์„ ์ด๋ฃจ๋Š” ๊ฒƒ → ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ํ…Œ์ด๋ธ”์ด ๋˜๋„๋ก ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ

- ORM์„ ์ด์šฉํ•˜๋ฉด SQL ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ง๊ด€์ ์ธ ์ฝ”๋“œ(๋ฉ”์†Œ๋“œ)๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ

- ์˜ˆ๋ฅผ ๋“ค์–ด, USER ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •

SELECT * FROM USER_TABLE; //์ฟผ๋ฆฌ๋ฌธ์„ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰

- ORM์„ ์‚ฌ์šฉํ•˜๋ฉด USER ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋œ ๊ฐ์ฒด๋ฅผ user๋ผ๊ณ  ํ•  ๋•Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•จ

user.findAll(); //๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ํŽธ๋ฆฌํ•จ

→ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋‹ค ๋ณด๋‹ˆ ์ƒ์‚ฐ์„ฑ์ด ๋†’์•„์ง

→ ๋‹จ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” ORM์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ๊ณ  ์„ฑ๋Šฅ์ด ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ

 

>  ์ •๋ฆฌํ•˜์ž๋ฉด

- ๊ฐ์ฒด <-> ํ…Œ์ด๋ธ”

- ํ•„๋“œ <-> ์ปฌ๋Ÿผ

- ๊ฐ์ฒด๋ฅผ SQL ์ฟผ๋ฆฌ๋ฌธ ์—†์ด DB์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ → ๊ฐœ๋ฐœ์ž๋Š” ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ๋ณด๋‹จ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์ง‘์ค‘

 

>  ์žฅ์ 

- ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€ : ๋ฐ˜๋ณต์ ์ธ SQL ์ฟผ๋ฆฌ ์ž‘์„ฑ์„ ์ค„์—ฌ์คŒ

- ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด : ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์œ ์ง€ ๊ฐ€๋Šฅ

- DB ์ข…์†์„ฑ ๋‚ฎ์Œ :  ๋‹ค์–‘ํ•œ DB์— ๋Œ€์‘ ๊ฐ€๋Šฅ

 

 

Hibernate

- JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์  ORM ํ”„๋ ˆ์ž„์›Œํฌ (JPA ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹ค์ œ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์—”์ง„)

- JPA ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด์„œ๋„ ์ž์ฒด์ ์ธ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•จ

- ๋‹ค์–‘ํ•œ DB ์ง€์›

- ์บ์‹œ, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading), ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading) ๋“ฑ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

 

> ์žฅ์ 

- ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•จ

- ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ JPA๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ, ๊ฒฐ๊ณผ, SQL ๋“ฑ์„ ๋ชจ๋‘ ํ™•์ธํ•˜์—ฌ ์ˆ˜์ •ํ•ด์ฃผ๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ์šฉ์ดํ•จ

 

> ๋‹จ์ 

-  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์„ธ๋ฐ€ํ•จ์ด ๋–จ์–ด์ง

- ๊ฐ์ฒด๊ฐ„์˜ ๋งคํ•‘์ด ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ JPA๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

 

> ์˜ˆ์‹œ ์ฝ”๋“œ

//User Entity(์—”ํ‹ฐํ‹ฐ) ํด๋ž˜์Šค
@Entity
@Table(name = "user")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // Getter & Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

↑ ์šฐ์„  User ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•จ

 

public class HibernateExample {

    public static void main(String[] args) {
        // SessionFactory ์ƒ์„ฑ
        SessionFactory factory = new Configuration()
                .configure("hibernate.cfg.xml") // ์„ค์ • ํŒŒ์ผ ๋กœ๋“œ
                .addAnnotatedClass(User.class)  // ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋“ฑ๋ก
                .buildSessionFactory();

        // ์„ธ์…˜ ์—ด๊ธฐ
        Session session = factory.getCurrentSession();

        try {
            // ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
            session.beginTransaction();

            // ์‚ฌ์šฉ์ž ์ €์žฅ
            User newUser = new User("ํ™๊ธธ๋™", "test@gmail.com");
            session.save(newUser);

            // ๋ชจ๋“  ์‚ฌ์šฉ์ž ์กฐํšŒ
            List<User> userList = session.createQuery("from User", User.class).getResultList();
            for (User u : userList) {
                System.out.println("์กฐํšŒ : " + u.getName() + " , " + u.getEmail());
            }

            // ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

↑ SessionFactory๋ฅผ ์ƒ์„ฑํ•˜๊ณ   ์„ค์ • ํŒŒ์ผ ๋ฐ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•œ ๋‹ค์Œ ์„ธ์…˜์„ ์—ด์–ด ์กฐํšŒ ์‹œ์ž‘

 

 

 

์ •๋ฆฌ

  ORM JPA Hibernate
๊ฐœ๋… ๊ฐ์ฒด-DB ์ž๋™ ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ Java์—์„œ ORM์„ ์œ„ํ•œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค JPA๋ฅผ ๊ตฌํ˜„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ(๊ตฌํ˜„์ฒด)
์˜ˆ์‹œ JPA, Hibernate, MyBatis EntityManager ์‚ฌ์šฉ HibernateJpaVendorAdapter ์‚ฌ์šฉ

 


 

Reference

https://victorydntmd.tistory.com/195

 

[Spring JPA] ORM๊ณผ JPA ๊ทธ๋ฆฌ๊ณ  Hibernate

2020.03.06 ์ˆ˜์ • 1. JPA ( Java Persistent API )์™€ ORM ( Object Relational Mapping )JPAJPA๋ž€ ์ž๋ฐ” ORM ๊ธฐ์ˆ ์— ๋Œ€ํ•œ API ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.JPA๋Š” ORM์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ์•„๋‘” ๊ฒƒ์ด๋ฉฐ, JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

victorydntmd.tistory.com