[JPA] 도입
Java Persistence API의 약자로 자바 진영의 ORM 기술 표준을 의미한다.
JPA는 인터페이스이고, 인터페이스를 구현한 여러 구현체가 있는데 그 중 하이버네이트를 가장 많이 사용한다.
객체는 객체대로, 데이터베이스는 데이터베이스대로 설계하고 ORM 프레임워크가 객체와 데이터베이스간 차이를 해결해 데이터베이스를 자바 객체를 다루는 것 처럼 사용할 수 있도록 한다.
아예 밑바닥부터 구현되는건 아니고, JDBC API도 적절하게 사용한다.
Persistence 클래스는 yml, xml 등 설정 정보를 읽고 EntityManagerFactory 클래스를 만든다.
그리고 필요할 때 마다 EntityManager를 만들어서 사용하는 방식으로 동작한다.
EntityManager는 JPA에서 애플리케이션과 데이터베이스 사이의 인터페이스 역할을 수행하고, 엔티티의 CRUD 작업을 수행하는 객체이다.
1차 캐시 / 트랜잭션 관리 등을 처리해주니 데이터베이스와 통신할 때 유용하게 사용할 수 있다.
EntityManager는 Thread-Safe 하지 않다.
따라서 각 쓰레드에 별도의 EntityManager 인스턴스를 생성하거나 쓰레드 로컬에 저장해서 사용해야 하는데, 이 부분을 해결하기 위해 EntityManagerFactory를 도입한다.
EntityManagerFactory는 스프링에서 하나만 생성되고 Thread-Safe 하므로 여러 곳에서 동시에 접근해도 문제가 발생하지 않는다.
필요할 때 마다 EntityManager를 만들어서 제공하고, 다 사용했으면 반환한다. (close 메서드를 사용하는데 이 부분은 추상화 될 수 있다)
1. 등록
persist 메서드를 사용해 데이터베이스 테이블에 값을 등록할 수 있다.
2. 조회
find 메서드를 사용해 데이터베이스 테이블에 있는 값을 가져올 수 있다.
이 때 엔티티 클래스와 PK를 인자로 넘긴다.
3. 수정
JPA를 통해서 값을 가져오면 그 값은 JPA가 관리하게 된다.
트랜잭션을 커밋 하는 순간에 값이 변경됐는지 확인하고, 값이 변경됐으면 update 쿼리를 날린다.
(JPA를 통해 데이터베이스를 변경하는 경우 무조건 트랜잭션으로 묶여서 처리된다. 스프링이 알아서 처리해준다)
따라서 데이터베이스 테이블에서 가져온 값을 setter로 수정 시 트랜잭션이 커밋될 때 값이 갱신된다.
데이터베이스에서 특정 조건으로 검색하고 싶을 때는 JPQL을 사용한다.
JPQL은 엔티티 객체를 대상으로 쿼리를 날리는 기술으로 SQL을 추상화한 객체지향 쿼리 언어이다.
특정 데이터베이스 SQL에 의존하지 않고 개발할 수 있다는 장점이 있다.
SQL은 데이터베이스 테이블을 대상으로 하고, JPQL은 엔티티 객체를 대상으로 쿼리를 날린다.
JPA의 핵심은 SQL 의존적인 개발에서 벗어나는 부분이다.
개발자는 객체지향적인 방식으로 데이터를 관리할 수 있게 되고 SQL을 작성하지 않아도 돼 개발 생산성을 높일 수 있다.
하지만 데이터베이스 공부를 무시하는건 좋지 않다.
JPA를 효과적으로 사용하려면 데이터베이스 설계, 모델링을 정교하게 수행해 놔야 한다.
특정 테이블에서 특정 데이터를 가져오려고 하는데, 데이터베이스 테이블의 설계에 따라서 조인을 3번 할 수도 있고 하지 않을 수도 있다.
JPA를 사용해 개발 생산성을 높이되, 근본은 데이터베이스임을 꼭 기억하자.
'Spring > JPA' 카테고리의 다른 글
[JPA] 상속관계 매핑 (0) | 2022.12.23 |
---|---|
[JPA] 다양한 연관관계 매핑 (0) | 2022.12.22 |
[JPA] 연관관계 매핑 (0) | 2022.12.22 |
[JPA] 객체와 테이블 매핑 (0) | 2022.12.22 |
[JPA] 영속성 컨텍스트 (0) | 2022.12.21 |
댓글
이 글 공유하기
다른 글
-
[JPA] 다양한 연관관계 매핑
[JPA] 다양한 연관관계 매핑
2022.12.22 -
[JPA] 연관관계 매핑
[JPA] 연관관계 매핑
2022.12.22 -
[JPA] 객체와 테이블 매핑
[JPA] 객체와 테이블 매핑
2022.12.22 -
[JPA] 영속성 컨텍스트
[JPA] 영속성 컨텍스트
2022.12.21