JPA는 무엇이며 왜 사용할까?
기존 SQL 중심적인 개발의 문제점
--
일반적으로 애플리케이션 개발할 때
객체 지향 언어 + 관계형 DB를 사용하여 개발한다.
그래서 객체를 관계형DB에 저장(보관)을 해야 하는데
이때 쿼리를 반복적으로 많이 작성해야 하는 상황이 생긴다.
(ex. 회원 객체 하나를 관계형 DB에 저장, 조회, 수정 등을 하기 위해서 수많은 SQL문을 사용)
이것이 바로 SQL 중심적인 개발의 문제점이다.
= 무한 반복 코드 작성
+ 도중에 필드, 속성 하나를 추가하기 위해 관련된 모든 곳에도 수정
하지만 관계형 DB를 사용해야 하며, 관계형 DB와 통신하기 위해 결국 SQL을 사용
즉, SQL에 의존적인 개발을 피하기는 어렵다.
--
객체를 관계형 DB에 저장하는 과정
--

위 과정처럼
객체를 가지고 INSERT에 대한 SQL문들을 작성하고,
만약 수정할 상황이 생기면 다시 SQL문을 만들고,
이렇게 작성된 것을 RDB에 적용하고 등
이러한 과정을 모두 개발자가 수행해야 한다.
하지만 JPA를 사용하면 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있다.
--
JPA (Java Persistence API)
--
JPA는
자바에서 사용하는 ORM 기술 표준이다.
ORM (Object-relational mapping)은
객체 관계를 매핑하여 객체와 관계형 DB를 매핑해 주는 프레임워크다.
즉, 객체는 객체 대로 설계하고, RDB는 RDB대로 설계한 다음
ORM 프레임워크가 중간에서 자동으로 매핑해 준다.

JPA를 사용하기 이전에는 개발자가 직접 JDBC API를 통해 자바와 DB를 연결해서 사용했지만
JPA를 사용하면 JPA가 대신 JDBC API를 사용하여 알아서 연결 후 사용한다.
JDBC (Java Database Connectivity)는
자바에서 데이터베이스와 연결할 수 있도록 제공하는 API로
자바 프로그램이 DB에 SQL을 실행하고 결과를 가져올 수 있도록 도와주는 역할을 한다.
즉, 개발자가 직접 SQL문을 작성하지 않고
JPA에게 어떠한 객체의 데이터 조회, 저장, 수정 등 명령을 하기만 하면
JPA가 알아서 해당 객체(엔티티)를 분석 후 명령에 알맞은 SQL문을 생성하고,
만약 매핑이 필요하면 매핑도 해주는 JDBC API를 사용해서 DB까지 전달해 준다.
(반대로 반환을 할 때도 엔티티를 만들어서 반환해 준다.)
가장 중요한 패러다임의 불일치도 해결해 준다.
즉, OOP와 RDB의 차이점에서 오는 문제점을 해결 (상속, 연관관계 등)
JPA를 사용하는 장점
- SQL 중심적인 개발에서 객체 중심적인 개발을 수행할 수 있다.
(= JPA가 SQL관련된 역할을 대신 수행) - 생산성이 좋아진다.
(= SQL문 대신 특정 명령어(findById 등)를 통해 간단하게 구현 가능) - 유지보수가 좋아진다.
(= 기존에는 필드 변경 시 관련된 모든 SQL을 수정해야 했지만 이 또한 JPQ가 알아서 SQL로 해결) - 패러다임의 불일치 해결
(= OOP와 RDB의 차이점에서 오는 문제(상속, 연관관계, 객체 그래프 탐색 등)를 해결) - 성능 최적화
- 데이터 접근 추상화 & 벤더 독립성
성능 최적화 이유
1. 캐시 사용
같은 트랜잭션 안에서는 같은 엔티티를 반환하는 것으로
Member 데이터를 처음 가져올 때에는 SQL문으로 가져오고 이를 JPA 메모리에 보관한다.
그다음부터는 같은 데이터를 가져올 때 JPA 메모리에 있는 것을 바로 가져온다.
2. 트랜잭션을 지원하는 쓰기 지연
트랜잭션을 커밋할 때까지 SQL들을 버퍼에 모아두고 마지막에 커밋하는 순간에 모든 SQL을 전송
즉, 계속 DB와 왔다 갔다 하지 않고 한 번에 작업을 수행한다.
3. 지연 로딩, 즉시 로딩 지원
만약 Member와 Team이 매핑되어 있다면
Member를 조회할 때 Team도 같이 조회가 된다. (= 즉시 로딩)
이때 지연 로딩을 사용하면 Member만 조회할 수 있으며 나중에 Team이 필요하면 그때 같이 조회를 할 수 있다.
--
참고 및 출처
'JPA' 카테고리의 다른 글
상속관계 매핑 (+@MappedSuperclass) (1) | 2025.04.01 |
---|---|
연관관계 매핑 (단방향, 양방향, 1:1, 1:N, N:1, N:N) (0) | 2025.03.31 |
엔티티(Entity) 매핑 (= 객체와 DB 테이블 연결) (0) | 2025.03.30 |
영속성 관리 (내부 동작 방식) (0) | 2025.03.29 |
JPA 설정하기 (Spring boot 기준) (0) | 2025.03.25 |
JPA는 무엇이며 왜 사용할까?
기존 SQL 중심적인 개발의 문제점
--
일반적으로 애플리케이션 개발할 때
객체 지향 언어 + 관계형 DB를 사용하여 개발한다.
그래서 객체를 관계형DB에 저장(보관)을 해야 하는데
이때 쿼리를 반복적으로 많이 작성해야 하는 상황이 생긴다.
(ex. 회원 객체 하나를 관계형 DB에 저장, 조회, 수정 등을 하기 위해서 수많은 SQL문을 사용)
이것이 바로 SQL 중심적인 개발의 문제점이다.
= 무한 반복 코드 작성
+ 도중에 필드, 속성 하나를 추가하기 위해 관련된 모든 곳에도 수정
하지만 관계형 DB를 사용해야 하며, 관계형 DB와 통신하기 위해 결국 SQL을 사용
즉, SQL에 의존적인 개발을 피하기는 어렵다.
--
객체를 관계형 DB에 저장하는 과정
--

