JPA.01 소개

JPA

JPA Java Persistence APIORM 이란 기술을 기반으로 관계형 데이터베이스를 객체 지향 중심의 프로그래밍과 매핑시켜주는 자바 표준 ORM API 이다.

기존 MyBatis 와 같은 다양한 프레임워크가 자바 어플리케이션과 데이터베이스의 가교 역할을 해왔지만, 점점 커지는 프로그램에 비례하게 늘어나는 관리 포인트에 대한 걱정은 모든 개발자들의 몫이고, 작은 변경을 위한 크나큰 코드 수정은 개발자들의 숙명이었다.

JPA 는 위와 같은 일을 좀 더 쉽고, 사이드 없이 코드를 관리할 수 있는 장점을 가지고 있다. 하지만, 모든 기술을 제대로 알고 써야하는 것처럼 JPA 에도 단순히 눈에 보이는 장점만 보고 시작한다면 더 큰 운영 이슈를 맞닿게 될 수도 있다.

차근차근 하나씩 JPA 를 배우고 익혀가보는 것이 매우 중요해보인다.


ORM

ORMObject-Relational-Mapping 객체 관계 매핑 이란 의미이다.

이 의미는 객체는 객체대로 설계하고, 관계형 데이터베이스도 관계형 데이터베이스로 설계 하여 ORM 프레임워크가 중간에서 매핑 시켜주는 기술이다.

JPA는 이런 ORM 개념으로 아래 그림처럼 어플리케이션과 JDBC API 사이 역할을 하면서,

  1. Entity 를 분석하고,
  2. SQL 문을 생성하며,
  3. JDBC 를 활용해서 DB 에서 데이터 처리

위 3가지 역할을 해주는 API 이다.

JPA 동박 원리


JPA 를 사용하는 이유

  • 객체 중심의 개발
  • 높은 생산성과 유지보수성
  • 패러다임의 불일치 해결
  • 성능
  • 데이터베이스 방언

JPA의 생산성과 유지보수성

생산성

  • 저장 : em.persist(entity)
  • 조회 : em.find(id)
  • 수정 : em.setColumn("column")
  • 삭제 : em.remove(entity)

유지보수성

public class Member {
    private String id;
    private String name;
    private String age;     // 새로 추가된 컬럼
}

만약 위 Member 처럼 age 이란 컬럼이 운영 도중 추가가 된다면, MyBatis 와 같은 SQL Mapper 프레임워크에서는 아래처럼 MEMBER 테이블에 대한 모든 SQL 쿼리를 검수하고 수정을 해줘야 한다.

INSERT INTO MEMBER(ID, NAME, AGE) VALUES ( ... );
SELECT ID, NAME, AGE FROM MEMBER ...;
UPDATE MEMBER SET AGE = ? WHERE ID = ? ;

하지만 JPA 에서는 아래와 같이 필요한 곳에서만 phone 이란 조회 필드를 추가하거나 등록/수정하는 곳에서 넣어주기만 하면 끝이다.

public void saveMember() {
    Member member = new Member();
    member.setName("JIM");
    member.setAge(33);        // 추가
}

패러다임의 불일치

객체 지향형 vs 관계 지향형

JPA 객체 지향 vs 관계 지향형

RDBMS 의 DB 모델링을 기준으로 자바의 객체를 설계하고자 하면, 그 둘의 패러다임의 불일치를 경험할 수 있다. JPA는 이러한 패러다임을 객체 중심적으로 풀어주고, 객체 중심적인 코딩을 RDBMS 에 맞게 SQL 를 생성해준다.


JPA의 성능

1차 캐시와 동일성 보장

같은 트랜잭션 안에서 같은 Entity 를 조회한다면, 1차 캐시를 통해 DB 조회없이 동일한 Entity 를 반환하고, 그 Entity 에 대한 동일성을 보장한다.

트랜잭션을 지원하는 쓰기 지연

하나의 트랜잭션 안에서 여러 개의 DB 쓰기를 할 때, SQL 하나씩 DB Connection 을 맺고 처리하는 것이 아니라, 한번에 모아서 처리한다.

지연 로딩과 즉시 로딩

지연 로딩은 객체가 실제 사용될 때 로딩하는 방식이고, 즉시 로딩은 한번에 연관된 객체까지 모두 미리 조회하는 방식이다.


데이터베이스 방언

JPA 는 특정 데이터베이스에만 종속적이지 않고, 모든 데이터베이스와 연동하여 사용 가능하다. 그 이유는 각 데이터베이스마다 지원하는 내장 함수 또는 SQL 문법에 대해 방언으로 모두 지원하고 있기 때문이다.

JPA 데이터베이스 방언


JPA 는 이름 그대로 API 의 모음이다. 그래서 단순히 보면, API 는 몇가지 알면 JPA 를 잘 쓸수 있고, 쉽게 개발을 할 수 있을거란 잘못된 생각을 가질 수 있게 된다. 하지만 현재 대부분 자바 개발자들이 JPA 개발에 대한 방어적인 의견이 많이 있다고 한다. 그 이유는 위험하다는 것이다.

하지만 정확하게 동작 원리를 이해하고 사용한다면, 아주 편리하고 멋진 객체 지향 코딩을 할 수 있도록 도와주는 것이 JPA 라고 생각한다.

그러기 위해서 JPA 에 대한 공부를 게을리해서는 안될 것 같다.


출처