🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

JPA

서화 2026. 3. 10. 23:31

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의 동작 흐름

  1. 엔티티 클래스를 만든다
  2. 엔티티를 테이블과 매핑한다
  3. 객체를 생성한다
  4. JPA가 객체를 보고 SQL을 만들어 실행한다
  5. 조회 결과도 다시 객체로 만들어준다

따라서 개발자는 객체를 다루고 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는 무조건 쉬운 기술이라기보다 잘 쓰면 강력하지만, 개념 이해가 꼭 필요한 기술이다