2024.03.11 - [Knowledge/개발지식] - [개발지식] 객체와 관계형 데이터베이스와의 차이 with JPA
[개발지식] 객체와 관계형 데이터베이스와의 차이 with JPA
2023.11.10 - [Knowledge/개발지식] - [스진초 5기/개발지식] DDD 설계와 SQL 중심 설계 [스진초 5기/개발지식] DDD 설계와 SQL 중심 설계 오늘의 주제는 DDD 설계이다. DDD 설계는 워낙 요즘 많이 사용하고 팀프
jh7722.tistory.com
이전 포스팅에서 관계형 데이터베이스를 객체지향적으로 모델링식 발생할 수 있는 문제를 알아봤다. 자바진영에서 그러한 문제를 해결할 수 있는 ORM인 JPA에 대해 본격적으로 공부하기 전에 JPA가 무엇인지 알아보자.
JPA 란 무엇일까?
1. JPA(Java Persistence API)
JPA는 자바에서 사용하는 ORM(Object-Relational Mapping) 기술 표준이다.
JPA는 자바 애플리케이션과 JDBC 사이에서 동작하며, 자바 인터페이스로 정의되어 있다.
ORM: Object-Relational Mapping(객체 관계 매핑)
- 객체와 관계형 데이터베이스의 데이터를 매핑하는 기술
- ORM 프레임워크가 객체와 데이터베이스 중간에서 매핑
- 객체와 테이블을 매핑하여 패러다임 불일치 문제를 해결
2. JPA 동작
JAVA 애플리케이션과 JDBC 사이에서 동작한다.
여기까지만 설명한다면, 기본에 사용한 JDBC 템플릿이나 마이바티스와 별 차이가 없다. 아래 이미지는 JPA에서 멤버 객체를 저장할 때 동작방식을 나타낸다.
MemberDAO에서 멤버 회원 객체를 저장해 달라고 JPA에 전달하면 JPA가 알아서 이 회원 객체를 분석하여 Insert 쿼리를 JDBC API 사용하여 DB에 전달해 준다. 이 과정에서 제일 중요한 패러다임의 불일치를 해결시켜 준다.
조회를 살펴보자.
MemberDAO 클래스를 통해 find(id)를 실행하면, JPA는 SELECT SQL을 생성한다.JDBC API를 사용하여 생성된 SELECT SQL을 보낸다.
DB에서 반환된 정보를 ResultSet 매핑을 통해 객체로 변환해 준다.
이 과정에서도 패러다임 불일치 문제를 해결해 준다.
패러다임 불일치를 해결?
패러다임의 불일치에 대한 내용을 위에 포스팅한 객체와 관계형 데이터베이스에 대한 포스팅을 참고 바란다.
JPA의 활용하면 패러다임의 불일치 문제를 해결할 수 있다고 한다. JPA는 앞서 이야기 했듯이 ORM 프레임워크이기 때문이다. 객체지향 언어에서 사용되는 ORM 프레임워크는 대부분의 객체와 데이터베이스 사이의 패러다임 불일치를 해결해 주며 객체적인 모델링이 가능하게 해 준다.
자바 진영에서는 주로 하이버네이트 프레임워크를 활용하며 하이버네이트는 대부분의 불일치를 해결주는 성숙한 ORM 프레임워크이다.
JPA 소개
자바는 엔터프라이즈 자바 빈즈(EJB) 라는 기술을 만들었는데 거기에 ORM 기술도 포함되어 있었다. 하지만 기술적 성숙도가 높지 않고 복잡하며 자바 엔터프라이즈에서만 동작되는 문제가 있었다.
이때 하이버네이트라는 오픈소스가 등장하였고, EJB의 ORM 보다 가볍고 실용적으며 기술적 성숙도가 높았다. 그리고 자바 애플리케이션 서버 없이도 동작가능했으므로 많은 개발자가 이용하였다.
EJB 3.0 부터는 하이버네이트가 ORM으로 정식적으로 사용되었고, 그것이 JPA이다.
JPA를 사용하는 이유
기존의 개발 방식은 SQL 중심적인 개발이었다.
JPA를 사용하면 객체 중심으로 애플리케이션 개발이 가능하다.
생산성
JPA 사용하면 자바 컬렉션에 객체를 저장하듯이 사용이 가능하다. Insert문을 작성하고 JDBC API에 연결하는 등 지루하고 반복적인 일을 JPA가 대신 처리하게 된다.
jpa.persist(member); // 저장
Member member = jpa.find(memberId); // 조회
member.setName("name2") // 수정
jpa.remove(member); // 삭제
지루하고 반복적인 CURD 코드 개발자 직접 작성하지 않아도 되며, 더 나아가 CREATE TABLE 같은 DDL 문도 자동으로 생성해 주는 기능도 있어 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 변경할 수 있다.
유지보수
SQL에 의존적인 개발은 SQL 문을 직접 다루는 방식으므로 엔티티 필드나 하나 추가해도 고려해야 되는 부분이 많아진다. 이러한 부분들은 시간적인 요소와 많은 버그들을 발생시켜 유지보수의 해야 되는 부분이 많아지게 된다.
하지만 JPA를 활용하면 객체지향적인 코드 설계가 가능해져 확인해야될 코드가 줄어들고 SQL 문을 직접 관리할 필요가 없어서 시간적인 요소도 많이 절약이 되어 유지보수가 용이해진다. (도메인 모델 중심의 개발이 가능해진다.)
패러다임 불일치 해결
JPA는 패러다임 불일치를 발생시키는 요소인 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 문제를 해결해준다. (이후 더 자세히 다룰 예정)
성능
JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화를 제공한다. 통상적으로 애플리케이션과 데이터베이스 사이에 계층이 하나 더 있으면 최적화 관점에서 다양한 것들을 시도해 볼 수 있다.
String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
다음 코드는 보면 같은 트랙젝션 안에서 같은 회원을 두 번 조회한다. JDBC API를 활용하여 직접 작성하였다면 회원을 조회할 때마다. SELECT SQL을 사용하여 DB와 두 번 통신하였을 것이다. JPA를 활용하면 처음 한 번만 SQL로 DB와 통신하고 두 번째는 조회한 객체를 재사용한다.
이것을 1차 캐시와 동일성 보장이라고 하며 그 외에도 트랜잭션을 지원하는 쓰기 지연, 지연로직(Lazy Loading) 등이 있다. 이 후 포스팅에서 더 자세히 다룰 예정이다.
데이터 접근 추상화와 밴더 독립성
관계형 데이터베이스는 같은 기능도 밴더마다 사용법이 다른 경우가 많다. 예를 들면 페이징 처리가 있다. 페이징 처리는 밴더마다 달라 직접 SQL를 구현한다면 각 밴더마다 차이점을 알고 있어야 한다.
결국 처음 선택한 데이터베이스에 종속되며 다른 데이터베이스로 변경하기는 매우 어렵고 시간 소요가 발생하게 된다.
JPA는 특정 데이터베이스 기술에 종속되지 않는다. 데이터베이스가 변경되면 JPA에게 다른 데이터베이스를 사용한다는 것만 알려주면 된다.
표준
JPA는 자바 진영의 ORM 표준 기술이다. 표준을 사용하면 다른 구현 기술로 손쉽게 변경이 가능하다.
추가적으로..
JPA를 처음 사용하면 객체에 대해서만 잘 알면 사용하는데 문제가 없다고 생각하는 경우가 있다. 하지만 ORM은 객체와 RDB 모두 기반 지식을 가지고 있어야지만 올바르게 사용할 수 있다. 나같은 경우도 SQL 중심적인 개발을 주로 하여 RDB에 대해선 어느 정도 알고 있지만 객체지향적인 개발에 대해선 아직도 많이 부족하다.
이번에 JPA를 다시 학습하면서 객체지향에 대한 부분도 채워가며 진행해야겠다.
참조
김영한님의 JPA 책과 강의(인프런)
'Framework > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 - 객체와 테이블 매핑 (0) | 2024.03.14 |
---|---|
[JPA] 준영속 상태 (0) | 2024.03.13 |
[JPA] 플러시(flush) (0) | 2024.03.13 |
[JPA] 영속성 컨텍스트의 특징 (0) | 2024.03.12 |
[JPA] 영속성 컨텍스트 (0) | 2024.03.12 |