개발 일기

JPA 본문

Tech/CS Foundations

JPA

flow123 2021. 11. 27. 00:39

이 포스팅은 (1) ORM, JPA란? (2) JPA를 쓰는 이유 (3)JPA 영속성 컨텍스트를 사용할 때의 이점에 대해서 다룬 개인적인 기록입니다.

오류가 있을 경우 피드백 주시면 감사하겠습니다.  

 

ORM 이란? 

 

ORM(Object Relational Mapping)

정의

객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술. 즉, 객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것. 

자바에만 있는 개념은 아닙니다. Node.js, 파이썬 등도 ORM 이 있습니다. ORM은 자바라는 언어에만 국한되는 개념이 아니고, 관계형 패러다임을 갖고 있다면 DB 종류를 구분하지 않습니다.

 

ORM의 시작 

백엔드 개발자가 비즈니스 로직 개발하기도 바쁜데, SQL 작성도 해야하네. 

그런데 생각해보니, '객체 지향'의 구조는 '관계형 DB'와 상당히 유사하다. 

어떻게 하면 객체지향을 관계형 DB에 맞게 자동적 처리를 해줄 수 있을까? 

 

관계형 DB 와 객체 지향 비교 

  관계형 DB 객체 지향 
명칭(?)  테이블  클래스 
저장 단위  Row (레코드 혹은 튜플)

*하나의 Row에 데이터 보관. 
인스턴스 

*클래스는 인스턴스를 생성해서, 인스턴스라는 공간에 데이터 보관 (객체에는 데이터 + 메서드 (행위) 가 담긴다는 점이 약간 차이있음) 
관계의 표현  테이블 사이의 관계로 데이터의 구조 표현  참조를 통해 어떤 객체가 다른 객체들과 어떤 관계를 맺고 있는지 표현. 

 

JPA란? 

 

JPA (Java Persistence API)란? 

자바 ORM 기술에 대한 API 표준명세라고 정의되는데요, 다른 말로는 ORM을 자바 언어에 맞게 사용하는 스펙입니다. 

과거에는 SQL 매퍼 (MyBatis, JdbcTemplate) 위주로 개발되었고, 현재는 상당수 JPA로 옮겨가고 있습니다. 

 

ORM 과 JPA 의 관계

아래 다이어그램에서 볼 수 있듯, JPA 에도 여러 구현체가 있는데, 그 중 가장 유명한 것이 Hibernate 입니다. 스프링부트는 이 Hibernate를 사용합니다. 

 

 

Spring Data JPA 

 

JPA 를 쉽게 사용하도록 스프링에서 제공하는 모듈입니다.  사용하려면 두 가지가 필요합니다.  

 

(1) JPA 를 통해 관리하는 엔티티 객체를 위한 엔티티 클래스 

(2) 엔티티 객체를 처리하는 Repository 

 

Jpa Repository 란? 

Spring Data JPA 는 Hibernate을 이용하기 위한 여러 API 를 제공하는데, 그 중 가장 많이 사용되는 인터페이스 입니다. 

 

*Repository 코드 예시 (출처: weeklytest 1119 코드 - CommentRepository)

-아래 Repositroy 코드를 보면 위의 요구 조건대로 Comment 클래스와 Jpa Repository 를 import 합니다. 

-Repository는 Spring Data JPA 에서 제공하는 인터페이스로 (extends JpaRepository) 설계합니다. 

스프링 내부에서 자동으로 객체를 생성하고 실행하기 때문에, 단순히 인터페이스를 정의하는 것만으로 충분합니다. 

package com.sparta.weeklytestspring.repository;
import com.sparta.weeklytestspring.domain.Comment;
import org.springframework.data.jpa.repository.JpaRepository;

// 엔티티의 타입 정보 (Comment Class 타입) 과 @Id의 타입 (Long)을 지정합니다. 
// Spring Data JPA 는 인터페이스 선언만으로, 자동으로 인터페이스 타입에 맞는 객체를 생성해주고
// 빈(bean)으로 등록됩니다. 
public interface CommentRepository extends JpaRepository<Comment, Long> {
}

 

 

JPA 를 쓰는 이유 

 

JPA는 jpa 만의 고유한 메모리 공간(context)을 이용해서 엔티티 객체들을 관리합니다.

 

기존의 MyBatis 기반의 프로그램과 달리 '영속성 컨텍스트' 단계가 하나 더 있습니다 

