JPA 설명
ORM(Object-Relational Mapping)
- OOP(Object-Oriented Programming)의 객체와 RDB(Relational DataBase)의 데이터를 간의 데이터를 변환하는 기술
JPA(Java Persistence API)
- Java의 ORM을 위한 표준 인터페이스
- 코드를 변경하지 않고 JPA를 구현한 다양한 ORM 프레임워크 간 전환을 쉽게 할 수 있다
- 인터페이스와 규약만 제공하며, 자체적으로 동작하지는 않는다
- 구현체가 필요하다(Hibernate, EclipseLink, OpenJPA 등)
Hibernate
- Java의 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
- JPA를 구현한다
Spring Data JPA
설명
- Spring Data JPA는 ORM 프레임워크가 아니다
- Hibernate같은 JPA 구현체 위에서 동작하며, JPA를 더 쉽게 사용할 수 있도록 추상화한 라이브러리
JPA, Hibernate와 차이점
- Entity 저장
- JPA, Hibernate
- EntityManager나 Session 객체를 이용하여 저장
- Transaction 객체로 트랜잭션 관리
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.save(entity); tx.commit(); session.close();
- Spring Data JPA
- save() 메소드로 동일한 작업 수행
userRepository.save(entity);
- save() 메소드로 동일한 작업 수행
- JPA, Hibernate
- 쿼리
- JPA, Hibernate
- JPQL, HQL 등 쿼리를 명시적으로 작성해야 함
- Spring Data JPA에 비해 더 많은 코드와 설정 필요
- Spring Data JPA
- 쿼리를 명시적으로 작성하지 않더라도 인터페이스만 정의하면 메소드 이름을 통해 SQL 자동 생성 가능
- @Query로 JPQL 간편하게 사용 가능
public interface UserRepository extends JpaRepository<User, Long> List<User> findByName(String name); Query("SELECT u FROM User u WHERE u.status = :status") List<User> findByStatus(@Param("status") String status); }
- JPA, Hibernate
JPA를 사용하는 이유
기존 JDBC, MyBatis 방식의 단점
- DB 테이블에 맞춰서 일일히 웹 애플리케이션에 SQL을 작성해야 함
- DB에 컬럼이 추가되거나 삭제되면 모든 SQL을 찾아서 수정해야 함(실수 발생 가능)
- DB에 따라서 SQL 문법이 조금씩 다르기 때문에 DB를 변경하는 경우 큰 마이그레이션 비용 발생
JPA의 장점
- JPA는 SQL을 자동으로 생성해주기 때문에 기존 방식의 문제를 대부분 해결할 수 있음
- 생산성 향상
- 유지보수 용이
- JPA가 생성하는 SQL은 DB(dialect)를 설정해주면 자동으로 바뀌기 때문에 마이그레이션 비용 감소
- 성능 향상
성능 최적화
1차 캐시
- 한 트랜잭션 내에서 DB 조회 시 1차 캐시에 저장
- 동일한 ID를 조회하는 경우, DB와 통신하지 않고 1차 캐시에서 반환
쓰기 지연
- 한 트랜잭션 내에서 UPDATE, DELETE 쿼리로 인한 로우 락 시간 최소화
- JPA 커밋 직전까지 DB에 SQL을 보내지 않고 메모리에 모아놓다가 커밋하는 순간 DB에 보내서 실행
지연 로딩(Lazy)과 즉시 로딩(Eager)
- 지연 로딩
- 객체를 사용하는 시점에 DB에 SQL 보내서 조회
- Ex. Entity의 ID를 제외한 필드를 getter 등으로 불러오는 시점
- 실제로 사용하지 않을, 연관 테이블의 모든 데이터를 메모리에 들고 있지 않기 위함
- 객체를 사용하는 시점에 DB에 SQL 보내서 조회
- 즉시 로딩
- 객체를 사용하지 않더라도 항상 조회
'JPA' 카테고리의 다른 글
[JPA 6] 연관관계 - @ManyToOne (0) | 2022.03.10 |
---|---|
[JPA 5] 영속성 컨텍스트 (0) | 2022.02.22 |
[JPA 4] JPA 기본 사용법 (0) | 2022.02.22 |
[JPA 3] JPA Entity (0) | 2022.02.22 |
[JPA 2] JPA 설정 (0) | 2022.02.22 |