본문 바로가기

Back End/Spring Boot

[JAVA & Spring] JPA란?

[JAVA] JPA란?


개요

  JPA의 등장배경에 대하여 알아보고, JPA의 특징에 대해 공부한다.

 

목차

 

소개

1. JPA의 등장배경

실제, JPA 이전에는 개발자가 직접 Query를 작성하였는데 이로 인해 JAVA의 핵심인 객체지향적인 개념이 모호해지게 되었다. 개발자들은 객체에 따른 코드의 설계와 구현이 아닌, SQL에 중점을둔 개발을 하게 되었고 실제 많은 자원이 직접적인 개발보다는 SQL에 들어가게 되었다. 이러한 문제점 및 불편함을 해결하고자 많은 프로그램들이 등장하였고, 여러 진화를 거쳐 객체와 RDB를 매핑해주는 ORM기법이 등장하였고, JAVA 진영에서도 이러한 ORM을 기술 표준으로 하는 JPA가 등장하게 된것이다.

 

2. JPA란?

JPA는 ORM의 등장 이후, 자바 진영에서 ORM을 기술 표준으로 하여 사용하는 인터페이스의 모음이다.
즉, 객체지향적인 자바 어플리케이션에서 RDBMS를 사용하는 방식을 정의한 인터페이스로, 인터페이스이기 때문에 Interface를 구현한 구현체로는 Hibernate, OpenJPA등이 있다.

 

3. JPA의 특징

1차 캐싱
JPA에서는 같은 트랜잭션 안에서는 한번 조회된 엔티티(데이터)를 저장해두어 같은 요청이 다시 들어오면, 캐싱된 데이터를 제공한다. 따라서, 기존 같은 쿼리문의 요청을 여러번 한다고 해도 단 한번의 요청만이 전송되기 때문에 DB 호출을 최소화 할 수 있다.

 

쓰기 지연
JPA에서는 JDBC BATCH SQL을 활용하여 트랜잭션을 Commit 할때까지, Insert 쿼리문을 실제 수행하지 않고 모아두는 기능을 한다. 이를 통해, 여러번 DB에 왔다갔다 하지 않고 최소한의 횟수로 통신하면 됨으로 네트워크 통신 비용을 절감시킬수 있다.

 

지연 로딩 & 즉시 로딩
지연 로딩은 객체가 실제 사용될 때, 로딩하는 것을 의미하고 즉시 로딩은 Join SQL을 통하여, 한번에 연관된 객체까지 미리 조회하는 것을 의미한다. 예를 들어, 팀을 조회하는데 해당 팀에 속해 있는 멤버들의 정보를 반드시 가져와야할 필요가 있을까? 정답은 아니다. 우리는 이를 JPA의 지연 로딩을 통해 구현해낼 수 있다. 이를 통해 실제 멤버들의 정보들이 필요할 때, SQL의 Query를 요청하면서 불필요한 쿼리의 요청을 최소화할 수 있게 된다.
반면, 팀과 멤버들의 정보를 항상 가져와야 한다면 이때는 지연 로딩이 효과적일까? 정답은 아니다. 팀과 멤버의 정보를 항상 같이 가져와야하는데 지연 로딩을 하게 된다면, Select를 두번 사용하게 되어 네트워크를 2번 타서 조회가 이루어지기 때문이다. 이때는 즉시 로딩 기법을 사용하여 한방 쿼리를 통해 연관된 데이터를 1번의 조회때 가져와서 불필요한 네트워크 트래픽을 줄일 수 있다. But, 지연 로딩과 즉시 로딩은 제대로 알고 활용하지 않을 시, N+1 문제에 직면해 DB의 성능을 떨어트릴 수 있기 때문에 이를 이해하고 사용하여야 한다.