JPA란?
ORM의 한종류로
자바에서 객체를 데이터베이스에 저장하고 관리하기 위한 인터페이스와 기능을 제공하는 API
JPA를 사용하면 객체와 관계형 데이터베이스 간의 매핑을 손쉽게 처리할 수 있으며 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 간편하게 수행할 수 있다
- SQL 중심 개발 → 객체 중심 개발
- 테이블을 직접 다루는 방식 → 엔티티 객체를 다루는 방식
JPA 사용이유
자바는 객체를 쓰고 DB는 테이블을 쓰니까 중간에서 계속 변환 작업이 필요하다.
JPA는 이 문제를 줄이기 위해 객체와 테이블을 연결(매핑) 해준다
그래서 개발자는 테이블보다 객체 중심으로 생각하면서 개발할 수 있다
1. 엔티티(Entity)
엔티티는 DB 테이블과 연결되는 자바 클래스다 @Entity를 사용하여 정의할수 있다
@Entity
public class Member {
@Id
private Long id;
private String name;
}
여기서 중요한 점은 이 클래스가 그냥 일반 클래스가 아니라, DB의 테이블 한 행(row)을 자바 객체로 표현한 것이라는 점이다
- 테이블 1개 ↔ 엔티티 클래스 1개
- 테이블의 한 행 ↔ 엔티티 객체 1개
2. 매핑(Mapping)
JPA는 엔티티와 테이블을 연결해준다 자바 필드와 DB 컬럼을 이어주는 작업이 바로 매핑이다
예를 들면
- 클래스명 Member ↔ 테이블명 member
- 필드 name ↔ 컬럼 name
이런 식으로 연결된다.
필요하면 어노테이션으로 자세하게 지정할 수도 있다
@Entity
@Table(name = "member")
public class Member {
@Id
@Column(name = "member_id")
private Long id;
@Column(name = "member_name")
private String name;
}
3. EntityManager
JPA에서 실제로 엔티티를 저장하고 조회하고 수정하고 삭제하는 역할을 하는 것이 EntityManager다
쉽게 말하면 JPA의 핵심 실행 도구다.
예를 들면,
- 저장: persist()
- 조회: find()
- 삭제: remove()
같은 기능을 담당하고 스프링에서는 보통 직접 EntityManager를 많이 다루기보다 Spring Data JPA의 Repository를 많이 사용한다
4. 영속성 컨텍스트(Persistence Context)
이게 JPA에서 제일 중요한 개념 중 하나로 엔티티를 관리하는 메모리 공간이라고 보면 된다
JPA는 엔티티를 그냥 바로 DB에 던지는 것이 아니라,먼저 이 관리 공간 안에서 엔티티 상태를 추적한다
1) 1차 캐시
같은 엔티티를 같은 트랜잭션 안에서 다시 조회하면 DB를 또 조회하지 않고 메모리에서 가져올 수 있다
2) 변경 감지(Dirty Checking)
객체 값을 바꾸면 JPA가 변경된 부분을 감지해서 트랜잭션이 끝날 때 자동으로 UPDATE SQL을 만들어준다
Member member = entityManager.find(Member.class, 1L);
member.setName("김철수");
이 코드에서는 update SQL을 직접 쓰지 않았는데도 JPA가 변경을 감지해서 DB에 반영해준다 이게 JPA의 큰 특징이다
JPA는 객체를 기준으로 동작하기 때문에 기본적인 CRUD는 직접 SQL을 많이 쓰지 않아도 된다.
예를 들어
- 저장
- 단건 조회
- 수정
- 삭제
같은 작업은 메서드 호출로 처리할 수 있다
그래서 반복적인 SQL 작성이 줄어들고 생산성이 올라간다 더 복잡한 조회는 JPQL, QueryDSL, 네이티브 SQL 등을 함께 쓰기도 한다
JPA의 동작 흐름
- 엔티티 클래스를 만든다
- 엔티티를 테이블과 매핑한다
- 객체를 생성한다
- JPA가 객체를 보고 SQL을 만들어 실행한다
- 조회 결과도 다시 객체로 만들어준다
따라서 개발자는 객체를 다루고 JPA가 중간에서 SQL과 DB 처리를 맡는 구조다
JPA와 MyBatis의 차이
MyBatis
- SQL을 직접 작성한다
- SQL 제어가 세밀하다
- 자바와 SQL을 분리해서 관리한다
JPA
- 객체 중심으로 개발한다
- 기본 CRUD SQL을 자동 생성해준다
- 엔티티 상태를 관리해준다
따라서
- SQL을 직접 제어하고 싶다 → MyBatis
- 객체 중심으로 생산성 있게 개발하고 싶다 → JPA
이렇게 생각하면 이해하기 쉽다
JPA의 장점
- 생산성이 높다 -> 기본 CRUD SQL을 직접 많이 안 써도 된다.
- 객체 중심 개발이 가능하다 -> 테이블보다 객체를 기준으로 생각할 수 있다.
- 유지보수가 편하다-> 테이블 구조가 조금 바뀌어도 SQL을 전부 수정하는 부담이 줄 수 있다.
- 변경 감지가 편하다 ->객체 값만 바꿔도 자동 반영되는 구조를 만들 수 있다
JPA의 단점
- 학습 난이도가 있다 -> 처음엔 영속성 컨텍스트, 지연 로딩, 연관관계 매핑 같은 개념이 어렵다
- 복잡한 쿼리는 오히려 어렵게 느껴질 수 있다 -> 단순 CRUD는 편하지만, 복잡한 조회는 JPQL이나 QueryDSL을 따로 익혀야 한다
- 내부 동작을 모르면 성능 문제를 만들 수 있다-> 예를 들어 N+1 문제 같은 것이 생길 수 있다
정리
JPA는 무조건 쉬운 기술이라기보다 잘 쓰면 강력하지만, 개념 이해가 꼭 필요한 기술이다
'🐢 꼬부기 LV.1 | 개념•기초 > 💧물대포(핵심개념)' 카테고리의 다른 글
| 파이썬 설치후 VS 코드에서 기본문법익히기 (0) | 2026.03.12 |
|---|---|
| [회고]면접 질문 복기 와 반성 (0) | 2026.03.11 |
| DB NULL 처리 문제와 Wrapper 타입 적용 경험 (0) | 2026.03.09 |
| BCrypt 개념과 구조 (0) | 2026.03.08 |
| AJAX와 fatch (0) | 2026.03.07 |