💡 ORM 등장 배경
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 이로 인해 객체 모델과 관계형 모델 간에 불일치가 존재한다. 객체 모델과 관계형 모델 간의 불일치 사이에서 개발자는 SQL문을 사용하여 두 모델 간의 차이를 메웠지만 객체 모델링을 SQL로 풀어내는데 너무 많은 코드와 노력이 필요하다. 이러한 문제를 해결하기 위해 ORM이 등장하였다.
💡 ORM이란
ORM은 Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제와 제약사항을 개발자 대신 해결해준다.
💡 JPA
JPA는 Java Persistence API의 약자로 자바 ORM 기술에 대한 API 표준 명세를 나타내는 말이다. 즉, 인터페이스를 모아둔 것이며 JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 한다.
💡 하이버네이트
앞서 말한 JPA를 구현한 ORM 프레임워크이며 자바 ORM 기술에 대한 API 표준 명세를 구현한 구현체를 말한다. JPA를 구현한 ORM 프레임워크 중에서 가장 대중적이다.
💡 JPA 장점
🔍 생산성
JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다.
INSERT SQL을 작성하고 JDBC API를 사용하는 지루하고 반복적인 일을 JPA가 대신 처리해주며 CREATE TABLE 같은 DDL문을 자동으로 생성 해준다. 따라서 반복전인 코드와 SQL문을 개발자가 직접 작성하지 않아도 된다. 예를 들어 ORM 프레임워크를 사용하면 객체를 데이터베이스에 저장할 때 INSERT SQL을 직접 작성하는 것이 아니라 객체를 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다. 그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해서 데이터베이스에 객체를 저장해준다
🔍 유지보수
SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 했다. 하지만 JPA의 메커니즘을 보면 내부적으로 JDBC를 사용하기 때문에 개발자가 직접 JDBC를 구현하지 않고 이런 과정을 대신해주므로 필드를 추가하거나 삭제해도 유지보수할 코드가 줄어든다. 이로 인해 유지보수하기 좋은 도메인 모델을 편리하게 설계할 수 있다.
🔍 패러다임의 불일치 해결
JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 객체 모델과 관계형 모델간의 패러다임 불일치 문제를 해결해준다.
🔍 성능
JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기능을 제공한다. JPA는 애플리케이션과 데이터베이스 사이에서 동작한다. 애플리케이션과 데이터베이스 사이에 계층이 하나 더 있으면 최적화 관점에서 유용하다.
String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
위 코드는 같은 트랜잭션 안에서 같은 회원을 두 번 조회하는 코드의 일부분이다. JDBC API를 사용해서 해당 코드를 직접 작성한다면 회원을 조회할 때마다 SELECT SQL을 사용해서 데이터베이스와 두 번 통신했을 것이다. JPA를 사용하면 회원을 조회하는 SELECT SQL을 한 번만 데이터베이스에 전달하고 두번째는 조회한 회원 객체를 재사용한다.
🔍 데이터 접근 추상화와 벤더 독립성
데이터베이스마다 같은 기능도 벤더마다 다르고 페이징 처리가 달라서 데이터베이스마다 사용법을 각각 배워야 한다. 그래서 애플리케이션은 처음 선택한 데이터베이스 기술에 종속되고 다른 데이터베이스로 변경하기는 매우 어렵다. 하지만 JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다. 예를 들어 JPA를 사용하면 로컬 개발 환경은 H2를 사용하고 개발이나 상용환경은 오라클이나 MySQL을 사용할 수 있다.
🔍 표준
JPA는 자바 진영의 ORM 기술 표준이다. 표준을 사용하면 다른 구현 기술로 손쉽게 변경할 수 있다.
💡 JPA 단점
🔍ORM만으로 온전한 서비스를 구현하기에는 한계가 있다
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어렵다
- 복잡한 쿼리를 정확한 설계없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제가 발생할 수 있다
참고
자바 ORM 표준 JPA 프로그래밍-김영한 저
스프링부트 핵심 가이드-장정우 저
'개념 스터디' 카테고리의 다른 글
스프링부트 구조 Controller, Service, DAO, Repository, DTO, Entity (0) | 2024.01.22 |
---|---|
엔티티 매니저? 영속성 컨텍스트? (0) | 2024.01.21 |
MVC (0) | 2024.01.17 |
REST API (0) | 2024.01.15 |
레이어드 아키텍처 (0) | 2024.01.14 |