출처 : https://www.inflearn.com/course/ORM-JPA-Basic
수정중
JPA란?
JPA는 자바에서 제공하는 ORM의 표준 인터페이스로서 객체와 데이터베이스 간의 매핑을 정의하고 편리하게 사용할 수 있도록 도와주는 프레임워크입니다. JPA는 관계형 데이터베이스와 자바 객체 간의 매핑을 쉽게 할 수 있도록 도와줍니다. 여러 ORM 프레임워크 중 하나로, Hibernate, EclipseLink, OpenJPA 등이 JPA의 대표적인 라이브러리입니다.
ORM (Object-Relational Mapping)
객체를 통해 데이터베이스를 조작할 수 있도록 도와주는 프로그래밍 기술입니다.
객체는 메모리에서 사용되는 데이터의 집합이고, 관계형 데이터베이스는 디스크 상에 저장되는 테이블 형태의 데이터 집합입니다. 객체 모델과 관계형 데이터베이스 모델 간에는 구조적인 차이가 있습니다. ORM은 이러한 차이를 극복하고, 객체 지향 프로그래밍에서 사용되는 객체와 관계형 데이터베이스 간의 변환을 자동화합니다.
간단히 말하면 ORM은 JPA와 유사한 개념으로 객체와 데이터베이스 간의 매핑을 총칭하는 기술입니다.
JPA의 장점
- 객체와 데이터베이스 간의 매핑:
- JPA는 객체와 데이터베이스 간의 매핑을 자동으로 처리해주기 때문에, 개발자는 객체 지향적인 방식으로 데이터를 다룰 수 있습니다. 이로써 데이터베이스 스키마의 변경이나 SQL 쿼리의 변경에 대한 영향을 최소화할 수 있습니다.
- 표준화된 API:
- JPA는 자바 진영에서 ORM을 표준화한 API로, 여러 ORM 프레임워크에서 JPA를 구현하고 있습니다. 이는 개발자가 ORM을 선택할 때 특정 프레임워크에 종속되지 않고, 표준화된 API를 사용할 수 있게 해줍니다.
- CRUD 작업 간소화:
- JPA는 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 단순화하고, 반복적이고 번거로운 작업들을 최소화합니다. 개발자는 객체를 통해 데이터를 다루고, JPA가 해당 객체를 데이터베이스와 동기화합니다.
- 데이터베이스 종속성 감소:
- JPA는 객체와 데이터베이스 간의 매핑을 통해 데이터베이스에 대한 종속성을 줄여줍니다. 이는 데이터베이스의 변경이나 전환 시에도 코드 변경을 최소화하고 유지보수를 용이하게 만듭니다.
- 유연한 검색 기능:
- JPA는 JPQL(Query Language)을 제공하여 객체 지향적인 방식으로 데이터를 검색할 수 있습니다. 이는 객체의 관계를 고려한 쿼리를 작성할 수 있게 해주며, 유연한 검색이 가능합니다.
- 캐싱 및 성능 최적화:
- JPA는 캐싱을 통한 성능 최적화를 지원합니다. 쿼리 결과나 엔터티들을 캐시하여 반복적인 조회 작업에서 성능을 향상시킬 수 있습니다.
- 생명주기 관리:
- JPA는 엔터티의 생명주기를 관리해주어 객체의 상태 변화에 따라 데이터베이스와 일관된 상태를 유지할 수 있습니다.
- 편리한 관계 매핑:
- JPA는 다양한 종류의 관계를 편리하게 매핑할 수 있는 기능을 제공합니다. 일대일, 일대다, 다대일, 다대다와 같은 관계를 객체지향적으로 표현할 수 있습니다.
JPA의 단점
- 성능 오버헤드:
- JPA는 객체와 데이터베이스 간의 매핑을 제공하기 위해 많은 기능을 포함하고 있어서, 간단한 쿼리를 실행하는 데 있어서도 ORM 프레임워크의 성능 오버헤드가 발생할 수 있습니다. 특히, 대규모 시스템이나 성능이 중요한 고부하 환경에서는 성능에 대한 고려가 필요합니다.
- 복잡성:
- JPA는 많은 기능과 설정을 제공하기 때문에 초기 학습 곡선이 상당히 높을 수 있습니다. 또한, 일부 고급 기능을 사용하려면 복잡한 설정과 어노테이션을 사용해야 할 수 있습니다.
- 유연성 부족:
- JPA는 객체와 데이터베이스 간의 매핑을 위한 규칙을 제공하고 있지만, 경우에 따라서는 데이터베이스의 특별한 요구 사항이나 성능 최적화를 위한 특수한 쿼리를 작성하기 어려울 수 있습니다.
- N+1 문제:
- JPA를 사용하면 연관된 엔터티를 가져올 때 N+1 문제가 발생할 수 있습니다. 예를 들어, 하위 엔터티 리스트를 가져올 때 부모 엔터티와 N개의 하위 엔터티를 가져오는 대신, N+1번의 쿼리를 실행하는 상황이 발생할 수 있습니다.
- 복잡한 쿼리 작성:
- 복잡한 쿼리를 작성하기 위해서는 JPA에서 제공하는 JPQL(Query)이나 Criteria API를 사용해야 합니다. 이는 일부 개발자에게는 SQL 쿼리 작성보다 더 어려울 수 있습니다.
- DBMS 특정 기능 활용의 어려움:
- 특정 데이터베이스 관리 시스템 (DBMS)에서 제공하는 고급 기능이나 최적화 기능을 활용하기 어려울 수 있습니다. 특히, JPA는 모든 데이터베이스에 대해 동일한 방식으로 작동하려고 하기 때문에 특정 데이터베이스의 특성을 제대로 활용하지 못할 수 있습니다.
마이바티스는 SQL 매핑을 중심으로 하는 프레임워크로, 직접 SQL을 작성하고 매핑하는 방식으로 동작합니다. 따라서 데이터베이스에 직접 접근하고 SQL을 완벽히 제어하고자 하는 경우에는 마이바티스가 더 적합할 수 있습니다.
JPA는 객체를 이용하면 우리는 테이블에 매핑되는 클래스를 더욱 객체 지향적으로 개발할 수 있다. 그리고 이러한 방향은 객체 지향 언어인 Java에 더욱 잘 맞는다.
기본적인 CRUD 자동화
JPA란? (Java Persistence API)
JAVA의 ORM 기술 표준.
애플리케이션과 JDBC 사이에서 동작함
JDBC 템플릿이나 마이바티스 같은 SQL 매퍼가 등장해서 개발 코드는 많이 줄었지만 개발자가 SQL을 직접 작성해야함.
JPA를 사용하면 SQL조차도 작성할 필요가 없이 JPA가 개발자 대신에 적절한 SQL을 생성하고 데이터베이스에 실행해서 객체를 저장하거나 불러온다. => 자동화됨, 개발 속도 증가
(JPA야 id줄테니까 회원 조회해줘 -> JPA가 알아서 select 생성하고 jdbc Api 사용하고 ResultSet 매핑하고 Entity Object를 만들어서 반환해줌)
ORM(객체 관계 매핑, Object-Relational-Mapping)
객체와 관계형db를 중간에서 매핑해주는 것
jpa의 장점
SQL 중심 개발X 객체 중심 개발 = 단순한 sql 작성으로 시간낭비 하지 않는다. (sql 노가다 안 함) 생산성 증가
CRUD 개발을 할 때 갑자기 새로운 필드를 추가해야 한다면 ? 쿼리문을 다 고쳐야함.
성능
유지보수
- 기존에는 필드 변경시 모든 SQL 수정해야함
- JPA는 필드만 추가하면 됨
패러다임의 불일치 해결
- JPA와 상속 : 데이터베이스 테이블을 슈퍼타입 서브타입 관계로 만들었을 때 jpa를 사용하지 않으면 insert문 2번 작성해야함. jpa 사용하면 알아서 insert 2번 해줌.
- 조회 : jpa가 알아서 조인해서 가져와줌.
- 연관관계, 객체 그래프 탐색
= 계층을 신뢰할 수 있게 됨.
동일한 트랜잭션에서 조회한 엔티티는 같음(==)을 보장.
jpa에서는 같은 것을 여러번 조회할 때 처음은 sql을 실행하고 그 정보를 갖고 있다가 또 같은 것을 조회할 때 sql을 실행하지 않고 갖고 있던 메모리 상의 정보를 줌. 그래서 엔티티를 비교했을 때 같다는 판단을 할 수 있고 sql을 한 번만 실행하기 때문에 약간의 조회 성능 향상됨.
트랜잭션을 지원하는 INSERT 지연
트랜잭션을 커밋할 때까지 INSERT SQL을 모음
JDBC BATCH SQL 기능을 사용해서 한번에 sql 전송
= 네트워크 통신 비용이 줄어들고 성능 향상.
지연 로딩과 즉시 로딩 기능 제공
지연 로딩 : 객체가 실제 사용될 때 로딩
즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회
sql로 join해서 가져올 때 대부분의 상황에서 join된 정보를 사용한다면 jpa의 설정을 즉시로딩으로 변경하고 sql을 한 번에 날려서 성능 향상 가능
객체를 자바 컬렉션에 저장하듯이 db에 저장할 수 있음.
jpa를 사용해야 하는 이유
최근 대한민국 구글 검색량을 비교했을 때 mybatis가 줄어들고 jpa가 ibatis를 넘으며 상승하는 추세
국내 시장에서 jpa 점유율이 마이바티스를 넘을 확률이 높다.
2013년부터 최근의 전세계 구글 검색량을 비교했을 때 jpa가 압도적으로 1위
jpa의 적용 사례
우아한형제들, 쿠팡, 카카오, 네이버 등등에서 사용중
조 단위의 거래금액이 발생하는 서비스들에서 사용, 검즘됨.
최신 스프링 예제는 jpa 기본 적용
=> 자바 개발자에게 jpa는 기본으로 알고 있어야하는 기술이라고 할 수 있다.
'코딩 > JPA' 카테고리의 다른 글
[JPA] 상속관계 매핑 (0) | 2023.12.04 |
---|---|
[JPA] 다양한 연관관계 매핑 (0) | 2023.12.04 |
[JPA] JPA 연관관계 매핑 (0) | 2023.12.02 |
[JPA] JPA의 엔티티 매핑 (0) | 2023.12.02 |
[JPA] JPA 실습 (0) | 2023.12.01 |