Java ORM 표준 JPA 프로그래밍 스터디 - 4

2024-03-24

  • Java
  • Spring
  • JPA

JPA란!?

JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다. 이전까지 설명했던 패러다임의 불일치를 해결해주는 기술! JPA라는 표준 덕분에 특정 구현 기술에 대한 의존도를 줄이고, 여러 다른 구현 기술로 손쉽게 이동 할 수 있는 장점이 있다.

주요 작동 방식

  1. 엔티티 매니저(Entity Manager) : JPA의 핵심 컴포넌트로, 엔티티의 생명주기를 관리합니다. 엔티티 매니저를 통해 엔티티를 데이터베이스에 저장하거나 데이터베이스에서 엔티티를 조회할 수 있습니다.

  2. 영속성 컨텍스트(Persistence Context) : 엔티티를 영구 저장하는 환경입니다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면, 해당 엔티티는 영속성 컨텍스트에 보관됩니다.

  3. 트랜잭션 관리(Transaction Management) : JPA는 데이터의 일관성 을 유지하기 위해 트랜잭션을 사용합니다. 트랜잭션은 여러 데이터 변경 작업을 하나의 작업 단위로 묶는 것을 말합니다.

  4. 객체-관계 매핑(Object-Relational Mapping) : JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 처리합니다. 이를 통해 개발자는 **객체 지향적인 방식**으로 데이터를 다룰 수 있습니다.

  5. JPQL(Java Persistence Query Language) : SQL과 유사하지만, 엔티티 객체를 대상으로 쿼리를 작성할 수 있는 언어입니다. JPQL은 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 검색을 수행합니다.

ORM 이란?

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형 시스템 간에 데이터를 변환하는 프로그래밍 기법입니다.

즉, ORM은 데이터베이스객체 지향 프로그래밍 언어 간의 '다리' 역할을 합니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에서 데이터를 생성, 읽기, 업데이트, 삭제(CRUD)할 수 있습니다.

ORM의 주요 장점은 개발 생산성의 향상, 코드의 재사용성, 데이터베이스 독립성 등이 있습니다. 하지만 성능 이슈나 복잡한 쿼리를 다루는 데 있어서는 한계가 있을 수 있습니다.

하이버네이트(Hibernate)란

자바에서 사용하는 객체-관계 매핑(ORM) 라이브러리 중 하나입니다.

하이버네이트는 데이터베이스와 객체 지향 프로그래밍 사이의 간극을 줄이기 위해 설계 되었습니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에서 데이터를 생성, 읽기, 업데이트, 삭제(CRUD)할 수 있습니다.

하이버네이트의 주요 기능은 다음과 같습니다:

  1. 객체-관계 매핑 : 하이버네이트는 자바 객체와 데이터베이스 테이블 간의 매핑을 처리합니다. 이를 통해 개발자는 객체 지향적인 방식으로 데이터를 다룰 수 있습니다 .

  2. 데이터베이스 독립성 : 하이버네이트는 다양한 데이터베이스 시스템을 지원하므로, 데이터베이스 시스템을 변경하더라도 코드를 크게 변경할 필요가 없습니다 .

  3. 자동 스키마 생성 : 하이버네이트는 매핑 정보를 바탕으로 데이터베이스 스키마를 자동으로 생성 할 수 있습니다.

  4. 지연 로딩(Lazy Loading) : 하이버네이트는 필요한 시점에 데이터를 로딩 하는 지연 로딩 을 지원합니다. 이를 통해 성능을 향상시킬 수 있습니다.

하이버네이트는 JPA(Java Persistence API)의 구현체 중 하나이기도 합니다. 이는 JPA가 제공하는 인터페이스를 하이버네이트가 구현하고 있다는 것을 의미합니다. 따라서 JPA를 사용하는 애플리케이션에서는 하이버네이트를 쉽게 사용할 수 있습니다.

왜 JPA를 사용해야 하는가

생산성

기존 SQL에 지루하고 반복적인 코드와 CRUD용 SQL을 개발자가 직접 작성하지 않아도 됩니다. JPA는 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에서 데이터를 생성, 읽기, 업데이트, 삭제(CRUD)할 수 있게 해줍니다. (DDL 문 자동 생성 기능 등) 이는 개발 시간을 줄이고 생산성을 향상시킵니다.

유지보수

기존 SQL에 의존적으로 되는 경우에, 엔티티에 필요한 필드 하나 추가로 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야했지만 JPA를 사용하면 데이터베이스 스키마 변경에 대응하기 쉽습니다. 객체 모델을 변경하면 JPA가 해당 변경 사항을 데이터베이스에 자동으로 반영해줍니다. 고로 유지보수해야하는 코드 수가 줄어듭니다.

패러다임 불일치 해결

이전에는 상속, 연관관계, 객체 그래프 탐색, 비교 등과 같은 패러다임의 불일치가 많았습니다. 하지만, JPA는 객체 지향 프로그래밍과 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결해줍니다. 이를 통해 개발자는 객체 지향적인 방식으로 데이터를 다룰 수 있습니다 .

성능

JPA는 1차 캐시, 지연 로딩 등의 기능을 제공하여 성능을 최적화할 수 있습니다. 또한, JPA는 SQL 쿼리를 최적화하여 데이터베이스의 부하를 줄일 수 있습니다. JPA는 애플리케이션과 데이터베이스 사이에서 동작합니다. 하나의 계층으로서 최적화 할 수 있는 방식들을 시도해 볼 수 있습니다.

데이터 접근 추상화와 벤더 독립성

JPA는 데이터베이스 접근을 추상화 하여, 다양한 데이터베이스 벤더에 독립적인 코드를 작성할 수 있게 해줍니다. 이는 데이터베이스 벤더를 변경하더라도 코드를 크게 변경할 필요가 없음을 의미합니다.

유지보수 + 확장성...

클로저(Closru...