JPA를 학습했었지만 많은 내용을 까먹은 상태에서 다시 공부하게 되면서 글을 작성했고, JPA를 사용하기 위한 전체적인 윤곽과 목차를 재시할 수 있는 글을 작성하고 싶었다. 


글의 주요 내용은
JPA의 사용법을 배우기 앞서 일단 JPA란 무엇이고 왜 사용하는지 그리고 주요 기능들과 함께 사용하는 기능들에 대해서 가볍게 정리함으로써 
이 글을 읽는 사람들에게 어떤걸 자세히 학습할지 어떤게 중요한지에 대해서 알려주는 글을 작성하고 싶어서 글을 작성했다.


JPA란 ?

= Java Persistence API
주요 기능 : DB와 자바 객체를 매핑해주기 위해 사용 (단 인터페이스 모음 여러 다양한 구현체 존재 ex 하이버네이트)
JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

 

 

ORM란?

= Object Relational Mapping

객체-관계 매핑의 줄임말이다.

객체지향 프로그래밍의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑하는 기술.

JPA는 ORM 기술의 표준 인터페이스이며, ORM을 구현하는 방식 중 하나입니다.

 

JPA 장단점

장점 단점 
DB에 종속적이지 않음 러닝 커브가 높음
객체지향적인 개발 가능 성능 최적화 필요
자동화된 CRUD 기능 제공 초기 설정 복잡
변경 감지를 통한 효율적인 SQL 실행 N+1 문제 발생 가능
1차, 2차 캐싱으로 성능 최적화 트랜잭션 범위 내에서 동작해야 함
코드 변경 최소화 대용량 데이터 처리 어려움

 

 

 

핵심 기술

 

  • 엔티티(Entity) 매핑
    • JPA는 객체와 데이터베이스 테이블을 매핑하는 기능을 제공한다.
    • @Entity, @Table, @Column, @Id 등의 애너테이션을 사용해 매핑할 수 있다.
    • 객체 모델과 관계형 데이터베이스 모델을 일관성 있게 유지하는 것이 가능하다.
  • 영속성 컨텍스트(Persistence Context)
    • JPA에서 엔티티 객체를 관리하는 핵심 개념이다.
    • EntityManager를 통해 엔티티를 persist, merge, remove, detach 등의 상태로 관리할 수 있다.
    • 1차 캐시, 변경 감지(Dirty Checking), 지연 로딩(Lazy Loading) 등의 기능이 영속성 컨텍스트를 기반으로 동작한다.
  • JPQL(Java Persistence Query Language)
    • JPA에서 제공하는 객체지향 쿼리 언어로, SQL과 유사하지만 엔티티 객체를 대상으로 쿼리를 실행한다.
    • SELECT e FROM Employee e WHERE e.salary > 50000 같은 형태로 작성 가능하다.
    • SQL과 다르게 테이블이 아닌 객체를 대상으로 조회하며, 데이터베이스 독립적인 쿼리를 작성할 수 있다.
    • 문자열로 인식하기 때문에 컴파일시 오류 체크 불가  > QueryDSL사용
  • 트랜잭션 관리(Transaction Management)
    • JPA는 데이터베이스 트랜잭션을 자동으로 관리할 수 있으며, @Transactional 애너테이션을 활용해 트랜잭션 범위를 설정할 수 있다.
    • 영속성 컨텍스트와 연동되어 트랜잭션이 커밋될 때 변경된 엔티티가 자동 반영(Flush)된다.
  • 프록시와 지연 로딩(Lazy Loading)
    • JPA는 연관 관계를 가지는 엔티티를 불러올 때 LAZY(지연 로딩)와 EAGER(즉시 로딩)를 설정할 수 있다.
    • FetchType.LAZY를 사용하면 실제로 객체가 필요할 때 데이터베이스에서 조회해 가져오는 방식으로 성능 최적화가 가능하다.
    • Hibernate를 사용할 경우 프록시 객체를 활용해 지연 로딩을 수행할 수 있다.
  • 영속성 전이(Cascade)와 고아 객체(Orphan Removal)
    • CascadeType.ALL, CascadeType.PERSIST, CascadeType.REMOVE 등의 옵션을 사용하면 부모 엔티티의 상태 변화가 자식 엔티티에도 적용될 수 있다.
    • orphanRemoval = true 설정을 통해 부모 엔티티와 연관이 끊어진 자식 엔티티를 자동으로 삭제할 수도 있다.
  • 컬렉션 매핑과 Embeddable 타입
    • JPA는 @ElementCollection을 이용해 기본 값 타입 컬렉션을 매핑할 수 있다.
    • @Embeddable을 사용하면 특정 값 타입을 재사용할 수 있어 코드의 가독성을 높일 수 있다.

 

 

JPA랑 같이 사용하는 기술들 

1. Spring Data JPA

  • JPA를 더욱 편리하게 사용할 수 있도록 도와주는 Spring 기반 프레임워크.
  • JPA의 EntityManager를 직접 사용하지 않아도 Repository 인터페이스만으로 데이터 처리 가능.
  • 반복적인 CRUD 코드 작성을 줄이고, 메서드 네이밍 기반 쿼리 생성 기능을 제공 (간편한 CRUD기능 제공 ).
  • 주요 기능:
    • JpaRepository<T, ID> 인터페이스를 통한 기본 CRUD 기능 제공.
    • @Query 애너테이션을 이용한 JPQL 지원.
    • 페이징 및 정렬(Pageable, Sort) 기능 내장.

🔹 예제 코드 (Spring Data JPA 기본 사용법)

public interface UserRepository extends JpaRepository<User, Long> 
{ List<User> findByUsername(String username); // 네이밍 기반 쿼리 생성 }

 

2. QueryDSL

  • JPA의 JPQL을 타입에 안전한 방식으로 작성할 수 있도록 도와주는 라이브러리. (JPQL을 코드기반으로 작성하는 느낌.)
  • 동적 쿼리(Dynamic Query)를 편리하게 작성할 수 있음.
  • 코드 기반 쿼리이므로, 컴파일 타임에 오류를 잡을 수 있어 안정성이 높음.
  • JPQL보다 가독성이 좋고 유지보수하기 쉬움.

🔹 예제 코드 (QueryDSL 기본 사용법)

public List<User> findUsersByAge(int age)
{ QUser user = QUser.user; // Q도메인 객체 사용 
return queryFactory .selectFrom(user) .where(user.age.gt(age)) // age가 특정 값보다 큰 사용자 조회 
.fetch(); }

 

📌 Spring vs Spring Boot JPA 설정 비교

추후에 JPA사용시 자세한건 찾아서 설정하되 차이가 존재한다는걸 기억하자. 

  Spring Spring Boot
설정 방식 persistence.xml 또는 Java Config 필요 application.properties만 설정하면 자동 구성
DataSource 설정 직접 DataSource Bean 등록 필요 자동 설정 (설정 파일에서 정보만 입력)
EntityManagerFactory LocalContainerEntityManagerFactoryBean 사용 자동 설정됨
TransactionManager JpaTransactionManager 직접 등록 자동 설정됨
초기 설정 복잡도 복잡함 (수동 설정 필요) 매우 간편 (자동 설정)

+ Recent posts