Spring/JPA

    JPA 플러시(flush())란?

    플러시(flush())란? 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 변경 감지(dirty checking)하여 수정된 엔티티에 대한 수정 쿼리를 쓰기 지연 SQL 저장소에 등록한다. 그 후 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다.(등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 호출 엔티티 매니저의 flush() 메서드로 영속성 컨텍스트를 강제로 플러시한다. 트랜잭션 커밋 - 플러시 자동 호출 트랜잭션만 커밋하면 DB에 반영되지 않는다. 따라서 트랜잭션을 커밋하기 전에 꼭 플러시를 호출해서 영속성 컨텍스트의 변경 내용을 DB에 반영해야 한다. JPA는 이런 문제를 예방하기 위해 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다. JPQL 쿼리 실..

    영속성 컨텍스트(Persistence Context) #2

    영속성 컨텍스트(Persistence Context) #2

    🧐 영속성 컨텍스트의 특징 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. (@Id로 테이블의 기본키와 매핑한 값) 영속성 컨텍스트에 엔티티를 저장하고 트랜잭션을 커밋하는 순간에 DB에 반영하는데 이것을 플러시(flush)라 한다. 1. 엔티티 조회 영속성 컨텍스트 내부에는 1차 캐시를 가지고 있다. 영속 상태 엔티티는 모두 이곳에 저장된다. // 엔티티 생성 (비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); // 엔티티를 영속 em.persist(member); 이렇게 코드를 작성했을때 다음 사진처럼 1차 캐시에 저장되게 된다. 이 상태에서..

    영속성 컨텍스트(Persistence Context) #1

    영속성 컨텍스트(Persistence Context) #1

    영속성 컨텍스트(Persistence Context)란? JPA를 이해하는데 가장 중요한 용어 "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity); 이 코드는 DB에 저장하는게 아니라 영속성 컨텍스트라는 곳에 저장하게된다. 즉, persist() 메서드는 엔티티 매니저로 entity를 영속성 컨텍스트에 저장한다는 의미이다. 이 영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어진다. (여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근 가능) JPA는 기본적으로 트랜잭션 단위로 영속성 컨텍스트가 부여되어 사용된다. (트랜잭션을 선언하지 않았을 때, 스프링 데이터 JPA를 사용한다면 JPA repository 코드 내부에서 트랜잭션을 별도로 사용한다.) 위 처럼 J..

    EntityManagerFactory와 EntityManager

    EntityManagerFactory와 EntityManager

    엔티티 매니저 팩토리(Entity Manager Factory)는 말 그대로 엔티티 매니저(Entity Manager)를 만드는 공장이다. 이 공장을 만드는 비용은 아주 많이 든다. 그래서 1개만 만들어서 애플리케이션 전체에 공유하여 쓰도록 설계되어 있다. 하지만 공장에서 엔티티 매니저를 생성하는 비용은 거의 들지 않는다. 엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하여 서로 다른 스레드 간 공유해도 문제가 없다. 엔티티 매니저는 여러 쓰레드가 동시 접근하면 동시성 문제가 발생하기에 쓰레드간 공유를 하면 안된다. 위 그림은 요청이 생길 때 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하여 동작하게 된다. 엔티티 매니저는 DB 연결이 필요한 시점까지 커넥션(conn)을 얻지 않는다. 그래서 ..

    JPA 구동 방식

    JPA 구동 방식

    JPA는 자바 애플리케이션과 JDBC API 사이에서 동작된다. 동작원리를 크게보면 다음과 같다. 개발자가 JPA에게 명령한다. JPA가 JDBC API 사용해서 SQL 호출 결과를 받아서 동작 🧐 여기서 JPA가 어떻게 구동되는지 좀 더 자세히 알아보자. 1. Persistence 클래스에서 META-INF/persistence.xml에서 설정 정보를 읽는다. 2. EntityManagerFactory를 만든다. JPA를 동작시키기 위한 기반 객체이기도 하고, JPA 구현체에 따라서 DB 커넥션 풀도 생성하므로 비용이 아주 크다. 따라서 EntityManagerFactory는 애플리케이션 전체에서 1번만 생성하고 공유해서 사용해야 한다. 3. EntityManager를 필요할때마다 생성하여 JPA를 동..

    hibernate.dialect 란?

    hibernate.dialect 란?

    🧐 Dialect란? JPA의 주요 특징인 "데이터베이스에 종속적이지 않다"를 쓰기위해 hibernate.dialect 를 쓴다. hibernate의 dialect로 데이터베이스 방언(언어, 사투리)을 설정할 수 있다. 서로 다른 데이터베이스 문법, 타입 등을 알아서 처리해주므로 개발자는 데이터베이스를 바꾸더라도 코드를 크게 바꾸지 않게 된다. 가변 문자 비교 MySQL : VARCHAR Oracle : VARCHAR2 문자열 자르는 함수 SQL 표준 : SUBSTRING() Oracle : SUBSTR() 이렇게 SQL 표준과 다르거나 특정 데이터베이스만의 고유 기능을 JPA에서는 방언(Dialect)라고 한다. 개발자는 JPA가 제공하는 표준 문법에 맞춰 사용하면 되므로, 특정 DB에 의존적인 SQL..

    JPA 소개 #2

    JPA 소개 #2

    🧐 ORM(Object Relational Mapping)이란? 객체와 관계형 데이터베이스를 자동으로 매핑(연결)해주는 것 패러다임의 불일치 문제를 해결 ( JPA소개#1 ) 자바 진영에도 여러가지 ORM 프레임워크가 있는데 그 중 하이버네이트 프레임워크가 가장 많이 사용된다. 대중적인 언어에는 대부분 ORM 기술 존재 🧐 JPA(Java Persistence API)란 무엇인가? 자바 진영의 ORM 기술 표준이다. 애플리케이션과 JDBC 사이에서 동작한다. 위 그림의 동작원리는 다음과 같다. 1. 개발자가 JPA에게 명령한다. 2. JPA가 JDBC API 사용해서 SQL 호출 3. 결과를 받아서 동작 🧐 객체를 저장하는 JPA 저장 동작원리를 예시로 알아보자 Member DAO에서 member 객체를..

    JPA 소개 #1

    JPA 소개 #1

    관계형 데이터베이스 = 대중적이고 안전한 데이터 저장소 자바로 개발하는 애플리케이션 대부분 관계형 데이터베이스 사용한다. DB 관리하려면 SQL을 사용해야 한다. 그래서 다음과 같은 원리로 사용하게 된다. JDBC API를 사용해 SQL을 DB에 전달하기에 개발자는 SQL을 다뤄야 한다. 🥲 SQL을 직접 사용할 때 발생하는 문제점 1. 반복 회원 조회 기능 → SQL 작성 회원 등록 기능 → SQL 작성 회원 수정기능 → SQL 작성 회원 삭제 기능 → SQL 작성 ....... → SQL 작성 이렇게 DB에 CRUD하거나 여러 테이블을 사용하려면 반복적이고 유사한 SQL과 JDBC API를 코드로 작성해야 한다. 2. SQL에 의존적 개발 회원 객체를 관리하는 MemberDAO 완성함. 그 후 회원의..