위 과정처럼
객체를 가지고 INSERT에 대한 SQL문들을 작성하고,
만약 수정할 상황이 생기면 다시 SQL문을 만들고,
이렇게 작성된 것을 RDB에 적용하고 등
이러한 과정을 모두 개발자가 수행해야 한다.
하지만 JPA를 사용하면 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있다.
--
JPA (Java Persistence API)
--
JPA는
자바에서 사용하는 ORM 기술 표준이다.
ORM (Object-relational mapping)은
객체 관계를 매핑하여 객체와 관계형 DB를 매핑해 주는 프레임워크다.
즉, 객체는 객체 대로 설계하고, RDB는 RDB대로 설계한 다음
ORM 프레임워크가 중간에서 자동으로 매핑해 준다.

JPA를 사용하기 이전에는 개발자가 직접 JDBC API를 통해 자바와 DB를 연결해서 사용했지만
JPA를 사용하면 JPA가 대신 JDBC API를 사용하여 알아서 연결 후 사용한다.
JDBC (Java Database Connectivity)는
자바에서 데이터베이스와 연결할 수 있도록 제공하는 API로
자바 프로그램이 DB에 SQL을 실행하고 결과를 가져올 수 있도록 도와주는 역할을 한다.
즉, 개발자가 직접 SQL문을 작성하지 않고
JPA에게 어떠한 객체의 데이터 조회, 저장, 수정 등 명령을 하기만 하면
JPA가 알아서 해당 객체(엔티티)를 분석 후 명령에 알맞은 SQL문을 생성하고,
만약 매핑이 필요하면 매핑도 해주는 JDBC API를 사용해서 DB까지 전달해 준다.
(반대로 반환을 할 때도 엔티티를 만들어서 반환해 준다.)
가장 중요한 패러다임의 불일치도 해결해 준다.
즉, OOP와 RDB의 차이점에서 오는 문제점을 해결 (상속, 연관관계 등)
JPA를 사용하는 장점
- SQL 중심적인 개발에서 객체 중심적인 개발을 수행할 수 있다.
(= JPA가 SQL관련된 역할을 대신 수행) - 생산성이 좋아진다.
(= SQL문 대신 특정 명령어(findById 등)를 통해 간단하게 구현 가능) - 유지보수가 좋아진다.
(= 기존에는 필드 변경 시 관련된 모든 SQL을 수정해야 했지만 이 또한 JPQ가 알아서 SQL로 해결) - 패러다임의 불일치 해결
(= OOP와 RDB의 차이점에서 오는 문제(상속, 연관관계, 객체 그래프 탐색 등)를 해결) - 성능 최적화
- 데이터 접근 추상화 & 벤더 독립성
성능 최적화 이유
1. 캐시 사용
같은 트랜잭션 안에서는 같은 엔티티를 반환하는 것으로
Member 데이터를 처음 가져올 때에는 SQL문으로 가져오고 이를 JPA 메모리에 보관한다.
그다음부터는 같은 데이터를 가져올 때 JPA 메모리에 있는 것을 바로 가져온다.
2. 트랜잭션을 지원하는 쓰기 지연
트랜잭션을 커밋할 때까지 SQL들을 버퍼에 모아두고 마지막에 커밋하는 순간에 모든 SQL을 전송
즉, 계속 DB와 왔다 갔다 하지 않고 한 번에 작업을 수행한다.
3. 지연 로딩, 즉시 로딩 지원
만약 Member와 Team이 매핑되어 있다면
Member를 조회할 때 Team도 같이 조회가 된다. (= 즉시 로딩)
이때 지연 로딩을 사용하면 Member만 조회할 수 있으며 나중에 Team이 필요하면 그때 같이 조회를 할 수 있다.
--
참고 및 출처
'JPA' 카테고리의 다른 글
상속관계 매핑 (+@MappedSuperclass) (1) | 2025.04.01 |
---|---|
연관관계 매핑 (단방향, 양방향, 1:1, 1:N, N:1, N:N) (0) | 2025.03.31 |
엔티티(Entity) 매핑 (= 객체와 DB 테이블 연결) (0) | 2025.03.30 |
영속성 관리 (내부 동작 방식) (0) | 2025.03.29 |
JPA 설정하기 (Spring boot 기준) (0) | 2025.03.25 |