요즘은 웹이나 어플들을 사용할려면 Database(DB)가 필수 조건이다.
(객체를 관계형 DB에 관리하는게 대세야 요즘은!)
현재 난 스프링으로 서버 공부중인데, JPA를 사용해서 스프링 서버가 DB에게 쿼리를 날려야 하는데....
과연 이 JPA가 정확이 뭐고 어떤 구조이고 어떤 방식으로 사용하는지 궁금해서 섬세하게 공부하기로 했다.
JPA(Java Persistence API)란?
1. Java에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
2. 인터페이스다. 따라서 Hibernate, OpenJPA 등이 JPA를 구현함
뭐 이런 뜻이다. 여기서 말하는 ORM(Object-Relational Mapping)은 우리가 알고 있는 class 이런것들에 RDB(Mysql, Mariadb 등)을 매핑해준다는 뜻이다.
뭔가 Request(요청)이 들어오게 되면, EntityManagerFactory가 그 요청마다 한개씩 EntityManager를 만든다.
지금부터 EntityManagerFactory를 emf
EntityManager를 em이라고 부르겠다.
(너무 길어...)
혹시 CURD라고 들어보셨습니까?
Create,Update, Read, Delete 의 약자다. 우리는 모든 어플이나 서비스 등을 만들다 보면 당연시하게 되는 것들이다.
근데.... 만들다 보면 이 CURD SQL문을 계속 반복하게 되다보니 지루하고 재미없는 코드들만 계속 입력하게 된다 ㅠㅠㅠㅠㅠㅠㅠ
그걸 처리해주는게 JPA다.
JPA는 SQL중심으로 개발하는게 아닌, 객체 중심으로 개발을 할 수 있다는 거다.
그러다보니 생산성이 좋아지고 유지보수도 수월하게 된다.
게다가... JAVA에는 상속(Extends) 관계가 있는데, DB는 이러한 상속 관계가 없다.
(있긴 있다는데... 이런 상속이 아닐걸...?)
이러한 관계를 JPA는 이런 방식으로 패러다임의 불일치를 해결했다.
만약에, 지금 우리가 Book 정보를 저장한다고 가정하자.
EntityManager em = emf.createEntityManager();
em.persist(book);
이런 식으로 실행을 하면....
INSERT INTO ITEM (ID, NAME, PRICE) ~~~
INSERT INTO BOOK (AUTHOR, ISBN) ~~~
이런식으로 쿼리를 보내게 된다.
그럼 가져올려면....?
String bookId = 1L;
Book book = em.find(Book.class, bookId);
SELECT I.*, B.*
FROM ITEM I
JOIN BOOK B ON I.ITEM_ID = B.ITEM_ID
이런식으로 객체 상으로는 상속관계인데도 불구하고 잘 묶어서 가져온다.
(와.... 지금까지 쓰면서 JPA가 왜 대단한가 생각을 안했는데, 쓰면서 느껴지네 이거.... ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)
뭐 이런 식으로 JPA는 CRD를 다 지원한다.
...? 뭐가 빠졌는데?
엥? 그럼 Update(수정)는 어디갔어???
진짜 신기한게, EntityManager(em)으로 select로 가져왔다고 치자.
Book book1 = em.find(Book.class, 1L);
book1.setAUTHOR("KIM");
tx.commit();
이런식으로 JPQL이나 뭔가를 사용하지 않아도,
트렌잭션을 commit 할 때, 자동으로 값이 업데이트 된다고 한다.
이 기능을 Dirty Checking 이라고 한다.
Dirty Checking
Entity Manager가 변경이 발생한 Entity를 자동 감지하여 데이터베이스에 반영하는 것
정확하게는 JPA를 통해서 조회한걸 가져오면, JPA가 그때부터 그 객체를 관리한다.
그 트렌잭션을 commit할 때, Dirty Checking이 수정사항을 자동으로 Update 해준다.
나도 이거 공부하면서 처음 알았다...
자세한건 여기에!
JPA - 영속성 컨텍스트
근데 내가 위에서 보여줬던 코드들
(emf, begin, commit 등)
얘네들은 Spring을 사용하면서 볼 일이 없었다.
기껏해야 em.quary 이렇게 한 다음, JPQL을 적어서 날려버렸지
지금 내가 적은 내용들은 JPA의 개념이다.
JAVA에서 RDB랑 매핑할려고 한거다.
스프링에서 사용하는 JPA는 JPA를 사용하는 스프링 프레임워크 Spring Data JPA 프레임워크다.
출처: https://dbjh.tistory.com/77
스프링에서는 (emf, begin, commit 등) 얘네들을 다 자동으로 해준다.
그래서 내가 이 글을 공부하고 적는 이유가, 처음부터 스프링으로 JPA를 배워버려서 내가 내부 구조도 잘 모르고 바보같이 헤헤;;; 하면서 사용해서 공부했다.
이번에 정보처리기사 실기 공부하면서 트렌잭션(원자성, 일관성, 독립성, 영속성) 나오고, begin, rollback, commit 을 공부하고 이걸 보니까 훨씬 이해가 잘 된다.
하... 다음엔 붙어야 되는데