BACKEND/SPRING

데이터 베이스 연동 - ORM, JPA

우진하다 2023. 8. 6. 22:55

ORM (객체 관계 매핑)

스프링 부트(Spring Boot)에서 ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 매핑하는 프로그래밍 기술입니다. 
스프링 부트에서는 JPA(Java Persistence API)를 주로 사용해 ORM을 구현하고, Hibernate는 JPA의 대표적인 구현체 중 하나입니다.

객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법을 의미하며
데이터 베이스와 애플리케이션 클래스와의 불일치와 제약사항을 해결해 줄 수 있는 역할입니다.

  • 장점

개발 생산성 향상: SQL 쿼리를 직접 작성하지 않아도 되므로 개발 속도가 빨라집니다. 
대부분의 ORM 프레임워크는 CRUD 연산을 위한 기본 메서드를 제공합니다.

유지보수성 증가: 
데이터베이스 스키마가 변경되더라도 ORM이 중간에서 매핑을 관리하므로 코드 변경이 최소화됩니다.

데이터베이스 독립성: 
특정 데이터베이스에 종속되지 않고, 다양한 데이터베이스에서 작동하도록 설계할 수 있습니다.

객체 지향적인 설계: 
데이터베이스의 테이블을 객체로 다루므로 객체 지향 설계 원칙을 쉽게 적용할 수 있습니다.

타입 안전성: 
컴파일 타임에 오류를 발견할 수 있으므로 실행 중인 애플리케이션의 안정성이 향상됩니다.

  • 단점

성능 이슈: 
ORM은 추상화 레이어를 추가하므로, 때때로 성능에 부정적인 영향을 미칠 수 있습니다. 
특히 복잡한 쿼리의 경우, 직접 작성한 SQL이 더 효율적일 수 있습니다.

학습 곡선: 
특히 복잡한 ORM 시스템의 경우, 제대로 사용하기 위해서는 충분한 학습과 이해가 필요합니다.

쿼리 최적화 한계: 
ORM이 생성하는 SQL 쿼리는 항상 최적화된 것은 아닙니다. 매우 복잡하거나 특별한 요구 사항이 있는 쿼리의 경우, ORM의 자동화된 쿼리보다 직접 작성한 SQL이 더 효율적일 수 있습니다.

데이터베이스의 고유 기능 제한: 
ORM을 사용하면 데이터베이스의 특정 기능을 제한하거나 사용하지 못할 수도 있습니다. 
특정 데이터베이스의 고유한 기능을 최대한 활용하려면 ORM의 추상화를 벗어나야 할 수 있습니다.

캐시 관리 복잡성: 
ORM의 캐시 메커니즘이 애플리케이션의 복잡성을 증가시킬 수 있으며, 잘못 관리되면 데이터 불일치 문제를 초래할 수 있습니다.

 

JPA(Java Persistence API)

JPA는 자바 ORM 기술 표준으로 채택된 인터페이스의 모음입니다.
즉, 자바 어플리케이션에서 관계형 데이터베이스의 관리를 추상화하고 간소화하는 API입니다. JPA는 ORM(Object-Relational Mapping)의 자바 표준입니다. 그로 인해 자바 객체와 데이터베이스 테이블 간의 매핑을 쉽게 할 수 있게 해줍니다.

JPA의 메커지늠은 내부적으로 JDBC를 사용합니다.
개발자 대신 적절한 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행합니다.

JPA 기반 구현체는 대표적으로 하이버네이트, 이클립스 링크, 데이터 뉴클리어스 등이 있으며 
가장 많이 사용되는 것이 하이버네이트 입니다.

  • 주요 특징

표준화: 
JPA는 여러 ORM 제공업체와 호환될 수 있도록 표준 인터페이스를 제공합니다. 
Hibernate, EclipseLink, OpenJPA 등과 같은 구현체를 사용할 수 있습니다.

객체-관계 매핑: 
객체 지향적인 코드 작성을 가능하게 하며, 데이터베이스의 테이블과 자바 객체 간의 매핑을 자동화합니다.

CRUD 연산 지원: 
기본적인 CRUD(Create, Read, Update, Delete) 연산을 간편하게 수행할 수 있는 API를 제공합니다.

쿼리 언어 지원: 
JPQL (Java Persistence Query Language)을 통해 객체 지향적인 쿼리를 작성할 수 있으며,
Criteria API를 사용해 프로그래밍 방식으로 안전한 쿼리를 구성할 수 있습니다.

트랜잭션 관리: 
선언적 트랜잭션을 지원하여 트랜잭션 관리를 간소화합니다.

  • 사용 방법

엔터티 클래스 정의: 
데이터베이스 테이블과 매핑할 자바 클래스를 정의하고, @Entity 어노테이션으로 표시합니다.

필드 매핑: 
@Id, @Column, @OneToMany 등의 어노테이션을 사용하여 클래스의 필드와 데이터베이스 칼럼 간의 매핑을 정의합니다.

리포지터리 생성: 
데이터 액세스를 담당할 인터페이스를 정의하고, JPA 리포지터리 인터페이스를 확장합니다.

트랜잭션 관리: 
@Transactional 어노테이션을 사용하여 메서드 또는 클래스 수준에서 트랜잭션 경계를 정의합니다.

쿼리 작성: 
필요한 경우 JPQL이나 Criteria API를 사용하여 쿼리를 작성합니다.