개요 JPA는 데이터베이스 스키마를 자동으로 생성해 주는 기능을 제공한다. 아래 코드처럼 설정한 데이터베이스 방언에 맞는 DDL을 생성할 수 있다. 데이터베이스 방언이란? 데이터 타입이나 함수평, 페이징 처리 등 각 데이터베이스가 제공하는 고유 기능을 말한다. 특정 데이터베이스에 종속되는 기능을 많이 사용하면 나중에 데이터베이스를 교체하기 어렵다. 이를 해결하기 위해 JPA에서는아래와 같은 방언 클래스들을 제공한다. - H2 : org.hibernate.dialect.H2Dialect - MySQL : org.hibernate.dialect.MySQL5InnoDBDialect - Oracle 10g: org.hibernate.dialect.Oracle10gDialect 스키마 생성 옵션 create 기존..
스프링 공부/JPA 기본
객체와 테이블 매핑 @Entity JPA로 클래스를 데이터베이스 테이블과 매핑할 때 사용한다. JPA가 해당 엔티티를 관리하게 된다. 해당 어노테이션을 사용하기 위해서는 기본 생성자가 필요하다. final 클래스, enum, interface, inner 클래스에서는 @Entity를 사용할 수 없다. name 속성으로 JPA에서 사용할 엔티티 이름을 지정할 수 있다. 지정해주지 않으면, 기본값인 클래스 이름을 그대로 사용한다. @Table 엔티티와 매핑할 테이블을 지정한다. 속성은 다음 4가지가 존재한다. name: 매핑할 테이블 이름을 지정한다. catalog: 데이터베이스 catlog를 매핑한다. sechema: 데이터 베이스 schema를 매핑한다. uniqueConstraints: DDL을 생성할..
영속 상태가 되는 경우 i) em.persist()를 할 때 ii)em.find()를 했을 때 엔티티가 1차 캐시에 없을 때 1차 캐시에 없으면 엔티티를 DB에서 조회해 1차 캐시에 저장된다. 1차 캐시에 올라가 JPA가 관리하는 상태를 영속 상태라고 한다. 준영속 상태 영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것이다. 준영속 상태에서는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. 준영속 상태로 만드는 방법 em.detach(entity) 특정 엔티티만 준영속 상태로 전환한다. em.find()에서 150L Member는 영속성 컨텍스트에 없으므로 영속성 컨텍스트에 저장된다. (영속화) em.detach() 후에는 준영속 상태가 되어 영속성 컨텍스트에서 관리가 되지 않는다. //영속 상태..
플러시 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다. 트랜잭션이 커밋되면 플러시가 자동으로 발생한다. 플러시가 발생하면 무슨 일이 생길까? - 변경 감지가 발생한다. - 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다. - 쓰기 지연 SQL 저장소에 있는 등록, 수정, 삭제 쿼리를 데이터베이스에 전송한다. 영속성 컨텍스트를 플러시하는 방법 i) em.flush() - 직접 호출 Member member = new Member(200L, "member200"); em.persist(member); em.flush(); //플러시 강제 호출 em.persist()-> 영속성 컨텍스트에 엔티티가 담기고, 쿼리가 저장소에 저장된다. em.flush() -> 저장소의 쿼리가 DB에 반..
영속성 컨텍스트란? 영속성 컨텍스트(Persistence Context)는 엔티티를 영구 저장하는 환경이다. 애플리케이션과 DB 사이에서 객체를 보관하는 가상 DB이기도 하다. EntityManager.persist(entity)는 엔티티를 영속성 컨텍스트에 저장시키는 코드이다. EntityManagerFactory는 매 요청마다 엔티티 매니저를 생성한다. 생성된 엔티티 매니저는 데이터베이스 커넥션을 통해 DB를 사용할 수 있다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 엔티티 매니저를 통해 영속성 컨텍스트를 접근하고 관리할 수 있다. 같은 트랜잭션 내에 있는 엔티티 매니저는 동일한 영속성 컨텍스트에 접근한다. 엔티티 생명주기 비영속 (new) 엔티티를 생성했지만 영속성 컨텍스트에 ..