240531
오늘의 학습
● 1. JDBC & JPA 관계
● 1. JPA
JDBC와 JPA 관계
JDBC( Java Database Connectivity )
JDBC는 자바에서 다양한 데이터 베이스에 접속 및 쿼리 실행, 결과 반환을 하기 위한 자바의 API이다. 여기서 핵심은 JDBC의 C에 해당하는 Connectivity이다. 위와같이 연결을 해주는 인터페이스 라는 것이다. 또한 JDBC는 하나의 인터페이스로써 이것을 구현하고 있는 다양한 데이터베이스들이 존재하며, 다양한 데이터베이스들은 각자가 본인들의 데이터베이스에 접근 할 수 있게끔 Oracle Driver, MySql Driver 등등을 만들어서 제공을 해준다.
결국 인터페이스를 구현한 클래스는 Oracle Driver, MySql Driver인 셈이다. 우리는 이것을 이용해서 DB에 접근을 한다.
( 참고로 DB는 다양하고 쿼리문도 다양하기 때문에 이것때문에 자바 라이브러리가 다양한 DB 전용으로 나오게 되면 많은 불편함이 있을 것이기 때문에 자바에서는 JDBC를 만들어 이것을 데이터베이스들이 구현하게 만든 것이다.)
JPA ( Java Persistence API )
JPA는 Java Persistence API로 자바의 ORM 기술의 표준 명세 이며, JDBC를 확장한 인터페이스이다.
JPA는 ORM 기술을 이용하여 자바 객체와 DB의 테이블은 매핑을 이루고 있으며, 쉽게 말해 객체가 테이블이 되도록 매핑을 시켜주는 것이라고 생각하면 된다.
어차피 결국 JPA는 JDBC에서 확장된 기술이기 때문에 결국 DB 연결과 쿼리문 보내는 방식과 결과를 받는 방식은 JDBC를 거쳐서 하게된다. 즉, JPA를 알기 위해서는 JDBC를 알아야한다는 것이다.
( JPA는 JDBC에서 더욱 추상화가 되었고 JDBC는 바뀐 것이 없으며 JPA는 JDBC를 이용하여 DB에 조회를 할 수 있다. )
JPA
JPA는 Java Persistence API로 자바의 ORM 기술의 표준 명세 이다.
Entity
- JPA에서 관리되는 클래스 즉, 객체를 의미한다.
- Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리됩니다.
영속성 컨텍스트 ( Persistence Context )
- 영속성이란 영구적인, 지속적인 이라는 의미이며, DB에 영구적으로 저장한다는 의미로도 해석할 수 있다.
- 이렇듯 영속성 컨텍스트는 자바 JPA에서 Entity객체들을 효율적으로 쉽게 관리하기 위해 만들어진 공간이다.
JPA에서는 이러한 영속성 컨텍스트라는 공간에 Entity 객체들을 저장하여 관리하면서 DB와 상호작용을 하게 된다.
EntityManagerFactory
- Persistence클래스가 데이터베이스의 정보를 적어둔 properties 파일 또는 xml 파일을 읽어들여 그 데이터베이스의 정보를 토대로 EntityManagerFactory를 생성을 해주고 EntityManagerFactory는 EntityManager를 만들어주는 역할을 한다.
EntityManager
- 영속성 컨텍스트에 접급하여 Entity 객체들을 조작하기 위해서 필요한 객체이며, 이러한 EntityManager를 이용하여Entity를 저장하고 수정하고 삭제할 수 있게 된다.
- EntityManager는 EntityManagerFactory를 통해서 생성을 할 수 있다.
트랜잭션( Transaction )
DB의 데이터들의 무결성과 정합성을 유지시키기 위한 하나의 논리적 개념이다.
쉽게 말해, 실제 DB에 반영되는 commit을 통해 데이터베이스에 반영구적으로 저장이 되는데 그 사이의 과정이라고 생각하면 된다. insert를 여러개 하던 중 중간에 오류가 생기면 전부다 insert를 취소해야하는 상황이 존재한다. 이러한 상황에서 하나는 저장되고 나머지 하나는 저장이 안돼는 상황이 생기면 데이터의 무결성과 정합성에 부합하므로 존재하는 개념이다
JPA의 트랜잭션 ( Transaction )
위의 트랜잭션과 같이 JPA는 DB의 트랜잭션의 개념을 이용하여 효율적으로 Entity를 관리하고 있다. 이와같이, 영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 DB에 바로 반영이 되지는 않는다.
DB에서 하나의 트랜잭션에 여러 개의 SQL을 포함하고 있다가 commit을 통해 영구적으로 변경을 반영하는 것처럼 JPA에서도 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소라는 곳에 가지고 있다가 마지막에 SQL을 한번에 DB에 요청해 변경을 반영하는 것이다.
쓰기 지연 저장소
JPA에서 트랜잭션이 걸려있는 곳에서의 SQL문을 모아두는 곳이며 모아둔 SQL문을 commit과 함께 DB에 반영을한다.
정리
영속성 컨텍스트는 DB의 트랜잭션 개념을 가지고와서 사용하고 있으며 JPA에서 트랜잭션 환경에서 DML을 하게 되면 영속성 컨텍스트 내부의 쓰기 지연 저장소에 DML에 관련된 SQL문을 모아두었다가 트랜잭션이 끝나는 시점 commit이 되는 순간 쓰기 지연 저장소의 쿼리를 한번에 날려 DB에 반영하는 개념이다. 이때 중간에 문제가 생긴다면 트랜잭션 환경에 의해 rollback처리가 되며 최초 시점으로 돌아온다 ( 즉, 쿼리를 다 지워버리는 느낌임. )
영속성 컨텍스트 내부
영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있다.
저장하는 Entity 객체들은 1차 캐시 즉, 캐시 저장소에 저장된다고 생각하면 된다.
캐시 저장소는 Map 자료구조 형태 즉, key & value 형태로 되어있다.
key에는 Entity의 식별값인 @Id 값이 들어가 있으며, value에는 해당 Entity 클래스의 객체를 저장하게 된다.
변경 감지
EntityManager를 이용해 id값과 Entity타입을 넣고 Entity를 조회하게 되면 영속성 컨텍스트는 DB에서 해당 엔티티를 조회해와서 1차 캐시에 넣어준다. 이때 1차 캐시 LoadedState공간에 DB에서 가지고온 Entity를 넣어준 상태로 영속성 상태가 된다. 이제 엔티티 객체의 값을 변경시켜주면 영속성 상태의 엔티티의 값은 1차 캐시 가운데 Entity에 반영이 된다.
그 후 commit을 하게 되면 변경 감지를 통해 Entity와 LoadedState를 비교 후 변경된 사항을 JPA에서 자동으로 업데이트 쿼리를 만들어서 DB에 반영을 하게 된다. ( 아래의 사진 참고 )
( 참고 : JPA는 영속성 컨텍스트에 Entity를 저장할 때 최초 상태(LoadedState)를 저장한다. )
Entity의 상태
1. 비영속 상태 : 영속성 컨텍스트에 저장되지 않은 상태
2. 영속 상태 : 영속성 매너지를 통해 영속성 컨텍스트에 저장이 되어 관리되는 상태 ( MANAGED )
3. 준영속 상태 : 영속성 컨텍스트에 저장되어 관리되다가 따로 분리 된 상태 ( DETACHED )
1. 준영속 상태( DETACHED )
detach(), clear(), close() 메서드를 이용해서 현재 해당하는 Entity를 인자로 넣으면 준영속 상태로 들어가며 영속성 컨텍스트에서 빠져나가게 된다. 즉, 변경감지 대상에서 제외가 된다는 의미이며 변경을 해도 DB에 반영이 되지 않는다.
merge() 메서드를 통해 준영속 상태의 Entity를 다시 영속성 컨텍스트에 넣어 영속상태로 변경할 수 있다.
em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
em.clear() : 영속성 컨텍스트를 완전히 초기화 시키지만 틀은 유지를 한다.
em.close() : 영속성 컨텍스트를 완전히 종료한다. (이용 불가능)
em.merge() : 준영속 상태를 영속 상태로 변경해준다.
( merge => 수정( 준영속 상태의 엔티티를 조회를 통해 병합 ) , 저장을 한다. )
remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환합니다.
# 오늘의 회고
오늘은 여유가 좀 있어서 JPA를 복습을 했다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 34일차( [13일의 금요일] 뉴스피드 프로젝트 ) (2) | 2024.06.04 |
---|---|
내일배움캠프 33일차 TIL - Git-Hub Fork (0) | 2024.06.03 |
내일배움캠프 31일차 TIL - 책 리뷰 및 개인 과제 질문 (1) | 2024.05.30 |
내일배움캠프 30일차 TIL - JWT(Stateless) (0) | 2024.05.29 |
내일배움캠프 29일차 TIL - ExceptionHandler (0) | 2024.05.28 |