MyBatis 를 이용할 떄는, SQL 을 위해서 전달되는 객체는 모두 SQL 처리가 끝난 후에는 어떻게 되든 상관이 없습니다. 

(DB에 저장되기 전의 객체, DB를 거쳐서 나오는 객체가 동일할 수도 있고, 다를 수도 있습니다. ) 

이와달리, jpa 에서 사용하는 엔티티 객체들은 영속성 컨텍스트 (persistence context) 에서 관리되는 객체입니다. 

Jpa 방식에서는 엔티티 객체가 유지됩니다. 

 

엔티티 객체에는 어떤 변화가 일어나는 것을 감지하는 리스너(listener)가 있습니다. 

JPA 내부에서 엔티티 객체가 생성/변경 되는 것을 감지하는 역할은 AuditinEntityListener로 이루어집니다. 

@EnableJpaAuditing 은 AuditingEntityListener 를 활성화시키는 어노테이션입니다. Jpa 이용할 때 Application 에 붙여줍니다. 

 

영속성이란? 

 

영속성 컨텍스트란?

영속성은 영어로 persistence 입니다. JPA 를 사용하다보면, open in persistence view (객체간의 연관관계를 보여주는 기능입니다) 등 persistence 라는 단어가 자주 등장해요. 영어 사전을 검색해보면, '없어지지 않고 지속되다 라는 뜻인데요. JPA 의 맥락에서는 Entity를 영구적으로 저장해준다는 뜻입니다. 

 

영속성 컨텍스트는 객체와 DB 사이의 소통을 관리해줍니다. Entity manager 하나가 만들어질 때, 영속성 컨텍스트가 하나 만들어집니다. 

JPA 를 쓰면 엔티티 객체는 단순히 데이터를 담는 객체가 아니고, 실제 DB와 관련이 있습니다. 내부적으로는 Entity manager가 관리하게 됩니다.  application 이 시작될 때, 엔티티 매니저 팩토리가 시작되고 (initialized) 이 매니저 팩토리는 엔티티 매니저를 자동으로 bean 에 등록합니다. 

 

 

JPA 영속성 컨텍스트의 이점. 

영속성 컨텍스트가 없을 경우, 객체를 생성할 때마다 새로운 객체가 생성됩니다. 영속성 컨텍스트가 있을 때는, '1차 캐시'를 사용하기 때문에 객체 1개로 사용되는 것을 보장합니다 (동일성 보장) 한번이라도 사용된(조회 포함) 엔티티는 1차캐시에 등록됩니다. .

1차 캐시의 장점은, 같은 엔티티를 한번 더 조회할 시, db 쿼리를 날릴 필요 없이 캐시에서 조회 가능하다는 것입니다.  

 

Member a = entityManager.find(Member.class, "member1"); 
Member b = entityManager.find(Member.class, "member1"); 

System.out.println(a == b); // 동일성 비교 true

 

p.s. 테이블에서 Open in Persistence -> Entity Relationship Diagram Manager를 누르면, entity manager factor builder 가 나옵니다.

여기서 객체의 관계도를 볼 수 있습니다. 

 

 

 

참고자료

 

책: 코드로 배우는 스프링 부트 웹 프로젝트

강의: 스파르타 코딩클럽 스프링 

블로그 

https://1-7171771.tistory.com/113

https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

https://hyeooona825.tistory.com/87

 

[Spring] 영속성이란 (persistence)

JPA Persistence Spring JPA 를 공부하다보면 persistence 라는 말을 많이 들어보게 됩니다. (출처 : 네이버 영어사전) 무슨 소리지...하고 매번 넘어갔었는데 이번 기회에 정리를 하게 되었습니다. JPA 에서

hyeooona825.tistory.com

 

추후 공부해볼 것.

-JPA 연관관계 

-JDBC와 Hibernate 

-엔티티 매니저와 엔티티 매니저 팩토리 (언제 만들어지는지?) 

 

*DAO(Data Access Object) DB 사용해서 데이터 조회, 조작 기능 전담하는 객체. 

'Tech > CS Foundations' 카테고리의 다른 글

서버사이드 렌더링 vs 클라이언트 사이드 렌더링  (0) 2021.11.01
브라우저의 동작 방법  (0) 2021.11.01
HTTP와 HTTPS  (0) 2021.10.26
Comments