JPA(13)
-
준영속 상태
◎ 준영속 상태 -> 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태 -> 엔티티가 영속성 컨텍스트에서 분리되었기 때문에 해당 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. ◎ 준영속 상태로 만드는 방법 -> em.detach(entity) : 특정 엔티티만 준영속 상태로 만든다. - 위 코드에서 데이터를 변경했음에도 결과를 보면 쿼리가 실행되지 않은 것을 볼 수 있다. -> em.clear() : 영속성 컨텍스트를 초기화한다. - clear를 사용할 때도 쿼리가 실행되지 않았다. - 만약 clear() 이후에 같은 member 객체를 find()를 통해 찾는다면 - clear()를 통해 영속성 컨텍스트가 초기화되었기 때문에 find()를 할 떄 쿼리가 실행이 된다. 따라서 위 그림처..
2023.05.07 -
flush
◎ Flush -> 영속성 컨텍스트의 변경 사항을 db에 반영하는 것 -> 플러시가 발생하는 상황 - 변경 감지(더티 체킹) 발생할 때 - 수정된 엔티티가 쓰기 지연 SQL 저장소에 등록될 때 - 쓰기 지연 SQL 저장소의 쿼리를 db에 전송할 때 -> 플러시 하는 방법 - em.flush()를 통해 직접 플러시를 발생 시킨다. - 트랜잭션 커밋 시 자동으로 플러시가 발생한다. - JPQL 쿼리 실행 시 자동으로 플러시가 발생한다. -> 플러시 모드 옵션 - FlushModeType.AUTO : 커밋이나 쿼리 실행 시 플러시 - 기본 값 - FlushModeType.COMMIT : 커밋할 때만 플러시한다. ◎ 플러시 특징 -> 플러시를 한다고 해서 영속성 컨텍스트를 비우는 것은 아니다. -> 영속성 컨텍..
2023.05.07 -
더티 체킹
◎ 더티 체킹(Dirty Checking) -> 트랜잭션 내에서 엔티티의 변경이 감지되면 변경 사항을 자동으로 db에 반영하는 것이다. -> 영속성 컨텍스트의 1차 캐시에는 id, entity, 스냅샷이 있다. 스냅샷은 값을 읽어온 최초 시점의 상태를 저장한 것이다. -> 만약 값이 변경되면 JPA가 커밋되는 시점에 내부적으로 flush가 호출되면서 엔티티와 스냅샷을 비교한다. 만약 현재 엔티티의 상태가 스냅샷과 다르다면 업데이트 쿼리를 쓰기 지연 SQL 저장소에 저장하고, 해당 쿼리를 db에 반영하여 변경된 값을 커밋한다. -> 예시 - id가 1이고, 이름이 hong인 member 객체가 저장되어 있다. - 아이디가 1인 객체를 찾고, 해당 객체의 이름을 AAAAA로 변경하기만 하면, 변경된 엔티티와..
2023.05.07 -
식별자 전략
◎ 기본키 매핑 -> jpa에서 @Id 애너테이션이 붙은 필드가 기본키 컬럼이 된다. -> jpa에서는 이 기본키를 어떤 방식으로 생성할지에 대해 다양한 전략을 제공한다. -> 기본키 생성 전략은 애플리케이션 코드에서 기본키를 직접 할당하는 기본키 직접 할당과 자동으로 생성하는 기본키 자동 생성이 있다. -> 기본 키 자동 생성(IDENTITY, SEQUENCE, TABLE) - IDENTITY : 기본키 생성을 데이터베이스에 위임하는 방식. 데이터베이스가 MySQL 이라면 AUTO_INCREMENT 기능으로 자동 증가 숫자를 기본키로 사용한다. - SEQUENCE : 데이터베이스에서 제공하는 시퀀스를 사용하여 기본키를 생성한다. - TABLE : 별도의 키 생성 테이블을 사용한다. ◎ IDENTITY와..
2023.02.28 -
JPA
◎ JPA(Java Persistance API) -> 자바 진영에서 사용하는 ORM 기술의 *표준 사양 * 표준 사양은 자바의 인터페이스로 사양이 정의되어 있어 JPA라는 표준 사양을 구현한 구현체는 따로 있음을 의미한다. ◎ Hibernate ORM -> JPA에서 정의한 인터페이스를 구현한 구현체로 JPA에서 지원하는 기능 외에 hibernate자체적으로 사용할 수 있는 API도 지원한다. ◎ 데이터 액세스 계층과 JPA -> jpa는 데이터 액세스 계층 상단에 위치한다. -> 데이터 저장, 조회 등 데이터 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해 진행되고, Hibernate ORM은 내부적으로 JDBC API를 사용해서 데이터베이스에 접근한다. ◎ 영속성 컨텍스트 -..
2023.02.23 -
JPA 프로젝트 생성하고 실행하기
◎ JPA 프로젝트 생성 -> H2 데이터베이스를 사용한다. -> 자바 라이브러리, 빌드 관리와 라이브러리 자동 다운로드 및 의존성 관리를 하는 메이븐을 사용한다. -> persistence.xml ☞ JPA설정 파일이다. ☞ persistence-unit name으로 이름을 지정한다. ☞ javax.persistence로 시작하는 것은 JPA표준 속성이다. ☞ "javax.persistence.jdbc.driver" value = org.h2.Driver : 데이터베이스 접근 조건으로 h2 Driver사용함을 나타낸다. ◎ 데이터베이스 방언 -> SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 방언이라고 표현한다. (ex 문자열을 자르는 함수를 SQL표준은 "SUBSTRING()", Ora..
2022.03.12