💡 ORM이란?
ORM(Object-Relational-Mapping), 객체-관계 매핑
: 객체와 관계형 데이터베이스를 자동으로 매핑(연결)해주는 것을 의미한다.
- 객체 지향 프로그래밍의 클래스와 관계형 데이터베이스의 테이블을 자동으로 매핑한다.
- 객체 모델과 관계형 모델 사이에는 패러다임 불일치가 존재하는데, ORM을 통해 객체간 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
- 패러다임 불일치 - 객체 지향에는 상속, 추상화, 다형성 등의 고유한 특성이 존재하지만, 데이터베이스는 이러한 특성이 존재하지 않는다. 각각의 기능과 표현 방법이 다르다는 것을 의미한다.
- ORM은 대부분의 프로그래밍 언어에 존재한다.
✔️ ORM의 장점과 단점
장점
- 객체 지향적인 코드
- ORM을 사용하여 SQL 문이 아닌, 직관적인 코드(메소드)로 데이터를 조작할 수 있어서 개발자가 객체 모델로 프로그래밍 하는 데에 집중할 수 있도록 도와준다.
- 각각의 객체에 대한 코드를 별도로 작성하기 때문의 가독성이 높아진다.
- SQL의 절차적/순차적 접근이 아닌, 객체 지향적인 접근 방식으로 인해 생산성이 높아진다.
- 재사용성 / 유지보수의 편리성 증가
- ORM은 독립적으로 작성되어 있고, 해당 객체들을 재활용 할 수 있다.
- 매핑 정보가 명확해서 ERD에 대한 의존도를 낮출 수 있다.
- DBMS에 대한 종속성이 줄어든다.
- 객체 간의 관계를 바탕으로 SQL 문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있어서 RDBMS의 데이터 구조와 객체 지향 모델 사이의 간격을 좁힐 수 있다.
- 객체에만 집중할 수 있어서 DBMS를 변경할 때에도 리스크가 적고 소요 시간에 줄어든다.
- Java에서 가공할 경우, equals , hashCode 의 오버라이드 기능을 이용할 수 있다.
단점
- ORM만으로는 완벽한 서비스를 구현하기 어렵다.
- ORM은 사용하기 편리하지만, 설계는 매우 신중하게 해야 한다.
- 프로젝트의 복잡성이 커질수록 난이도가 올라가고, 부족한 설계로 잘못 구현될 경우 속도 저하 및 일관성이 무너질 수 있다.
- 프로시저가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기 어렵다.
- 이미 프로시저가 많은 시스템에서는 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.
- 프로시저 - 데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장하는 것
💡 JPA란?
JPA(Java Persistence API)
: Java 진영의 ORM 기술 표준으로, 인터페이스의 모음이다.
- JPA는 구현체가 아닌 인터페이스의 모음이기 때문에 실제로 동작하는 것이 아니다. (특정 기능을 하는 라이브러리 X)
- JPA를 사용하기 위해서는 ORM 구현체(구현 라이브러리)가 필요한데, 가장 대표적인 것이 Hibernate(하이버네이트)이다.
- Hibernate(하이버네이트) 이외에도 JPA 구현체는 여러 개가 존재한다.
✔️ JPA 동작 과정
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
- 개발자가 직접 JDBC API를 사용하는 것이 아닌, 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 통해 SQL을 호출하여 DB와 통신한다.
- JPA -> JDBC -> SQL -> DB
INSERT 과정
예를 들어, MemberDAO에 객체를 저장하고 싶은 상황임을 가정하자.
- 개발자는 JPA에게 Member 객체를 넘긴다.
- JPA 동작
- Member Entity를 분석한다.
- INSERT SQL문을 생성한다.
- JDBC API를 사용해서 SQL을 DB에 날린다.
FIND 과정
예를 들어, 특정 Member를 조회하려는 상황임을 가정하자.
- 개발자는 Member의 PK 값을 JPA에게 넘긴다.
- JPA 동작
- Entity의 매핑 정보를 바탕으로 SELECT SQL문을 생성한다.
- JDBC API를 사용해서 SQL을 DB에 날린다.
- DB로부터 결과를 받아온다.
- 결과(ResultSet)를 객체에 모두 매핑한다. (쿼리를 JPA가 만들어주기 때문에 객체와 RDB 간의 패러다임 불일치가 해결된다.)
✔️ JPA 특징
- 객체 지향 개발이 가능하다.
- Java 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.
- 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원한다.
- 성능 향상을 위해 지연 로딩/즉시 로딩과 같은 몇 가지 기법이 제공되어, 이를 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.
✔️ JPA 필요성
- SQL 중심적인 개발에서 객체 중심적인 개발이 가능하다.
- 생산성이 증가된다.
- 간단한 CRUD가 가능하다.
- 수정이 간단하다.
- 유지보수가 쉽다.
- 기존 : 필드 변경 시, 모든 SQL을 수정해야 한다.
- JPA : SQL 수정을 JPA가 처리하기 때문에 필드만 변경하면 된다.
- 객체와 RDB 간의 패러다임 불일치가 해결된다.
✔️ JPA vs Hibernate vs Spring Data JPA
Hibernate(하이버네이트)
Hibernate는 JPA 구현체의 한 종류이다.
Hibernate는 SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해서 데이터를 조작할 수 있다.
Hibernate가 지원하는 메소드 내부에서 JDBC API가 동작하고 있다.
Spring Data JPA
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, JPA 기반 애플리케이션을 보다 편리하게 개발할 수 있도록 도와준다.
Spring Data JPA는 JPA를 추상화시킨 Repository 인터페이스를 제공한다.
즉, Spring Data JPA의 Repository에서 JPA를 사용한다.
Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면 Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
즉, JPA는 인터페이스의 모음이고, Hibernate는 JPA의 구현체이고,Spring Data JPA는 JPA 기반 애플리케이션을 편리하게 개발할 수 있도록 도와주는 인터페이스로 Hibernate 같은 JPA 구현체가 필요하다.
✔️ JPA 영속성 컨텍스트
영속성이란, 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성이다.
영속성을 갖지 않은 데이터는 메모리에서만 존재하고, 프로그램이 종료되면 사라진다. 그래서 우리는 데이터를 파일이나 DB에 영구적으로 저장함으로써 데이터에게 영속성을 부여한다.
JPA 영속성 컨텍스트(JPA Persistence Context)는 Entity를 영구 저장하는 환경으로, EntityManager에 Entity를 보관하고 관리한다.
- 영속성 컨텍스트는 논리적인 개념이다.
- EntityManager를 생성할 때 하나가 만들어지고, EntityManager를 통해서 영속성 컨텍스트에 접근하고 관리한다.
* 영속성은 아주아주 중요한 개념으로 따로 포스팅 할 예정이다...!! 본 포스팅에서는 JPA 영속성 컨텍스트라는 개념이 있다는 것만 알고 넘어가면 될 것 같다!!
출처
긴 글 읽어주셔서 감사합니다 🍀
잘못 작성된 내용은 피드백 주시면 반영하겠습니다 😎
'JPA' 카테고리의 다른 글
[JPA] Hibernate Dialect(방언) (0) | 2024.01.02 |
---|---|
[JPA] Hibernate 1차 캐시와 2차 캐시 (0) | 2023.12.27 |
[JPA] JPA 영속성 컨텍스트 (0) | 2023.12.21 |