개발/java

[Spring - JPA] 2. JPA 개요

ebang 2024. 2. 18. 19:30
반응형

JPA 설정하기

  • 위치가 정해져 있음.

  • Dialect ?

    • 데이터베이스들은 각각 SQL 문법과 함수가 조금씩 다르다.
      • 예를 들어 Mysql은 VARCHAR, Oracle은 VARCHAR2
      • 페이징 : Mysql은 LIMIT, Oracle은 ROWNUM
    • 방언 -> SQL 표준을 지키지 않는 특정 데이터베이스 만의 고유한 기능.

JPA 구동 방식

  • 설정정보를 보고 나서, entity manager factory를 만든다.

persistenceUnitName (pom.xml 에서 설정된 게 있음) 인자를 넣어서 createEntityManagerFactory

궁금한 점 : 트랜잭션마다 entity manager 를 새롭게 만들어야 하는 이유가 뭐지?

create table Member(
	id bigint not null,
	name varchar(255),
	primary key (id)
);
  • @Entity : em 이 관리할 객체
    • 트랜잭션 단위마다? em을 만들어서 수행해야 한다.
  • transaction 단위를 이용해서 데이터 변경 단위를 관리해야한다.
    • Transaction transaction = em.getTransaction();
    • transaction.begin();
    • transaction.commit();

  • class 이름과 다르게 데이터 베이스에 저장할 테이블 설정 가능

  • 필드 명과 칼럼 명이 다를 때도 설정 가능

데이터 베이스에 저장해두었던 정보 변경하기

  • 다시 저장을 하지 않아도 setName() 만 호출했는데도 실제 데이터베이스의 값이 변경된다.

  • 그렇게 되는 이유

    • 트랜잭션 커밋 직전에 변경된게 있다면 entity manager가 update 쿼리 문을 만들어서 날림.
  • 주의 할 점

    • entity manager factory는 애플리케이션 전체에 하나만 존재해야한다.
    • entity manager는 쓰레드 간에 공유하면 안된다.
    • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다.

하나만 찾는게 아니라 특정 조건을 만족하는 객체를 모두 찾고 싶다면?

JPQL

  • JPA 가 객체 지향 프로그래밍을 돕는 만큼 그에 맞는 쿼리를 사용한다: JPQL. (객체 지향 쿼리 언어)

  • JPA 를 사용하면 엔티티 객체를 중심으로 개발할 수 있다.

  • 문제는 검색 쿼리이다.

    • 검색을 할 때도 테이블이 아니라 엔티티 객체를 대상으로 검색한다.
    • 결국 검색조건이 포함된 SQL 이 필요한 것이다.
  • JPA는 SQL 을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.

  • SQL 과 문법이 유사하고 SELCT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.

  • JPQL은 데이터베이스 테이블을 대상으로 하는 sql과 다르게 엔티티 객체를 대상으로 쿼리를 작성한다.

  • 가장 단순한 조회방법

    • entityMamger.find({class} , {id})
  • 원하는 조건의 객체를 모두 조회하고 싶다면?

    • (내가 원하는 데이터를 최적화해서 가져오는 방법 & 통계 내기)

JPQL 사용 시 장점?

  • pagination (5번째부터 8번째까지 가져와라. )
  • 각 데이터베이스의 방언에 맞게 쿼리를 만들어줌.
  • sql 을 작성하는게 아니라 객체 중심으로 쿼리를 작성해서 사용할 수 있다.
반응형