ORM(Object Relatioal Mapping)
ORM은 객체 관계 매핑을 의미한다.
Java와 같은 객체지향 언어에서의 객체와 RDB의 테이블을 자동으로 매핑하는 방법이다.
클래스는 데이터베이스의 테이블과 매핑하기 위해 만들어진 것이 아니기 때문에 RDB의 테이블과 불일치가 존재할 수밖에 없다. ORM이 이러한 불일치를 해결하는 역할을 해준다.
ORM은 SQL 작성이 아닌 Java 코드(메서드)로 데이터를 조작할 수 있도록 도와준다.
ORM의 장점
DB 쿼리를 객체지향적으로 조작할 수 있다.
- SQL을 작성하는 양이 현저히 줄어 개발 비용이 줄어든다.
- 객체지향적으로 DB에 접근할 수 있어 코드의 가독성이 좋아진다.
재사용 및 유지보수성 증대
- ORM의 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이하다.
- 객체들은 각 클래스로 나뉘어 있어 유지보수가 용이하다.
DB 종속성이 줄어든다.
- ORM을 통해 자동으로 생성된 SQL은 객체를 기반으로 DB 테이블을 관리하기 때문에 DB에 종속적이지 않다.
- 위와 같은 이유 때문에 DB를 교체하더라도 리스크가 줄어든다.
ORM의 단점
ORM '만' 사용하기는 힘들다.
- 복잡한 쿼리의 경우 ORM만을 사용하여 코드로 구현하기 어렵다.
- 복잡한 쿼리를 ORM만으로 구성하게 되면 성능 문제가 발생할 수 있다.
객체 관점의 불일치
애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.
- 세분성(Granularity) : ORM의 자동 설계 방법에 따라 엔티티(entity) 수와 테이블 수가 달라질 수 있다.
- 상속성(Inheritance) : RDBMS에는 상속 개념이 없다.
- 식별성(Identity) : RDBMS에서는 PK로 동일성을 정의하지만, Java에서는 두 객체의 값이 같아도 다를 수 있다.
- 연관성(Associations) : Java는 객체를 참조함으로써 연관성을 나타내지만, RDBMS에서는 FK으로 연관성을 표현한다. Java에서 참조는 방향성이 존재하지만, RDBMS에서 FK를 삽입하는 것은 양방향의 관계를 가진다.
- 탐색(Navigation) : Java와 RDBMS는 데이터에 접근하는 방식이 다르다. Java는 객체 참조와 같은 연결 수단을 사용하지만, RDBMS는 쿼리를 최소화하고 JOIN을 통해 여러 테이블을 로드하고 값을 추출한다.
JPA(Java Persistece API)
JPA는 Java 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다.
ORM이 큰 개념이라면 JPA는 더 구체화된 스펙을 포함한다.
즉, 자바에서는 JPA가 ORM의 역할을 하는 것이다.
JDBC 코드를 직접 짜보면 실제 필요한 로직 이외에 수많은 코드가 반복되고, 이로 인해 복잡해지고 가독성이 떨어지게 된다. 또한 SQL에 의존하는 문제들이 발생한다.
JPA는 내부적으로 JDBC를 사용하지만, 위와 같은 문제점들을 보완해서 개발자 대신 자동으로 SQL을 생성하고 데이터베이스를 조작해서 객체를 매핑하는 역할을 수행한다.
JPA의 구현체는 대표적으로 하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(DataNucleus)로 3가지가 있다. 그중 하이버네이트가 가장 많이 사용된다.
즉, 하이버네이트는 Java 진영의 ORM인 JPA의 가장 대표적인 구현체이다.
Hibernate와 Spring Data JPA
하이버네이트는 JPA 구현체 중의 하나이다.
이 하이버네이트의 기능을 개발자가 더욱 편하게 사용하도록 모듈화 한 것이 Spring Data JPA이다.
Spring에서 제공하는 Spring Data JPA는 하이버네이트의 EntityManager를 직접 다루지 않고 리포지토리(JpaRepository <>)를 정의해 사용함으로써 스프링이 SQL을 동적으로 생성하는 방식으로 DB를 조작할 수 있게 한다.
정리
ORM
ORM은 Java와 같은 객체지향 언어에서의 객체와 RDB의 테이블을 자동으로 매핑하는 기술이다.
ORM == JPA가 아니다.
자바 진영의 ORM은 JPA이고, Node.js의 ORM은 Sequalize 등 각 언어마다 ORM이 존재한다.
즉, ORM은 객체 관계 매핑 기술자체를 뜻한다.
JPA
JPA는 Java 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다.
JPA == Spring Data JPA 가 아니다.JPA는 인터페이스의 모음이고, 이 인터페이스를 구현한 것들이 따로 있다. 우리는 'JPA'를 그대로 사용하는 것이 아니다.
Hibernate
Hibernate는 JPA의 여러 구현체들 중 가장 많이 쓰이는 대표적인 구현체이다.
즉, Hibernate는 자바 진영의 ORM인 JPA의 대표적인 구현체 중 하나이다.
Spring Data JPA
Spring Data JPA는 JPA를 개발자가 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나이다.
개발자는 Spring으로부터 Spring Data JPA라는 인터페이스를 제공받아서 편리하게 사용할 수 있다.
ORM != JPA
JPA != Spring Data JPA
꼭 기억하자!
이 글은 '스프링 부트 핵심 가이드' 책을 참고하여 썼습니다.
'Database > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 - @ManyToOne, @OneToMany (0) | 2023.10.06 |
---|---|
[JPA] @Entity - 필드와 컬럼 매핑의 여러가지 속성 (1) | 2023.10.04 |
[JPA] @Entity - 기본 키 매핑 (1) | 2023.10.04 |
[JPA] 엔티티 매핑 (0) | 2023.10.04 |
[JPA] 영속성 컨텍스트의 주요 개념 / Spring Data JPA에서의 영속성 (1) | 2023.10.02 |