JPA(Java Persistence API)
JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와의 상호작용을 단순하고 직관적으로 만들어주는 ORM 기술입니다. 복잡한 SQL을 직접 작성하지 않아도 객체 중심의 프로그래밍을 통해 데이터베이스를 다룰 수 있게 해주며, 유지보수성과 생산성을 높여줍니다. 이 글에서는 JPA의 기본 개념부터 핵심 동작 원리, 주요 어노테이션, 실전 예제까지 한 번에 정리해보겠습니다.
1. JPA란 무엇인가?
JPA(Java Persistence API)는 Java 애플리케이션에서 관계형 데이터베이스를 객체 지향적으로 다룰 수 있도록 도와주는 표준 API입니다. 즉, 복잡한 SQL문 없이도 객체를 DB 테이블에 매핑하고, 저장하고, 조회할 수 있게 해줍니다.
JPA는 스펙(표준 인터페이스)에 불과하기 때문에 실제 구현체가 필요합니다. 대표적인 구현체는 다음과 같습니다:
- Hibernate : 가장 널리 쓰이는 JPA 구현체
- EclipseLink, OpenJPA 등도 존재
Spring 환경에서는 Spring Data JPA를 통해 JPA를 훨씬 간편하게 사용할 수 있습니다.
JPA의 핵심 역할
- 자바 객체를 DB 테이블과 매핑
- CRUD 로직 자동화
- 트랜잭션 및 캐시 관리
- SQL 자동 생성 및 실행
왜 JPA를 사용하는가?
전통적인 JDBC를 사용할 때는 다음과 같은 코드가 반복됩니다.
Connection conn = DriverManager.getConnection(...);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM member WHERE id = ?");
ps.setLong(1, id);
ResultSet rs = ps.executeQuery();
// 결과 파싱...
반면 JPA를 사용하면 아래처럼 간단하게 객체로 데이터를 다룰 수 있습니다.
Member member = entityManager.find(Member.class, id);
JPA의 주요 장점
- 객체 지향적인 개발이 가능
- SQL 작성 최소화
- 생산성 증가
- 유지보수 용이
- 캐시 및 지연 로딩 등 고급 기능
2. JPA의 기본 구성 요소와 핵심 개념
기본 구성 요소
구성 요소 | 설명 |
Entity | DB 테이블에 대응하는 자바 클래스 |
EntityManager | JPA의 핵심 인터페이스로, 객체를 DB와 연동 |
Persistence Unit | 영속성 설정 정보 (persistence.xml 또는 application.yml) |
Repository | 데이터 접근 계층 (Spring Data JPA 사용 시 자동화됨) |
핵심 개념
a. Entity
데이터베이스 테이블에 매핑되는 클래스입니다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
}
b. EntityManager
엔티티를 저장하거나 조회할 때 사용하는 핵심 객체입니다.
entityManager.persist(member); // 저장
entityManager.find(Member.class, id); // 조회
c. JPQL (Java Persistence Query Language)
SQL이 아닌, 객체를 대상으로 쿼리하는 언어입니다.
String jpql = "SELECT m FROM Member m WHERE m.age > 20";
List<Member> members = entityManager.createQuery(jpql, Member.class).getResultList();
d. 영속성 컨텍스트 (Persistence Context)
JPA는 엔티티를 1차 캐시에 저장하고, 같은 트랜잭션 내에서는 동일한 엔티티를 반환합니다. 이를 통해 성능 최적화와 변경 감지가 가능합니다.
3. 간단한 예제 : 엔티티 매핑과 저장
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
// getters, setters
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myUnit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Member member = new Member();
member.setId(1L);
member.setName("홍길동");
em.persist(member);
em.getTransaction().commit();
@Entity를 통해 Member 클래스는 DB의 테이블과 연결됩니다.
EntityManager를 통해 트랜잭션을 시작하고, persist로 데이터를 저장합니다.
Spring Data JPA와의 연결
Spring에서는 더 편하게 JPA를 사용할 수 있게 Spring Data JPA를 제공합니다. Repository 인터페이스만 정의하면 기본적인 CRUD는 자동 구현됩니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name);
}
4. JPA의 생명주기(Lifecycle)
- 비영속 상태 (new) : DB와 전혀 연결되지 않은 상태
- 영속 상태 (managed) : persist 후 DB와 연결된 상태
- 준영속 상태 (detached) : detach() 또는 트랜잭션 종료 후
- 삭제 상태 (removed) : remove() 호출된 상태
이 생명주기를 이해하면, 변경 감지(dirty checking)나 캐시 처리 전략을 더욱 효과적으로 활용할 수 있습니다.
5. 주요 어노테이션 정리
어노테이션 | 설명 |
@Entity | 클래스가 엔티티임을 명시 |
@Id | 기본 키 설정 |
@GeneratedValue | 자동 생성 전략 지정 |
@Column | 컬럼 세부 설정 |
@Table | 테이블 이름 및 속성 설정 |
@OneToMany, @ManyToOne | 관계 매핑 |
6. JPA를 사용할 때 주의할 점
- 지연 로딩(LAZY)과 즉시 로딩(EAGER) 전략을 명확히 이해할 것
- N+1 문제 : 연관관계에서 쿼리 수가 급증하는 이슈
- 트랜잭션 범위 : JPA의 모든 데이터 변경은 트랜잭션 안에서 처리해야 함
- 엔티티의 equals/hashCode 구현 주의
7. 마무리
JPA는 자바 애플리케이션에서 데이터베이스를 효율적으로 다루는 강력한 도구입니다. 단순히 CRUD만 처리하는 수준을 넘어서, 객체 지향 설계와 관계형 DB의 통합을 자연스럽게 이뤄줍니다.
함께 보면 좋은 자료
블로그 글 :
[ORM] 객체와 데이터베이스의 간극을 메우는 기술
ORM(Object-Relational Mapping)백엔드 개발을 하다 보면 객체 지향 언어와 관계형 데이터베이스(RDB) 사이의 언어 장벽을 실감하게 됩니다. 하나는 객체 기반이고, 다른 하나는 테이블 기반이기 때문이죠
dachaes-devlogs.tistory.com
[JPA의 관계 매핑] 객체 간 관계를 데이터베이스에 자연스럽게 표현하는 법
JPA의 관계 매핑JPA는 객체 간의 연관 관계(association)를 데이터베이스의 외래 키 관계로 변환해주는 기능을 제공합니다. 객체지향에서는 필드 참조로 관계를 표현하고, 데이터베이스에서는 외래
dachaes-devlogs.tistory.com
[JPA 생명 주기] Cascade와 OrphanRemoval 완전 이해하기
Cascade와 OrphanRemovalJPA를 사용하다 보면, 연관된 엔티티도 함께 저장하거나 삭제하고 싶을 때가 많습니다.예를 들어, 게시글(Post)을 저장하면서 댓글(Comment)도 함께 저장하려면 어떻게 해야 할까
dachaes-devlogs.tistory.com
'프레임워크와 라이브러리 > JPA' 카테고리의 다른 글
[JPA 생명 주기] Cascade와 OrphanRemoval 완전 이해하기 (0) | 2025.04.11 |
---|---|
[JPA 관계 매핑] 객체 간 관계를 데이터베이스에 자연스럽게 표현하는 법 (0) | 2025.04.11 |