우선.. ORM이 계속 헷갈려서 참고한 블로그 링크를 첨부한다.. 😂
ORM 블로그 링크
JPA 란 Java진영에서 사용하는 ORM기술의 표준 사양이다.
JPA표준 사양을 구현한 구현체로 Hibernate ORM, EclipseLink, DataNucleus 등이 있는데, 나는 Hibernate ORM에 대해 배웠다.

데이터 저장, 조회 등의 작업은 JPA를 거쳐서 JPA의 구현체인 Hibernate ORM을 통해 이루어진다. Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근하게된다.
(정리하면, 데이터 액세스 계층 상단에 위치한 JPA에서 지원하는 API를 사용해서 데이터베이스에 접근하는 방법을 배우는 것이다.)
JPA에서 P(Persistence)는 영속성, 지속성이라는 뜻이다.

ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.
JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트에 보관해서 애플리케이션 내에서 오래 지속되도록한다.
이렇게 보관된 엔티티 정보는 데이터베이스 테이블에 데이터를 CRUD하는데 사용된다.
em.persist()를 호출하면 영속성 컨텍스트의 1차 캐시에 엔티티 클래스의 객체가 저장되고, 쓰기 지연 SQL 저장소에 INSERT 쿼리가 등록된다.
tx.commit()을 하는 순간 쓰기 지연 SQL 저장소에 등록된 INSERT 쿼리가 실행되고, 실행된 INSERT 쿼리는 쓰기 지연 SQL 저장소에서 제거된다.
em.find()를 호출하면 먼저 1차 캐시에서 해당 객체가 있는지 조회하고, 없으면 테이블에 SELECT 쿼리를 전송해서 조회한다.
tx.commit() 메서드가 호출되면 JPA 내부적으로 em.flush() 메서드가 호출되어 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다