<TIL> 130. JPA Auditing? 영속성 컨텍스트? Hibernate?

YUJIN LEE·2023년 7월 5일
0

개발log

목록 보기
122/149

JPA Auditing?

Java에서 ORM 기술인 JPA를 사용해 도메인을 관계형 데이터베이스 테이블에 매핑 시
공통적으로 도메인이 가진 필드나 컬럼 존재.
-> 생성일자, 수정일자, 식별자 같은 필드 및 컬럼.

JPA에서는 Audit이라는 기능을 제공.
Audit은 감시하다 라는 뜻으로 Spring Data JPA에서 시간에 대해 자동으로 값을 넣어주는 기능.

도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후 update를 하는 경우 매번 시간 데이터를 입력해주지 않아도, audit를 이용해 자동으로 시간을 매핑해 DB의 테이블에 넣어주게 됨.

JPA 영속성 컨텍스트?

엔티티를 영구 저장하는 환경
애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할.
EntityManager를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티 보관, 관리

영속성(Persistence)?

데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성
영속성을 갖지 않는 데이터는 단지 메모리에만 존재해 프로그램 종료시 모두 잃어버림.
결국, 영속성은 특정 데이터 구조를 이전 상태로 복원할 수 있게 해줘 프로그램의 종료와 재개를 자유롭게 함.

영속성 컨텍스트 이점

1차 캐시

영속성 내부 1차 캐시 존재.
영속 상태의 엔티티를 이곳에 저장하기 때문에, 1차 캐시에 엔티티가 존재한다면 DB를 찾아보지 않아도 된다.
-> 캐시로써의 기능과 장점

영속 엔티티의 동일성 보장

1차 캐시로 반복 가능한 읽기(Repeatable Read)등급의 트랜잭션 격리 수준을 데이터 베이스가 아닌 애플리케이션 차원에서 제공 가능.

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

em.persist()로 객체를 영속성 컨텍스트에 저장해도 DB에 바로 Insert 쿼리를 날리지 않음.
SQL 쿼리를 모았다가 flush 될 때(영속성 컨텍스트의 변경 내용을 DB에 반영할 때) 모아둔 쿼리를 모두 날림 -> 쓰기지연

변경 감지(Dirty Checking)

영속성 컨텍스트에서 엔티티 조회 후 해당 엔티티 수정 시,
업데이트하는 코드가 없어도 영속성 컨텍스트 내의 스냅샷과 엔티티를 비교해
변경된 엔티티가 있으면 Update 쿼리를 자동으로 생성한다.

지연 로딩(Lazy Loading)

연관 관계 매핑되어 있는 엔티티를 조회 시 우선 프록시 객체를 반환하고 실제 필요할 때 쿼리를 날려 가져오는 기능
-> 필요할 때 데이터를 가져오는 기능

Hibernate?

자바 언어를 위한 ORM 프레임워크.
JPA 구현체로, JPA 인터페이스를 구현.
내부적으로 JDBC API 사용.

ORM 프레임워크(Object-Relational-Mapping)

데이터베이스와 객체지향 프로그래밍 언어간의 호환되지 않는 데이터들을 변환하는 프로그래밍 기법.
객체 관계 매핑!
객체지향 언어에서 사용할 수 있는 가상 객체 db 구축 방법

JDBC?

자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준.
즉, DB 작업을 위한 표준

JDBC API를 사용할 경우 하나의 자바 응용 프로그램만으로 JDBC 드라이버를 제공하는 어떤 종류의 관계형 DBMS에도 접근 가능.
JDBC API만 알면 데이터베이스 조작 가능

Hibernate 장점

생산성

  • SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리 수행.

유지보수

  • 테이블 컬럼이 변경되었을 때, 테이블 관련 DAO의 파라미터, 결과, SQL 등 대신 수행

특정 벤더에 종속적이지 않다

  • JPA는 추상화된 데이터 접근 계층 제공, 특정 벤더에 종속 X
  • 설정 파일에서 JPA에 어떤 DB를 사용하는지만 알려주면 DB변경 가능

패러다임 불일치 해결

  • 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 DB와의 패러다임 불일치 해결 가능

객체 중심 개발

Hibernate 단점

성능

  • 메서드 호출만으로 쿼리를 수행하는건 직접 SQL 작성하는 것보다 성능이 좋지 않음

세밀함

  • 메서드 호출만으로 쿼리 조작의 한계. -> 보완하기 위해 JPQL 지원
  • NativeQuery 지원해 SQL 자체 쿼리도 작성 가능

러닝커브

  • 공부해야함
profile
인정받는 개발자가 되고싶습니다.

0개의 댓글