[24] Spring Data : ORM, JPA, Spring-Data-JPA 개요
[Object Relational Mapping]
Object Relational Mapping (ORM)은 객체와 DB table을 mapping 할 때 발생하는 다음 표와 같은 개념적 불일치를 해결하기 위한 solution을 제공하는 framework입니다.
구분 | Class | RDB |
Data Type | Object, primitive type, reference type... | Integer, Char... |
상속(Inheritance) 개념 | 있음 | 없음 |
Identity | hash code, equals method() | primary key |
[Java Persistence API]
Java Persistence 1API는 ORM 구현체(Hibernate, Eclipse Link ...)를 사용할 수 있도록 제공되는 Java 표준 명세서(interface)입니다. JPA에서 ORM 구현체에 대한 모든 설정을 할 수 있는 것은 아닙니다. 하지만 ORM 관련 설정을 해야 할 필요할 때 제공하는 메커니즘이 존재하므로 크게 문제될 것은 없습니다.
[Spring Data JPA]
JPA를 매우 쉽게 사용할 수 있도록 Spring Data로 추상화시켜놓은 module입니다.
Spring Data JPA 는 Spring Data JPA -> Hibernate -> JPA 순서로 구현되어 있고, Datasource()를 사용 하므로 JPA에 정의된 기능과 거의 대부분의 DataSource 기능을 사용할 수 있습니다.
Spring Data 사용 시 장점
- 구현체인 Hibernate를 직접 사용하지 않고 Spring Data JPA로 한번 추상화하여 사용기 때문에 구현체의 변경이 필요할 경우 쉽게 교체할 수 있습니다.
- Spring Data의 하위 project들은 동일한 interface를 상속받기 때문에 구현되는 method(save(), findAll(), findOne()...)도 동일합니다. 따라서 트래픽 증가 등으로 RDB에서 mongoDB로 전환해야 한다면 spring-data-jpa에서 spring-data-MongoDB로 의존성만 변경하면 쉽게 전환할 수 있게 됩니다.
Spring Data JPA를 사용하기 위해서는 다음의 의존성을 추가해줘야 합니다. pom.xml을 열어 dependencies tag 안에 추가해줍니다.
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
...
</dependencies>
spring-boot-stater-data-jpa 의존성 구조를 살펴보면 다음과 같습니다. Spring Data JPA 제공되는 기능이 all in one이 되는 것을 확인할 수 있습니다.
spring-boot-stater-data-jpa
- spring-boot-starter-jdbc : JDBC Template, DataSource bean 등록
- Hibernate-core : jpa 구현체
- spring-data-jpa : spring-orm을 통해 jpa를 사용합니다.
JPA를 사용하면
- CRUD query를 직접 작성할 필요가 없습니다.
- 더이상 RDB를 신경쓰지 않아도 되므로 Project를 객체지향적으로 설계 및 관리할 수 있습니다. 이는 유지보수의 편의성으로 이어집니다.
- 성능관련 이슈에 대한 해결책이 이미 준비되어있어 native query만큼의 성능을 낼 수 있습니다.
- Persistence(영속성)
영속성은 data를 생성 또는 관리하는 application이 종료되더라도 data의 상태가 유지되는 특성을 의미합니다. 영속성은 file system, relational database 등을 활용하여 구현합니다. 영속성을 갖지 않는 data는 휘발성 memory상에서만 존재하기 때문에 application을 종료하면 그 상태를 모두 잃어버리게 됩니다. 영속성은 data의 상태를 유지하여 application의 종료와 재개를 자유롭게 해줍니다.