본문 바로가기
Database

ORM과 JPA 그리고 Hibernate

by happy coding! 2018. 8. 28.
반응형


[Spring JPA] ORM과 JPA 그리고 Hibernate







※ JPA (Java Persistent API)


- JPA란 자바 ORM 기술에 대한 API 표준 명세


- JPA는 ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해서는 JPA를 구현한

  Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야함


- 여러 ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM 이던 Entity Bean을 JPA라고 변경



[JPA : Java Persistent API]





※ ORM (Object Relational Mapping)


- ORM 이란 객체와 DB의 테이블이 매핑을 이루는 것


- 즉 객체가 테이블이 되도록 매핑시켜주는 것


- ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있음


- 예를 들어, User 테이블의 데이터를 출력하기 위해서 mysql에서는 SELECT * FROM user; 라는 query를

  실행해야 하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때, user.findAll() 라는 

  메서드 호출로 데이터 조회가 가능함


- query를 직접 작성하지 않고 메서드 호출만으로 query가 수행되다보니 ORM을 사용하면 생산성이 

  매우 높아짐. 그러나 query가 복잡해지면 ORM 으로 표현하는데 한계가 있고 성능이 raw query에 

  비해 느리다는 단점이 있음


- 객체와 RDB 사이에 매핑을 정의한 메타데이터를 이용하여 자바 Application 내의 객체를 RDB의 테이블로 자동으로(그리고 투명하게) 영속화하는 것




※ Hibernate의 특징


1. 장점


1) 생산성

- Hibernate는 SQL을 직접 사용하지 않고 메서드 호출만으로 쿼리가 수행됨

- 즉 SQL 반복 작업을 하지 않으므로 생산성이 높아짐


2) 유지보수

- 테이블 컬럼이 하나 변경되었을 경우 Mybatis 에서는 관련 DAO의 파라미터, 결과, SQL 등을 모두 확인

  하여 수정해야하지만 JPA를 사용하면 JPA가 이런 일을 대신해주기 때문에 유지보수 측면에서 좋음


3) 특정 벤더에 종속적이지 않음

- 여러 DB 벤더마다 쿼리 사용이 조금씩 다르기 때문에 애플리케이션 개발 시 처음 선택한 DB를 나중에 

  바꾸는 것은 어려움


- JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않음

- 즉 설정 파일에서 JPA에 어떤 DB를 사용하고 있는지 알려주기만 하면 얼마든지 DB를 바꿀 수 있음



2. 단점 


1) 성능

- SQL 을 직접 작성하는 것보다 메서드 호출만으로 쿼리를 수행한다는 것은 성능이 떨어질 수 있음.

- 그러나 지금은 많이 발전하여 좋은 성능을 보여주고 있음


2) 세밀함


- 복잡한 통계 분석 쿼리를 메서드만으로 해결하는 것은 힘듬

- 이것을 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원함

- SQL 자체 쿼리를 작성할 수 있도록 지원도 하고 있음


3) 러닝커브




※ JPA의 구현체


- DataNucleus / EclipseLink / Hibernate / OpenJPA / ObjectDB / TopLink Essential




※ Entity (엔티티)


- ORM 서비스를 구성하는 가장 기초적인 클래스

- Application 에서 다루고자 하는 Table에 대응하여 구성할 수 있음

- Table 이 포함하는 Column 에 대응한 속성들을 가지고 있음

- 주요 Annotations

- @Entity : 해당 클래스가 Entity 클래스임을 표시하는 것으로 클래스 선언문 위에 기재

               테이블명과 Entity 명이 다를 때에는 name에 해당 테이블명을 기재함

- @Id : 해당 Attribute가 Key임을 표시하는 것으로 Attribute 위에 기재

- @Column : 해당 Attribute와 매핑되는 컬럼정보를 입력하기 위한 것으로 Attribute 위에 기재

                  컬럼명과 Attribute 명이 일치할 경우에는 기재하지 않아도됨



※ EntityManager


- Entity 의 Lifecycle과 persistence context, transaction을 관리

- insert(persist)

- update(merge)

- delete(remove)

- select(find)



※ EntityManagerFactory


- EntityManager를 생성하기 위한 클래스

- persistence.xml 설정에 기반



※ Spring Data JPA


- Spring의 Life Cycle + ORM



[출처] 

http://victorydntmd.tistory.com/195

https://www.slipp.net/wiki/pages/viewpage.action?pageId=24641684

반응형

댓글