JPA란 무엇인가?
- JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준입니다. 애플리케이션과 JDBC 사이에서 동작합니다.
ORM이란 무엇인가?
- Object-Relational Mapping 이름 그대로 객체와 관계형 데이터 베이스 매핑한다는 뜻.
- ORM 프레임워크는 객체와 테이들블 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결합니다.
- ex) 개발자가 insert SQL문을 직접 작성하는 것이 아니라, 객체르 자바 컬렉션에 저장하듯 ORM 프레임워크에 저장하면 됨. -> ORM 프레임워크가 자동 매핑.
- 자바 진영의 대표적인 ORM 프레임 워크 : Hibernate
JPA를 사용하는 하는 이유
- 생산성
- 지루하고 반복적인 CRUD용 SQL을 개발자가 직접 작성하지 않아도 됩니다.
- Create Table 같은 DDL 문을 자동으로 생성해주는 기능 있습니다.
- 유지보수
- SQL 직접 다루면 엔티티에 필드 하나 추가만 해도 관련된 JDBC API 수정해야 합니다. But JPA 사용하면 JPA가 대신 처리 가능합니다. => 유지보수 해야하는 코드 줄어듭니다.
- 패러다임 불일치 문제를 해결해주므로 객체지향 언어가 가진 장점을 활용해서 유지보수하기 좋은 도메인 모델을 편리하게 설계 가능합니다
- 패러다임의 불일치 해결
- 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결합니다.
- 상속 :
- JDBC API 사용하면 부모 객체 데이터 꺼내오는 코드, 자식 객체 데이터 꺼내오는 SQL 코드 다 만들어야함. => JPA 사용하면 해결
- 자바 컬렉션에 저장하듯 JPA에 객체를 저장하면 됌. ex) jpa.persist()
- 연관관계 : 참조로 연관관계 맺을 수 있음 -> 저장, 조회 등 기능 할때 참조로 해결 가능. ex) entity에 Team team 선언. 외래 키 선언 필요 X.
- 객체 그래프 탐색(참조를 사용해 연관된 팀 찾는 것):
- SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해짐. => 개발자에게 너무 큰 제약(SQL에 의존적인 개발)
- JPA 사용하면 객체 그래프 마음껏 탐색 가능. 지연로딩(필요한 시점에 데이터를 꺼내오는 것)을 투명하게 처리.
- 비교 :
- 테이블은 기본 키의 값으로 row 구분 - 객체는 동일성(==)과 동등성(equals)을 구분
- JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장함.
- 상속 :
- 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결합니다.
- 성능
- JPA는 애플리케이션과 데이터베이스 사이에서 작동 -> 최적화 관점에서 시도해 볼 수 있는 것이 많습니다.
- 데이터 접근 추상화와 벤더 독립성
- 관계형 데이터 베이스는 같은 기능도 벤더마다 사용법이 다른 경우 많이 있습니다.(ex) 페이징, 데이터베이스 마다 페이징 처리 기법이 달라서 따로 따로 익혀야 함) -> JPA 사용하면 데이터 베이스 변경할 때 다른 데이터베이스를 사용한다고 알려주기만 하면 문제 해결 가능합니다.
JPA 원리
- 자바 객체와 데이터베이스 테이블 간의 매핑을 통해 객체지향 프로그래밍의 장점을 유지하면서 데이터베이스와 상호작용합니다. 엔티티, 엔티티 매니저, 영속성 컨텍스트, JPQL을 통해 데이터의 생성, 조회, 업데이트, 삭제 작업을 수행합니다.
JPA 자세한 원리
- 엔티티 매니저 팩토리에서 엔티티 매니저 생성 -> 엔티티 매니저 내부에 영속성 컨텍스트 같이 만들어짐.(영속성 컨텍스트는 엔티티 매니저를 통해 접근 가능)
- 영속성 컨텍스트가 가상의 데이터베이스 같은 역할을 수행 -> 영속성 컨텍스트 덕분에 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경감지, 지연 로딩 사용 가능합니다.
- 영속성 컨텍스트에 저장한 엔티티 플러시 통해 데베 반영 (일반적으로 트랜잭션을 커밋할 때 영속성 컨텍스트 플러시)
JPA 특징
- 객체-관계 매핑(ORM)
- 엔티티는 데이터베이스 테이블에 매핑되며, 필드는 테이블의 열에 매핑합니다.
- 투명한 데이터 접근
- 엔티티 매니저를 통해 데이터베이스 접근이 이루어지므로, 데이터베이스 종속성을 줄일 수 있습니다.
- 캐싱
- JPA는 1차 캐시를 통해, 동일한 트랜잭션 내에서 동일한 엔티티에 대한 중복 조회를 방지합니다.
- 2차 캐시를 통해 애플리케이션 전반에 걸쳐 엔티티를 캐싱할 수 있습니다.
- 자동화된 DDL 생성
- 엔티티 클래스의 매핑 정보를 기반으로 데이터베이스 테이블을 자동으로 생성 및 변경할 수 있습니다.
- 개발 초기 단계에서 데이터베이스 스키마를 쉽게 설정 가능합니다.
- 트랜잭션 관리
- JPA는 트랜잭션 관리를 제공하여, 데이터베이스 작업의 원자성, 일관성, 고립성, 지속성을 보장할 수 있습니다.
- 엔티티 매니저의 트랜잭션을 통해 데이터 무결성을 유지합니다.
- 지연로딩과 즉시로딩
'스프링 > 개념' 카테고리의 다른 글
엔티티(Entity) - 왜 기본 생성자가 필요할까? (0) | 2024.09.10 |
---|---|
엔티티 매니저와 영속성 컨텍스트 (0) | 2024.09.10 |
Spring 예외처리 기본 원리와 어노테이션 (0) | 2024.09.09 |
계층형 패키지 구조 vs 도메인형 패키지 구조 (0) | 2024.09.09 |
HTTP 상태 코드 정리 (0) | 2024.09.09 |