티스토리 뷰
JPA는 자바 진영의 ORM 기술 표준이다. JPA는 밑에 그림처럼 애플리케이션과 JDBC 사이에서 동작한다.
ORM 이란?
그렇다면 ORM이란 무엇일까? ORM은 Object - Relational Mapping의 앞글자를 따온 이름으로 객체의 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임 워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다. 예를 들어 객체를 데이터베이스에 INSERT SQL을 직접 장성하는 것이 아닌 객체를 마치 자바 Collection에 저장하듯이 ORM 프레임 워크에 저장하면 된다.
JPA를 사용해서 객체를 저장하는 코드는 다음과 같다.
jpa.persist(member); // 저장
조회할 때도 JPA를 통해 객체를 직접 조회하면 된다.
JPA를 사용해서 객체를 조회하는 코드는 다음과 같다.
Member member = jpa.find(memberId); // 조회
ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달해주는 것만이 아닌 이러한 패러다임의 불일치도 해결해준다는 것을 우린 알아야한다.
ORM 프레임워크는 다양한 객체 지향 언어에 존재하는데 자바 진영에는 하이버네이트가 대표적이다. 하이버네이트는 대부분의 패러다임 불일치를 해결해주는 ORM 프레임워크다.
JPA(Java Persistence API)
하이버네이트라는 오픈소스 ORM 프레임워크가 등장하면서 가볍고 실용적인 기존 자바 엔터프라이즈 자바 빈즈라는 기술보다 더욱 획기적인 기술이 나오면서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준이 만들어진 것이 JPA이다.
그림을 보자 JPA는 자바 ORM 기술에 대한 API 표준 명세이다. JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 한다. 현재 JPA 2.1을 구현한 ORM 프레임워크는 하이버네이트가 가장 대중적이다.
Why JPA?
그렇다면 JPA를 왜 사용하는 지 살펴보자.
생산성
JPA를 사용하면 다음 코드처럼 자바 컬렉션에 자바를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다. INSERT SQL을 작성하고 JDBC API를 사용하는 지루하고 반복적인 일은 JPA가 대신 처리해준다.
jpa.persist(member) // 저장
Member member = jpa.find(memberId); // 조회
JPA를 사용하면 데이터 베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전 시킬 수 있다.
유지 보수
SQL에 의존적인 개발은 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 했다. 반면에 JPA를 사용하면 이런 과정으 JPA가 대신 처리해주므로 필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다. 따라서 개발자가 작성해야 했던 SQL과 JDBC API 코드를 JPA가 대신 처리해주므로 유지 보수해야 하는 코드 수가 줄어든다.
패러다임 불일치 해결
지금까지 패러다임의 불일치 문제가 얼마나 심각한지 다루었고, JPA를 통한 해결책도 간단히 보았다. JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치를 해결해준다.
성능
JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다. JPA는 애플리케이션과 데이터베이스 사이에서 동작한다. 이렇게 애플리케이션과 데이터베이스 사이에 계층이 하나 더 있으면 최적화 관점에서 시도해 볼 수 있는 것들이 많다. 다음 코드를 보자
String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
회원을 두 번 조회하는 코드의 일부를 보면 직접 작성하면 DB와 두 번 통신 SQL문을 많이 작성해야 했지만 그런 것들이 줄어들고 조회한 회원 객체를 재 사용하여 성능 상으로도 우위에 있다.
'Spring Framwork & JPA > JPA' 카테고리의 다른 글
JPA 연관관계에 대한 생각 (4) | 2022.07.26 |
---|---|
프로젝트 JPA 성능 개선기(2) - 불필요한 Join 삭제 (0) | 2022.06.04 |
프로젝트 JPA 성능 개선기 (1) - 로그인 시 성능을 올려보자~! (1) | 2022.06.04 |
JPA에서 발생하는 생성, 수정, 삭제 시간을 추적해보자 (2) | 2022.05.14 |
JPA에 시작 (0) | 2021.10.10 |
- Total
- Today
- Yesterday
- CS
- Kotlin
- 프로그래밍
- 백엔드
- 동시성
- IT
- 취준
- 취업준비
- 취업
- 자바
- 프로젝트
- JPA
- java
- 면접준비
- DevOps
- Redis
- 면접
- DB
- 개발
- docker
- 인터뷰
- MySQL
- 게시판
- thread
- 코드
- 코딩
- Spring
- 개발자
- swarm
- 면접 준비
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |