김영한의 Spring 12

기본 키 매핑

기본 키 매핑 어노테이션 @Id 기본키를 직접 할당하는 방법 ⇒ @Id만 사용하면 된다. @GeneratedValue 기본키 자동생성 기능을 위해서 사용한다. IDENTITY 전략 기본 키 생성을 DB에 위임한다. MySQL(AUTO_ INCREMENT), PostgreSQL, SQL Server, DB2에서 사용한다. 보통 JPA는 커밋 직전에 INSERT 쿼리를 실행하지만, IDENTITY 전략은 entityManager.persist() 시점에 즉시 INSERT쿼리를 실행하고 DB에서 식별자를 조회한다. 그 이유는 아래와 같다. PK값을 DB에 들어간 뒤에 알 수 있다. JPA 입장에서는 @Id(DB PK)를 알 수가 없으니 원래라면 1차캐시 안에 값을 넣을 수가 없다. 그래서 commit하는 시점..

필드와 컬럼 매핑

매핑 어노테이션 정리 @Column : 컬럼 매핑 @Temporal : 날짜 타입 매핑 @Enumerated : enum 타입 매핑 @Lob : BLOB, CLOB 매핑 @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시), DB랑 관계 없이 메모리에서만 사용한다. @Enumerated 자바 enum 타입을 매핑할 때 사용한다. 기본값은 EnumType.ORDINAL 인데, 이 떄 주의사항이 있다. ORDINAL은 0부터 시작하는 enum 순서를 DB에 저장하므로(Integer) 자바 enum타입을 매핑하기 위해 사용하려면 ORDINAL을 사용하면 안된다. enum 타입인 ROLETYPE에 순서 변화가 발생했을 때, 이전의 데이터들에게 영향을 미쳐 큰 문제가 발생하는 등 여러 곤란한 상황..

객체와 테이블 매핑

엔티티 매핑 소개 객체와 테이블 매핑 ⇒ @Entity, @Table 필드와 컬럼 매핑 ⇒ @Column 기본 키 매핑 ⇒ @Id 연관관계 매핑 ⇒ @ManyToOne, (…) , @JoinColumn 객체와 테이블 매핑 @Entity @Entity 어노테이션이 붙은 클래스는 JPA에 의해 관리되고, 엔티티라고 한다. 기본 생성자가 필수이다. (파라미터 없는 public 혹은 protected) final 클래스 ,enum, interface, inner 클래스 사용할 수 없다. 저장할 필드에 final을 사용할 수 없다. name 속성 기본값은 클래스 이름과 같다. 다른 패키지의 같은 이름의 클래스가 있는 경우, 다른 이름을 쓰기 위해 사용 가능하다. @Table @Table은 엔티티와 매핑할 테이블을..

준영속 상태

영속 상태 → 준영속 상태 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태이다. (detached) 준영속 상태에서는 영속성컨텍스트가 제공하는 기능을 사용할 수 없다. 준영속 상태로 만드는 법 entityManager.detach(entity) 특정 엔티티만 준영속 상태로 만든다. entityManager.clear() 엔티티 매니저 안의 영속성 컨텍스트를 초기화한다. entityManager.close() 영속성 컨텍스트를 종료한다. 준영속 상태가 되었는지 확인 UPDATE 쿼리 실행여부로 확인 저장되어있는 member의 이름을 변경한 후 준영속 상태로 만든 뒤 커밋하니, SELECT 쿼리는 실행되지만 UPDATE 쿼리는 실행되지 않는 것을 볼 수 있다. SELECT 쿼리 여러번 실행되는 것으로 ..

플러시

플러시(flush) 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 커밋 될 때 실행됨 영속성 컨텍스트의 변경 사항과 DB를 일치시키기 위해 쿼리를 날리는 과정 변경 감지 수정된 엔티티를 쓰기지연 SQL 저장소에 등록 쓰기지연 SQL 저장소의 쿼리를 DB에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 emtityManager.flush() → 직접 호출하는 방법, 거의 사용하지 않는다. 트랜잭션 커밋 → 플러시 자동호출 JPQL 쿼리 실행 → 플러시 자동호출 오류 방지를 위해 무조건 flush 실행 flush를 실행하면 1차 캐시가 지워지는가? 1차캐시는 유지된다. 영속성 컨텍스트 쓰기지연 SQL 저장소에 있는 쿼리들을 DB에 반영하는 과정이다. 플러시 모드 옵션 entityM..

