12월 21일- JPA와 ORM의 이해

Yullgiii·2023년 12월 21일
0
post-thumbnail

데이터베이스 관리를 위한 JPA와 ORM의 이해

데이터베이스 관리와 웹 애플리케이션 개발에서 JPA와 ORM(Object-Relational Mapping)의 사용은 개발자들에게 많은 이점을 제공한다. 이러한 기술들은 데이터베이스와의 상호작용을 간소화하고, 코드의 효율성과 성능을 크게 향상시킨다.

JPA와 ORM 사용의 이점

JPA와 같은 ORM(Object-Relational Mapping)을 사용하는 이유와 영속성의 개념, 그리고 N+1 문제에 대해 알아보면, 이러한 주제들은 데이터베이스와 관련된 중요한 개념들로, 웹 애플리케이션 개발에서 효율성과 성능을 크게 향상시킨다.

JPA와 같은 ORM을 사용하는 이유는 다음과 같다. 첫째, SQL 중심적인 개발에서 객체 중심으로의 전환을 가능하게 하여 개발 생산성을 높이고 객체 지향적인 코드 작성을 용이하게 한다. 둘째, 데이터베이스 엔진에 대한 종속성을 줄여준다. ORM은 다양한 데이터베이스 엔진에 대한 SQL을 자동으로 생성해주므로, 데이터베이스 엔진 변경 시 ORM만 수정하면 되어 코드 수정이 크게 줄어든다.

영속성과 그 중요성

다음으로, 영속성이란 데이터가 생성된 프로그램의 실행 종료 후에도 사라지지 않는 데이터의 특성을 말한다. JPA에서는 이를 '영속성 컨텍스트'로 관리한다. 이 컨텍스트는 1차 캐시로도 불리며, 데이터베이스 트랜잭션 처리에 중요한 역할을 한다. 영속성 컨텍스트의 장점은 다음과 같다:

1차 캐시: 한 트랜잭션 내에서 같은 데이터를 조회할 때, 두 번째부터는 1차 캐시에서 데이터를 가져와 성능을 향상시킨다.
트랜잭션을 지원하는 쓰기 지연: 트랜잭션 커밋 전까지 SQL을 데이터베이스에 보내지 않고, 커밋 시 모아서 보낸다. 이를 통해 네트워크 사용량을 줄이고 성능을 향상시킨다.
변경 감지(Dirty Checking): 영속 상태의 엔티티 변경 사항을 감지하여, 트랜잭션 커밋 시점에 변경된 엔티티에 대해 UPDATE SQL을 자동으로 생성하여 실행한다.

N+1 문제와 해결 방법

N+1 문제는 ORM에서 자주 발생하는 성능 이슈로, 1개의 쿼리로 해결할 수 있는 문제를 N개의 쿼리로 해결하게 되는 문제이다. 이는 연관된 엔티티를 로딩할 때 발생한다. JPA는 이를 해결하기 위해 fetch join, 엔티티 그래프, batch size 등의 기능을 제공한다. 예를 들어, 아래 코드는 N+1 문제를 발생시킨다:

List<Post> posts = postRepository.findAll();
for(Post post : posts) {
    System.out.println(post.getComments().size());
}

이 코드에서 postRepository.findAll()은 모든 Post를 조회하는 쿼리를 한 번 실행하고, 각 Post에 대해 post.getComments().size()를 호출할 때마다 Comment를 조회하는 쿼리를 실행하게 된다. 총 N+1번의 쿼리가 실행되는 것이다.

이를 해결하기 위해 JPA에서는 fetch join을 사용할 수 있다:

@Query("select p from Post p join fetch p.comments")
List<Post> findAllWithComments();

이 코드에서 join fetch p.comments는 Post와 Comment를 함께 조회하는 쿼리를 생성하므로, N+1 문제를 해결할 수 있다.

CRUDRepository와 JpaRepository의 차이점

CRUDRepository와 JpaRepository는 스프링 데이터 JPA에서 제공하는 인터페이스로, JPA를 더 쉽게 사용할 수 있도록 도와준다. CRUDRepository는 기본적인 CRUD 연산을 추상화한 인터페이스이며, JpaRepository는 CRUDRepository를 상속하고 JPA에 특화된 기능을 추가로 제공한다. 따라서 JpaRepository는 CRUDRepository의 모든 기능을 포함하면서, 추가로 JPA 관련 기능을 제공한다. 이를 통해 데이터베이스 연산을 위한 코드를 효율적으로 작성할 수 있으며, 개발 시간을 단축시키고 코드의 가독성을 높여준다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글