JPA
JPA Java Persistence API
는 ORM
이란 기술을 기반으로 관계형 데이터베이스를 객체 지향 중심의 프로그래밍과 매핑시켜주는 자바 표준 ORM API 이다.
기존 MyBatis
와 같은 다양한 프레임워크가 자바 어플리케이션과 데이터베이스의 가교 역할을 해왔지만, 점점 커지는 프로그램에 비례하게 늘어나는 관리 포인트에 대한 걱정은 모든 개발자들의 몫이고, 작은 변경을 위한 크나큰 코드 수정은 개발자들의 숙명이었다.
JPA 는 위와 같은 일을 좀 더 쉽고, 사이드 없이 코드를 관리할 수 있는 장점을 가지고 있다. 하지만, 모든 기술을 제대로 알고 써야하는 것처럼 JPA 에도 단순히 눈에 보이는 장점만 보고 시작한다면 더 큰 운영 이슈를 맞닿게 될 수도 있다.
차근차근 하나씩 JPA 를 배우고 익혀가보는 것이 매우 중요해보인다.
ORM
ORM 은 Object-Relational-Mapping 객체 관계 매핑
이란 의미이다.
이 의미는 객체는 객체대로 설계하고, 관계형 데이터베이스도 관계형 데이터베이스로 설계 하여 ORM 프레임워크가 중간에서 매핑 시켜주는 기술이다.
JPA는 이런 ORM
개념으로 아래 그림처럼 어플리케이션과 JDBC API 사이 역할을 하면서,
- Entity 를 분석하고,
- SQL 문을 생성하며,
- JDBC 를 활용해서 DB 에서 데이터 처리
위 3가지 역할을 해주는 API 이다.
JPA 를 사용하는 이유
- 객체 중심의 개발
- 높은 생산성과 유지보수성
- 패러다임의 불일치 해결
- 성능
- 데이터베이스 방언
JPA의 생산성과 유지보수성
생산성
- 저장 :
em.persist(entity)
- 조회 :
em.find(id)
- 수정 :
em.setColumn("column")
- 삭제 :
em.remove(entity)
유지보수성
만약 위 Member
처럼 age
이란 컬럼이 운영 도중 추가가 된다면, MyBatis
와 같은 SQL Mapper 프레임워크에서는 아래처럼 MEMBER
테이블에 대한 모든 SQL 쿼리를 검수하고 수정을 해줘야 한다.
하지만 JPA 에서는 아래와 같이 필요한 곳에서만 phone
이란 조회 필드를 추가하거나 등록/수정하는 곳에서 넣어주기만 하면 끝이다.
패러다임의 불일치
객체 지향형 vs 관계 지향형
RDBMS 의 DB 모델링을 기준으로 자바의 객체를 설계하고자 하면, 그 둘의 패러다임의 불일치를 경험할 수 있다. JPA는 이러한 패러다임을 객체 중심적으로 풀어주고, 객체 중심적인 코딩을 RDBMS 에 맞게 SQL 를 생성해준다.
JPA의 성능
1차 캐시와 동일성 보장
같은 트랜잭션 안에서 같은 Entity 를 조회한다면, 1차 캐시를 통해 DB 조회없이 동일한 Entity 를 반환하고, 그 Entity 에 대한 동일성을 보장한다.
트랜잭션을 지원하는 쓰기 지연
하나의 트랜잭션 안에서 여러 개의 DB 쓰기를 할 때, SQL 하나씩 DB Connection 을 맺고 처리하는 것이 아니라, 한번에 모아서 처리한다.
지연 로딩과 즉시 로딩
지연 로딩은 객체가 실제 사용될 때 로딩하는 방식이고, 즉시 로딩은 한번에 연관된 객체까지 모두 미리 조회하는 방식이다.
데이터베이스 방언
JPA 는 특정 데이터베이스에만 종속적이지 않고, 모든 데이터베이스와 연동하여 사용 가능하다. 그 이유는 각 데이터베이스마다 지원하는 내장 함수 또는 SQL 문법에 대해 방언으로 모두 지원하고 있기 때문이다.
JPA 는 이름 그대로 API 의 모음이다. 그래서 단순히 보면, API 는 몇가지 알면 JPA 를 잘 쓸수 있고, 쉽게 개발을 할 수 있을거란 잘못된 생각을 가질 수 있게 된다. 하지만 현재 대부분 자바 개발자들이 JPA 개발에 대한 방어적인 의견이 많이 있다고 한다. 그 이유는 위험하다는 것이다.
하지만 정확하게 동작 원리를 이해하고 사용한다면, 아주 편리하고 멋진 객체 지향 코딩을 할 수 있도록 도와주는 것이 JPA 라고 생각한다.
그러기 위해서 JPA 에 대한 공부를 게을리해서는 안될 것 같다.