반응형
자바 스프링 기반 백엔드 개발자라면 꼭 알아야 할 JPA의 기초에 대해서 요약 정리한 글입니다.
JPA란 무엇인가?
- JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준
ORM 이란?
- ORM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻
- ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해줌
- 자바 진영의 대표적인 ORM 프레임워크는 하이버네이트 프레임워크가 있다.
JPA 의 대표적인 장점!
- 지루하고 반복적인 CRUD SQL을 알아서 처리해준다.
- 객체 모델링과 관계형 데이터베이스 사이의 차이점도 해결해준다.
- JPA를 사용하는 개발자는 SQL을 직접 작성하는 것이 아니라 어떤 SQL이 실행될 지 생각만 하면 된다.
- JPA가 실행하는 SQL은 쉽게 예측할 수 있다.
- 애플리케이션을 SQL이 아닌 객체 중심으로 개발하니 생산성과 유지보수가 좋아진다.
- 코드를 거의 수정하지 않고 데이터베이스를 손쉽게 변경할 수 있다.
- 자바 진영에서 만든 ORM 기술 표준이기 때문에 적극적인 지원을 받는다.
이젠 JPA 를 사용하지 않으면 발생하는 문제점과 JPA 만의 해결 방법을 알아보자
첫 번째, SQL을 직접 다룰 때 발생하는 문제점
- 테이블마다 간단한 CRUD만 만들어도 테이블이 100개라면 비슷한 일을 100번은 반복해야 한다.
- 객체에 필드가 하나 추가된다면 만들어둔 CRUD를 모두 수정해줘야 한다.
- SQL에 모든 것을 의존하는 상황에서는 개발자들이 엔티티를 신뢰하고 사용할 수 없다.
정리
- 진정한 의미의 계층 분할이 어렵다.
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기 어렵다.
JPA의 문제해결
- 개발자가 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다.
- 저장, 조회, 수정, 연관된 객체 조회 등 SQL을 개발자 대신 작성해서 실행시켜 주는 것 이상의 기능들을 제공한다.
두 번째, 패러다임의 불일치
패러다임의 불일치란?
관계형 데이터베이스는 객체지향에서 이야기하는 추상화, 상속, 다형성 같은 개념이 없다. 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다. 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라 한다.
1. 상속 패러다임 불일치
- 객체는 상속이라는 기능을 가지고 있지반 테이블은 상속이라는 기능이 없다.
- 데이터베이스 모델링에서 이야기하는 슈퍼타입 서브타입 관계를 사용하면 (DTYPE) 객체 상속과 가장 유사한 형태로 테이블을 설계할 수 있다.
- 이러한 테이블 설계는 하나의 객체를 저장하려면 객체를 분해해서 두개의 SQL을 만들어야 한다. 조회도 마찬가지다.
JPA의 문제해결
- JPA는 상속과 관련된 패러다임의 불일치 문제를 개발자 대신 해결해준다.
- 개발자는 자바 컬렉션에 객체를 저장하듯이 (list.add(객체)) JPA에 객체를 저장하면 된다.
- 상속관계의 객체의 INSERT 문과 SELECT JOIN 문을 적절하게 생성해준다.
2. 연관관계 패러다임 불일치
- 객체는 참조를 사용하고, 테이블은 외래 키를 사용한 연관관계 조인을 사용해서 연관된 테이블을 조회한다.
- 객체는 참조가 있는 방향으로만 조회할 수 있지만 테이블은 외래 키 하나로 반대 조회도 가능하다.
- 결국 개발자가 중간에서 변환 역할을 해야함
- 저장 할 때는 참조 필드 객체의 외래 키 값 변환
- 조회 할 때는 외래 키 값을 참조 객체로 변환
JPA의 문제해결
- JPA를 사용하면 연관관계의 변환 작업을 처리해준다.
3. 객체 비교 패러다임 불일치
- 객체는 동일성 비교 (==) 와 동등성 비교 (equals) 를 사용하고 데이터베이스는 기본 키의 값으로 각 row 를 구분한다.
- 같은 id로 데이터베이스를 여러번 조회해도 객체 측면에선 다른 인스턴스를 반환한다.
- 데이터베이스의 같은 로우를 조회할 때마다 같은 인스턴스를 반환하도록 구현하는 것은 쉽지 않다.
JPA의 문제 해결
- 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장해준다.
패러다임 불일치 총 정리
- 정교한 객체 모델링을 할수록 패러다임의 불일치 문제가 더 커짐
- 개발자가 소모해야 하는 비용 증가
- 객체 모델링은 힘을 잃고 점점 데이터 중심의 모델로 변해감
- 즉 이러한 문제를 해결하기 위해 나온 결과물이 JPA다.
세 번째, 객체 그래프 탐색
- 참조를 사용해서 연관된 객체를 찾는것을 객체 그래프 탐색이라 한다.
- 객체는 마음껏 객체 그래프를 탐색할 수 있어야 한다.
- SQL 을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.
JPA의 문제해결
- JPA를 사용하면 객체 그래프를 마음껏 탐색할 수 있다.
- JPA는 객체를 사용하는 시점에 SELECT SQL을 실행하는 지연 로딩 기능을 사용한다.
- 연관된 객체를 즉시 함께 조회할지 사용되는 시점에 조회할지 간단한 설정을 제공한다.
JPA를 사용해야 하는 이유 요약
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준 ORM 기술
참고자료 - 자바 ORM 표준 JPA 프로그래밍 (김영한)
반응형