전체 글
[JPA] 매핑 어노테이션
엔티티 내 필드에는 아래 매핑 어노테이션을 이용해 매핑 컬럼에 대한 특성을 지정할 수 있다. @Column @Temporal @Enumerated @Lob @Transient @Column name @Column(name = "컬럼명") 필드와 매핑할 테이블의 컬럼명을 지정한다. 기본값 : 필드명 insertable, updatable 필드 값 수정 시 DB에 반영할 지 여부 @Column(updatable = false) 지정 시 해당 필드의 값이 변경되도 UPDATE문에 포함되지 않음 기본값 : true nullable @Column(nullable = false) 기본값 : true DDL 옵션 null 허용 여부를 지정한다. unique @Column(unique = true) 기본값 : fals..
[JPA] 스키마 자동 생성
JPA에서는 엔티티를 이용해 데이터베이스 스키마를 자동으로 생성해주는 기능을 제공한다. 실제 프로젝트를 수행할 때는 사용하면 안되는 기능이지만, 개인 프로젝트나 학습용으로는 좋은 기능인듯하다. 자동생성 옵션 스키마 자동 생성 옵션은 persistence.xml에서 지정한다. 위 property를 원하는 persistence-unit에 추가해주면 된다. 그리고 value 속성의 값에 따라 동작이 달라지는데, 아래와 같다. create : 기존 테이블을 삭제하고 다시 생성한다. create-drop : create 옵션과 동일하나 애플리케이션 종료 시점에 테이블을 제거한다. update : 변경 내용만을 반영한다. validate : 엔티티와 테이블이 정상적으로 매핑되었는지만 확인한다. none : 사용하지..
[JPA] 엔티티
@Entity @Entity 어노테이션이 붙은 클래스는 JPA가 관리하며, 이를 엔티티라고 한다. JPA에서는 이 엔티티를 테이블과 매핑해 SQL문을 작성하며, 옵션을 지정해 생성되지 않은 테이블을 엔티티를 통해 생성할 수도 있다. 주의사항 JPA 기본 스펙으로 인해 엔티티에는 기본 생성자가 필수적으로 필요하다. → JPA를 구현하는 라이브러리에서 객체를 프록싱할 때 필요 final 클래스, enum, inteface, inner 클래스는 사용이 불가능하다. 컬럼에 매핑되어 저장할 필드에는 final 사용이 불가능하다. 주요 속성 name - JPA에서 사용할 엔티티 이름을 지정한다. - 기본값 : 클래스명 그대로 - 같은 클래스 이름이 없으면 가급적 기본값을 사용하도록 하자. @Table @Table ..
[JPA] 플러시(flush)
플러시(flush)란? 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미한다. 아래 경우에 flush가 발생한다. 트랜잭션에 commit이 발생할 때 EntityManager의 flush 메서드를 호출했을 때 JPQL 쿼리가 실행될 때 그리고 flush가 발생하면 쓰기 지연 저장소에 저장된 SQL(INSERT/UPDATE/DELETE)이 데이터베이스로 전송된다. IO 처리 시 FileStream.flush() 메서드를 사용하는 경험이 있어 flush 발생 시 영속성 컨텍스트가 비워지는 것이 아닌지 헷갈릴 수 있으나, 아니다. flush가 발생한다고 해서 영속성 컨텍스트가 비워지는 것이 아니고, 변경 사항을 DB와 동기화 하는 것을 의미한다. 그러한 이유로 flush가 발생해도 1차 캐시는 ..
[JPA] 영속성 컨텍스트
영속성 컨텍스트란? 영속성 컨텍스트는 JPA의 이해에 있어 가장 중요한 용어이다. 엔티티를 영구 저장하는 환경이라는 뜻을 가진 논리적인 개념인데, EntityManager를 통해 접근할 수 있다. EntityManger는 EntityManagerFactory에서 사용자의 요청 하나당 하나씩 생성해 DB 커넥션풀을 통해 DB에 대한 CRUD를 가능하게 하는데, EntityManagerFactory는 웹 어플리케이션 하나 당 하나만 존재할 수 있고, EntityManager는 하나의 트랜잭션 당 하나씩 존재할 수 있다. 이 말은, 멀티 스레드간 EntityManager의 공유는 불가능하다는 의미이다. 그리고 이 영속성 컨텍스트는 환경별로 EntityManager와의 관계에 있어 차이가 발생하는데, 아래와 같..
[JPA] JPQL 맛보기
JPQL이란? Java Persistence Query Language의 약자로, JPA에서 SQL을 추상화해 제공하는 객체 지향 쿼리 언어를 의미한다. 때문에 JPQL에서 작성된 쿼리문의 대상은 DB 테이블이 아닌 Entity 객체이다. 기본적인 문법은 SQL과 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다. JPA와 마찬가지로 데이터베이스에 의존하지 않는다. JPQL의 필요성 JPA에서는 개발자가 SQL을 작성하지 않고 JPA에서 제공하는 메서드를 이용해 DB 데이터를 조회해온다. 1 Member member = EntityManager.find(Member.class, 100L); cs 그리고 객체 그래프를 탐색해 연관된 데이터를 다시 조회해온다...