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 직접 등록 | 자동 설정됨 |
초기 설정 복잡도 | 복잡함 (수동 설정 필요) | 매우 간편 (자동 설정) |
'JPA' 카테고리의 다른 글
실전! 스프링 데이터 JPA 강의 정리 (0) | 2025.02.12 |
---|---|
실전! 스프링 부트와 JPA 활용1 강의 정리 (0) | 2025.02.05 |
[에러정리] TransientObjectException : save the transient instance before flushing 에러 (0) | 2025.02.04 |
JPA 양방향 연관관계의 주인 (0) | 2025.02.01 |