1️⃣ ORM의 기본 원리
객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 사이의 불일치를 해소하여,
개발자가 객체를 다루는 것처럼 데이터베이스에 접근할 수 있도록 하는 기술입니다.
객체와 테이블의 매핑
객체 지향 프로그래밍에서 사용하는 클래스는 데이터베이스의 테이블과 매핑됩니다.
예를 들어, 객체인 User 클래스는 데이터베이스인 users 테이블에 대응됩니다.
클래스의 속성(필드)는 테이블의 컬럼에 대응됩니다.
각 객체의 인스턴스 변수가 테이블의 각 행(row)에 저장되는 데이터 필드입니다.
CRUD 작업의 추상화
ORM은 기본적인 CRUD작업을 객체의 메소드 호출로 처리할 수 있도록 해줍니다.
개발자가 SQL쿼리를 직접 작성하지 않고,
ORM 프레임워크가 객체의 상태 변화를 감지하여 적절한 SQL 문장을 자동으로 생성하고 실행합니다.
객체의 상태 관리와 영속성
ORM은 객체의 상태를 관리하며, 객체가 메모리에 존재하는 동안 데이터베이스와의 동기화를 책임지며 이를 영속성이라고 합니다.
예를 들어, 한 객체를 수정하면 ORM이 이를 감지하여 데이터베이스의 해당 레코드를 업데이트합니다.
관계 매핑
일대일, 다대일, 다대다 등 객체간의 관계를 데이터베이스 테이블의 외래 키로 매핑합니다.
이를 통해 객체 간의 연관관계를 명확하게 표현하고, 연관된 데이터를 함께 조회하거나 저장할 수 있습니다.
ORM은 객체의 관계를 단방향 혹은 양방향으로 정의할 수 있어, 실제 비즈니스 로직에 맞게 설계할 수 있습니다.
데이터 베이스 독립성
ORM을 사용하면 데이터베이스 접근 로직이 추상화되므로,
특정 데이터베이스에게 종속되지 않고 다양한 데이터베이스로 쉽게 전환할 수 있습니다.
이러한 원리들을 통해 ORM은 데이터베이스와 애플리케이션 사이의 매핑을 자동화하고,
개발자가 객체 모델에 집중할 수 있도록 도와주며,
코드의 유지보수성과 생산성을 크게 향상시킵니다.
2️⃣ 대표 ORM 프레임 워크 소개
🔍 JPA(Java Persistence API)
JPA는 자바 플랫폼에서 객체와 관계형 데이터베이스 간의 매핑을 위한 API입니다.
ORM의 공통 인터페이스를 정의하여 애플리케이션 코드와 데이터베이스 사이의 결합도를 낮추고 유지보수를 쉽게 할 수 있습니다.
애너테이션 기반 매핑
`@Entity`, `@Table`, `@Id`등과 같은 애너테이션을 사용하여
자바 클래스와 데이터베이스 테이블 간의 관계를 설정합니다.
플랫폼 독립성
JPA는 API이기 때문에, 다양한 구현체 (Hibernate, EclipseLink, OpenJPA 등)를 통해 사용할 수 있으며,
특정 구현체에 종속되지 않고 코드 작성이 가능합니다.
객체지향적 접근
데이터베이스 작업을 객체단위로 처리할 수 있도록 지원하여 SQL 코드의 직접적인 사용을 줄여줍니다.
🔍 Hibernate
Hibernate는 JPA의 구현체 중 하나로,
자바 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해주는 ORM 프레임워크입니다.
JPA 기능과 추가적인 기능을 제공하여 개발 생산성을 높입니다.
확장된 기능 제공
HQL(Hibernate Query Language), Lazy Loading, 자동 Dirty Checking 등 다양한 부가 기능을 지원하여
복잡한 데이터베이스 작업을 효율적으로 처리할 수 있습니다.
높은 성능
세션 관리, 캐시 메커니즘 등의 기능을 통해 데이터베이스 접근 성능을 최적화할 수 있습니다.
유연한 설정
XML 또는 애너테이션 기반의 설정을 통해 개발자가 원하는 대로 매핑과 쿼리 실행을 조정할 수 있습니다.
JPA는 자바 애플리케이션의 ORM 프레임 워크로 구현체에 독립적인 인터페이스를 제공하며,
Hibernate는 JPA를 실제로 구현하면서 추가적인 기능과 성능 최적화를 제공하는 프레임워크입니다.
두 기술 모두 데이터베이스와의 상호작용을 단순화하고,
유지보수성과 확장성을 개선하는 데 중요한 역할을 합니다.
3️⃣ ORM의 핵심 기능과 구조
ORM의 핵심 기능과 구조는 객체지향 프로그래밍과 관계형 데이터베이스간의 차이를 없애기 위해 설계었습니다.
🔍 객체와 테이블 간의 매핑
객체-테이블 매핑
자바 클래스를 데이터베이스의 테이블과 연결합니다.
각 클래스는 하나의 테이블에 대응되며, 클래스의 속성은 테이블의 컬럼과 매핑됩니다.
애너테이션 및 XML 설정
매핑 정보를 애너테이션(`@Entity`,`@Table`,`@Column`)이나 XML파일로 정의하여,
개발자가 명시적으로 객체와 데이터베이스 구조를 연결할 수 있습니다.
🔍 CRUD(생성, 조회, 수정, 삭제) 기능
추상화된 데이터 조작
SQL 쿼리를 직접 작성할 필요 없이,
객체를 통해 데이터베이스에 데이터를 삽입, 읽기, 수정, 삭제할 수 있도록 지원합니다.
자동 SQL 생성
ORM 프레임워크는 객체의 상태 변화를 감지하여 적절한 SQL 쿼리를 자동으로 생성 및 실행합니다.
🔍 객체 상태 관리와 영속성 컨텍스트
객체 상태 관리
객체는 일반적으로 `Transient(비영속)`, `Persistent(영속)`, `Detached(분리)` 상태를 가지며,
ORM은 이 상태 변화를 관리하여 데이터베이스와의 동기화를 유지합니다.
영속성 컨텍스트
ORM 프레임워크는 영속성 컨텍스트 (예: JPA의 EntityManager, Hibernate의 Session)를 통해 객체들의 상태를 추적하고,
변경사항을 데이터베이스에 반영합니다.
🔍 연관 관계 매핑
관계 매핑
클래스 간의 연관관계를 데이터베이스의 외래키 및 조인 테이블을 통해 매핑합니다.
지연 로딩(Lazy Loading) vs. 즉시 로딩(Eager Loading)
연관된 객체들을 언제 로딩할지 결정할 수 있어, 성능 최적화에 도움을 줍니다.
🔍 쿼리 추상화 및 객체 지향 쿼리 언어
객체지향 쿼리
JPQL(Java Persistence Query Language)이나 HQL(Hibernate Query Language)과 같은 객체 지향 쿼리 언어를 사용하여,
SQL 대신 객체를 대상으로 쿼리할 수 있습니다.
동적 쿼리 작성
Criteria API와 같은 기능을 통해, 런타임에 동적으로 쿼리를 구성할 수 있습니다.
🔍 캐싱 및 성능 최적화
캐싱 메커니즘
1차 캐시 (영속성 컨텍스트 내 캐시)와 2차 캐시(세션 간 공유 캐시)를 활용하여
데이터베이스 접근 횟수를 줄이고 성능을 향상시킵니다.
배치 처리 및 최적화
다수의 데이터 조작 작업을 배치 처리함으로써 데이터베이스와의 통신을 효율적으로 관리할 수 있습니다.
🔍 트랜잭션 관리
트랜잭션 통합
ORM 프레임워크는 트랜잭션 관리와 통합되어, 데이터의 일관성과 무결성을 유지합니다.
이를 통해 작업이 모두 성공하거나 모두 실패하도록 보장합니다.
자동 커및 및 롤백
객체의 상태 변화에 따른 커밋 및 오류 발생 시 롤백 기능을 지원하여 안정적인 데이터 처리를 가능하게 합니다.
🔍 구조적 아키텍처
매핑계층
객체와 데이터베이스 간의 매핑 정보를 관리하며,
이를 통해 SQL 생성 로직과 객체 상태 관리를 분리합니다.
세션/엔티티 매니저 계층
데이터베이스와의 연결, 객체 상태 관리, 트랜잭션 처리 등을 담당하는 핵심 컴포넌트입니다.
쿼리 엔진 계층
객체 지향 쿼리 언어를 SQL로 변환하고 실행하는 역할을 하며,
복잡한 조인이나 필터링 조건을 처리합니다.
캐시 계층
데이터 접근 속도를 높이기 위해 자주 조회되는 데이터를 캐시에 저장하고 관리합니다.