Object Relational Mapping(객체-관계 매핑)의 약자로, 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말함
ex)
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=50)
body = models.CharField(max_length=1200)
위 코드를 실행하면 자동으로 아래와 같은 테이블이 생성됨
장고가 ORM으로 자동으로 아래와 같은 쿼리를 생성해서 실행했기 때문!
CREATE TABLE "blog1_post" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(50) NOT NULL,
"body" varchar(1200) NOT NULL
)
// Java에서의 객체 참조 -> 방향성이 존재
public class Employee {
private int id;
private String first_name;
private Department department; // Department 객체를 참조함
...
}
// Employee -> Department
// 자바에서 양방향 관계가 필요한 경우, 연관을 두 번 정의해야 함
ORM을 구현하기 위한 구조와, 구현을 위해 필요한 여러 기능들을 제공하는 소프트웨어
Java Persistence API의 약자로, 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음
❓ JDBC (Java Database Connectivity)
자바 기반 애플리케이션의 데이터를 DB에 저장 및 업데이트하거나, DB에 저장된 데이터를 자바에서 사용할 수 있도록 하는 자바 API
- JPA는 JDBC를 통해 DB와 통신함
- JDBC가 JPA보다 훨씬 오래된 버전임 (JPA의 이전 버전?)
https://stackoverflow.com/questions/11881548/jpa-or-jdbc-how-are-they-different
JPA 기반의 구현체는 대표적으로 세 가지가 있음
가장 많이 사용되는 구현체는 하이버네이트이다!
JPA를 사용하기 편하도록 만들어놓은 모듈
리포지토리는 아래와 같이 JpaRepository를 상속받음
public interface ItemRepository extends JpaRepository<Item, Long>, ItemRepositoryCustom { ... }
따라서 생성된 리포지토리는 아래와 같은 많은 기능을 별도의 메서드 구현 없이도 사용할 수 있음
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
...
}
엔티티를 영구 저장하는 환경이라는 뜻으로, 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함
영속성 컨텍스트는 엔티티 관리 개념이고, 이 개념은 하이버네이트 같은 구현체에서 매우 복잡하게 구현되어 있음
Spring Data JPA를 사용하면, 리포지토리를 사용해서 데이터베이스에 접근하는데
실제 내부 구현체인 SimpleJpaRepository가 아래와 같이 리포지토리에서 엔티티 매니저를 사용하는 것을 알 수 있음
public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation,
EntityManager entityManager) {
Assert.notNull(entityInformation, "JpaEntityInformation must not be null!");
Assert.notNull(entityManager, "EntityManager must not be null!");
this.entityInformation = entityInformation;
this.em = entityManager;
this.provider = PersistenceProvider.fromEntityManager(entityManager);
}
Member member = new Member();
em.persist(member);
// 엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만든다.
em.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
em.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
em.close();
em.remove(member);
// em.find(엔티티 클래스 타입, 식별자 값);
Member member = em.find(Member.class, "member1");
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.print(a==b) // true
flush
는 쓰기 지연 SQL 저장소에 있는 쿼리를 DB에 반영하는 행위로, em.flush()
는 위의 2~4번을 모두 포함하는 과정임 EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
Member member = em.find(Member.class, "member1");
member.setName("노영삼");
transaction.commit();
Object와 SQL의 필드를 매핑하여 데이터를 객체화 하는 기술
https://gmlwjd9405.github.io/2019/02/01/orm.html
https://lipcoder.tistory.com/366
https://tibetsandfox.tistory.com/17
https://thisisprogrammingworld.tistory.com/132
도서 '스프링부트 핵심 가이드'
https://velog.io/@yebali/Spring-Data-JPA%EB%9E%80
https://www.inflearn.com/questions/246769/영속성-컨텍스트에-관한-질문입니다
https://velog.io/@neptunes032/JPA-영속성-컨텍스트란
https://ittrue.tistory.com/254
https://www.inflearn.com/questions/351605/55초-x27-플러시-발생-x27-관련-문의-드립니다