[JPA] ORM과 JPA

imcool2551·2022년 4월 2일
1

JPA

목록 보기
1/12
post-thumbnail

본 글은 인프런 김영한님의 JPA 로드맵을 기반으로 정리했습니다.

1. ORM


백엔드 웹 애플리케이션의 헤게모니는 객체지향이 쥐고있다. 객체지향은 추상화, 캡슐화, 상속, 다형성 등을 통해 복잡한 시스템을 변경에 유연하고 확장이 용이하도록 관리한다.

그러나 관계형 데이터베이스의 헤게모니는 객체지향이 아니다. 관계형 데이터베이스로는 객체지향의 상속, 연관관계 등의 개념을 표현하기 어렵다.

이러한 패러다임의 불일치 때문에 생산성에 큰 지장이 생긴다. 애플리케이션을 객체지향스럽게 설계해도 쿼리는 객체가아닌 테이블에 맞게 각각 따로 작성해야한다. 이런 지루하고 복잡한 SQL 매핑 작업은 ORM을 통해 해결할 수 있다.

ORM은 Object-relational-mapping 을 말한다. 객체는 객체답게 설계하고 관계형 데이터베이스는 관계형 데이터베이스답게 설계한다.

2. JPA


JPA는 자바진영의 ORM 표준이다. JPA는 인터페이스의 모음이다. 구현체로는 주로 Hibernate를 이용하게 된다. JPA를 사용함으로써 얻는 이점은 다음과 같다.

  • 테이블이 아닌 객체 중심으로 개발
  • 생산성
  • 유지보수성
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화
  • 벤더 독립성
  • 표준

JPA를 이용하면 테이블이 아닌 객체(엔티티)중심으로 개발하기 때문에 데이터베이스의 데이터를 마치 컬렉션 다루듯이 할 수 있다. 작성해야 하는 SQL 코드의 양이 급격하게 줄어들고 이는 생산성의 증가로 이어진다.

패러다임 불일치 문제도 해결된다. 관계형 데이터베이스로는 표현하기 어려운 상속, 연관관계, 객체 그래프 탐색도 JPA를 이용해서 표현할 수 있다.

JPA를 통한 약간의 성능이득은 덤이다. 영속성 컨텍스트의 1차 캐시를 통해 같은 트랙잭션 내에서 PK가 똑같은 엔티티는 DB 쿼리를 날리지 않고 동일한 엔티티를 반환한다. 즉, DB가 아닌 애플리케이션 단에서 Repeatable Read 격리수준을 보장한다.

또한 JPA는 JDBC BATCH SQL 기능을 통해 트랜잭션 커밋하는 순간까지 INSERT, UPDATE, DELETE SQL을 모았다가 한 번에 보낸다(예외상황도 있다). 이는 비즈니스 로직 수행 중 DB 로우 락이 걸리지 않음을 의미하기 때문에 성능 향상으로 이어진다.

JPA는 연관된 엔티티를 프록시로 조회하고 실제 사용될 때 지연 로딩하는 기능이 있다. 이와 반대되는 것은 즉시 로딩으로 JOIN을 통해 연관된 엔티티를 한꺼번에 미리 조회하는 것이다. 둘을 적절히 사용해서 성능 향상을 꾀할 수 있다.

JPA는 MySQL,PostgresSQL 등 특정 데이터베이스 제품에 종속적이지 않기 때문에 벤더 독립성이 있다고 볼 수 있다.

앞으로 이어질 글들에서 JPA의 핵심 개념과 사용법을 알아보도록 하자.

profile
아임쿨

0개의 댓글