영속성 컨텍스트 2

엔티티 조회, 1차캐시 JPA에서 1차 캐시는 엔티티를 영속성 컨텍스트에서 관리하는 캐시를 의미한다. find()나 getReference() 메서드로 조회한 엔티티 객체는 1차 캐시에 저장된다. 같은 엔티티를 다시 조회할 경우 1차 캐시에서 먼저 조회하게 되어 DB에서 조회하지 않고 캐시된 엔티티를 반환한다. 1차 캐시는 엔티티 매니저의 생명주기와 같이 유지된다. 1차 캐시에 저장된 엔티티의 상태가 변경되면 엔티티 매니저는 변경 내용을 즉시 DB에 반영하지 않아도 된다. 엔티티 저장 엔티티를 생성한 후 persist 메서드를 이용해 영속 상태로 만든다. DB PK로 지정한 값을 키로, 엔티티 자체를 값으로 1차 캐시에 저장한다. 엔티티 조회 - 1차 캐시에서 조회 find 메서드를 사용하면 우선 DB가..

영속성 컨텍스트 1

JPA에서 가장 중요한 2가지객체와 RDB 매핑하기영속성 컨텍스트  영속성 컨텍스트엔티티를 영구저장하는 환경이라는 뜻이다.EntityManager.persist(entity) 를 통해서 DB에 저장하는게 아니다Entity를 영속성 컨텍스트에 저장하는 것이다.영속성 컨텍스트는 논리적인 개념으로, 눈에 보이지 않는다.엔티티매니저를 통해서 영속성 컨텍스트에 접근한다.   엔티티의 생명주기비영속(new/transient) 영속성 컨텍스트랑 전혀 관계가 없는 새로운 상태위 예시는 Member 객체만 생성하고 EntityManager에 아무것도 넣지 않은 상태이므로 JPA와 상관 없는 상태이다. 영속(managed) 영속성 컨텍스트에 의해 관리되는 상태persist 메서드에 의해 EntityManager 안으로 들..

Hello JPA - 애플리케이션 개발

JPA 구동 방식 Persistence 클래스가 META-INF/persistence.xml 설정정보를 조회한다. 이를 사용해 EntityManagerFactory 클래스를 만든다. JPA 동작을 위한 EntityManager를 생성하여 실행한다. JPA 구현체에 따라 DB 커넥션 풀도 설정한다. 트랜잭션 추가 X //회원 등록 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello"); EntityManager entityManager1 = entityManagerFactory.createEntityManager(); Member member1 = new Member(); member1.setId(..

Hello JPA - 프로젝트 생성

데이터베이스 방언 각각의 DB가 제공하는 SQL문법과 함수에는 차이가 존재한다. MySQL과 Oracle의 가변문자가 다르고, 문자열 자르는 함수 등이 그렇다. 이 때 SQL 표준을 지키지 않는 특정 DB만의 고유한 기능을 DB방언이라고 한다. JPA는 이런 특정 DB에 종속되지 않는다. 따라서 별도 Dialect 설정을 해주면 JPA가 DBMS에 맞는 쿼리를 직접 작성하고 실행해준다. https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를..

JPA 소개

ORM( Object Relational Mapping )이란 객체 관계 매핑 객체 ↔ RDB 간 패러다임의 불일치를 해결할 수 있다. 객체는 객체대로, RDB는 RDB대로 설계 한다. 그 과정을 프레임워크가 중간에서 매핑한다. JPA는 자바 진영의 ORM 표준이다. 저장 프로세스 Entity 객체 저장을 요청한다. JPA가 Entity 에 대해서 분석하고 INSERT SQL문까지 생성해준다. JDBC API를 사용해 INSERT 쿼리를 날려 DB에 저장 패러다임 불일치 해결 조회 프로세스 id를 통해 Entity 객체를 찾아달라고 요청한다 JPA가 SELECT SQL문을 생성해준다. JDBC API를 사용한다. ResultSet을 매핑해준다. Entity 객체를 반환한다. 패러다임 불일치 해결 JPA ..