본문 바로가기

Spring Boot/스프링 부트 핵심 가이드

[SpringBoot] 6.2-5 ORM, JPA, Hibernate, 영속성 컨텍스트

Summary : ORM(JPA)를 통해서 데이터베이스를 객체 접근하듯 할 수 있음 / Hibernate는 JPA의 구현체
JPA의 원리 : EntityManagerFactory가 EntityManager를 생성하면,
이 EntityManager가 엔티티를 영속성 컨택스트에 올리고, 영속성 컨택스트와 DB를 비교하며 DB를 조작함

 

💡 6.2 ORM

  • Object Relational Mapping의 약자
  • 직역하자면 '객체 관계 매핑'
  • java의 객체(entity)와 table을 자동으로 매핑하는 방법
  • 쿼리문이 아니라 메서드로 데이터를 조작할 수 있음
  • 우리는 자바의 ORM인 JPA를 사용할 것이므로 이후의 내용이 모두 JPA에도 적용된다고 생각하면 됨

📌 ORM의 장점

  • 쿼리를 작성하는 양이 현저히 줄어 개발 비용이 줄어듦
  • 재사용 및 유지보수가 편리함
  • DB에 대한 종속성이 들어들어서 DB를 교체하는 상황에서도 리스크가 적음 (e.g H2 -> MySQL)

📌 ORM의 단점

  • 복잡한 쿼리를 구현할 수 없음 → ORM만으로는 온전한 서비스를 구현하기 힘듦
  • 어플리케이션 관점과 DB관점의 불일치가 생길 수 있음
  • 1) 자동 설계
    ORM은 필요한 테이블을 자동으로 설계하는데
    이때문에 테이블의 수가 클래스의 수보다 많아질 수 있음 (특히 관계 태이블)
  • 2) 상속
    table에는 상속이라는 개념이 없음
  • 3) 식별
    DB는 PK가 같으면 동일한 데이터라 식별하지만, 객체는 값이 같더라도 동일한 객체로 식별하지 않기도 함
  • 4) 참조
    자바는 객체 자체를 참조하여 연관성을 나타내는 반면, DB는 FK를 이용해서 연관성을 나타냄
    또한 자바에서는 참조의 방향이 있지만, table은 양방향 관계만 존재
  • 5) 접근 방식
    자바는 참조를 이용해서 객체에 접근하지만, (즉, 참조하는 객체 자체를 필드로 갖는 형식)
    table은 여러 table을 JOIN하여 접근함

💡 6.3 JPA

  • 자바의 ORM 기술 표준 (그냥 JPA가 ORM 역할을 한다고 생각하면 무난)
  • ORM 보다 더 구체화된 인터페이스를 제공
  • 내부적으로 JDBC를 사용 (cf. JBDC는 자바에서 DB 접속을 도와주는 자바 API)
  • JPA 구현체로는 Hibernate, EclipseLink, DataNucleus가 있음 (가장 많이 사용되는 것은 Hibernate)

어플리케이선 - JPA - JDBC - Driver - Database 의 관계

💡 6.4 Hibernate

📌 6.4.1 Spring Data JPA

  • Hibernate의 기능을 더 편하게 사용하게하는 라이브러리
  • 하이버데이트의 EntityManager를 직접 다루지 않고 레포지토리를 통해 쿼리를 동적으로 생성한다.
  • cf. 지금까지 해온 프로젝트에서 항상 spring-boot-starter-data-jpa 의존성을 추가했었는데,
    spring-boot-starter-data-jpa는  spring-data-jpa에 의존하므로 결과적으로 항상 spring-data-jpa를 써온 샘이다.

📌 6.5 Persistence Context (영속성 컨텍스트)

  • 엔티티와 레코드(db 데이터) 사이의 괴리를 해소하는 역할
  • 엔티티를 영구 저장하는 환경
  • 영속성 컨텍스트는 엔티티 메니저를 생성할 때 하나 만들어짐
  • 원리 : 엔티티가 영속성 컨텍스트에 들어오면 JPA는 해당 엔티티를 바탕으로 데이터베이스를 구성함
  • 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는 시점부터 해당 객체를 영속 객체(Persistence Object)라고 함
  • 영속성 컨텍스트는 세션 단위의 생명주기를 가짐
    즉, db에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어짐
    세션이 종료되면 영속성 컨텍스트도 없어짐
  • EntityManager는 영속성 컨텍스트에 접근하기 위한 수단으로 사용됨

📌 6.5.1 Entity Manager(엔티티 매니저)

  • 데이터베이스에 접근해서 CRUD 작업을 수행함 (JPA의 기능 대부분을 엔티티 메니저가 제공)
  • Spring Data JPA는 엔티티 메니저를 통해서 리포지토리를 사용해서 데이터베이스에 접근
  • 앤티티 매니저 '팩토리'는 클라이언트에 요청이 올 때마다 엔티티 매니저를 생성
  • 엔티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성되며, 모든 엔티티가 공유해서 사용함
  • 엔티티 매니저 팩토리가 생성한 엔티티 매니저는
    엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행하고,
    영속성 컨텍스트와 데이터베이스를 비교하면서 데이터베이스를 대상으로 작업을 수행함

엔티티 매니저와 엔티티의 영속성 관리 — Bonglog - 기록과 정리의 공간 (tistory.com)
[SPRING] JPA의 영속성 컨텍스트 :: 잡아랑 자바왕 (tistory.com)

📌 6.5.2 엔티티의 생명주기

  • 비영속(New)
    영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태
  • 영속(Managed)
    영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
  • 준영(Detached)
    영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
  • 삭제(Removed)
    데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태