JPA(1)

9mond·2023년 10월 10일
0
post-thumbnail

1. JPA

  • Java Persistence API
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 자바 진영(자바라고 하는 언어)의 ORM기술 표준
  • JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
  • JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping해준다.
  • JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하지 않는다.
  • 이 떄, JPA를 활용하면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해준다는 점에서 생산성을 크게 높인다.
  • 인터페이스이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함.
    -> 거의 Hibernate를 사용함. JPA import 할 때 Hibernate...를 사용하면 됨.

2. 데이터베이스 방언

  • JPA는 특정 데이터베이스에 종속되지 않는다.
  • 페이징 처리 : oracle -> rownum, MySQL -> limit
  • 가변문자 처리 : oracle -> varchar2, MySQL -> varchar
  • SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
    -> oracle로 설정하면 oracle이라고 하는 방언을 써서 쿼리를 작성하란 뜻이다.

3. @Entity

  • JPA가 관리할 객체라고 알려주는 것.
  • @Entity는 Java 언어와 관계형 데이터베이스와의 상호 작용을 쉽게 만들어주는 Java Persistence API (JPA)의 일부이다.
  • JPA는 Java 애플리케이션에서 데이터베이스와 상호 작용하기 위한 표준화된 방법을 제공하며, @Entity는 이 API의 중요한 어노테이션 중 하나이다.
  • @Entity 어노테이션은 Java 클래스를 데이터베이스 테이블로 매핑하는 데 사용된다.
  • 이 어노테이션을 클래스에 추가하면 JPA 구현체 (예: Hibernate)가 해당 클래스를 데이터베이스 테이블과 연결시키고, 클래스의 필드를 데이터베이스 테이블의 열로 매핑한다.
  • 이를 통해 Java 애플리케이션에서 객체 지향 코드와 데이터베이스 데이터를 쉽게 매핑하고 상호 작용할 수 있다.

4. @Id

  • 데이터베이스 PK와 매핑

5. 영속성 관리 - JPA 내부 구조

5-1. 영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어
  • 엔티티를 영구 저장하는 환경이라는 뜻
  • EntityManager.persist(entity);
    -> "entity"에 들어가는 객체(Team, Member..) 등을 DB에 저장하는 구나.. 싶지만, 좀 더 깊은 의미가 있다.
  • 결론 : DB에 저장하는 것이 아니라 "영속성 켄텍스트"라는 곳에 저장한다.
  • 중간 매계의 역할이다.
  • 영속성 컨텍스트는 논리적인 개념.
  • 눈에 보이지는 않지만 존재한다.
  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.
  • 엔티티 매니저를 생성하는 영속성 컨텍스트가 1:1로 생성된다.

5-2. 엔티티의 생명주기

  • 비영속(new/transient)
    -> 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속(managed)
    -> 영속성 컨텍스트에 관리되는 상태
  • 준영속(detached)
    -> 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed)
    -> 삭제된 상태

5-3. 비영속 상태

  • JPA와 전혀 상관이 없는 상태
	Member member = new Member();
	member.setId("member1");
	member.setUsername("회원1");

5-4. 영속 상태

  • JPA에 속해있는 상태
	Member member = new Member();
	member.setId("member1");
	member.setUsername("회원1");

	EntityManager em = emf.createEntityManager();
	em.getTransaction().begin();
	
	// 객체를 저장한 상태(영속)	
	em.persist(member);

5-5. 준영속 상태

  • 회원 엔티티를 영속성 컨텍스트에서 분리시킨 상태
	em.detach(member);

5-6. 삭제

  • 객체 삭제를 요청한 상태
	em.remove(member);

5-7. 영속성 컨텍스트의 이점

  • 1차 캐시가 가능하다.
  • 동일성(identity)보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 변경감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

5-8. 엔티티 조회 - 1차 캐시

  • 영속성 컨텍스트와 식별자 값

    -> 엔티티를 식별자 값(@id로 테이블의 기본 키와 매핑)으로 구분
    -> 영속 상태는 식별자 값이 반드시 있어야 한다.
    -> 식별자 값이 없으면 예외 상황
  • 영속성 컨텍스트와 데이터베이스 저장

    -> JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영한다.
    -> 그 때 플러시(flush)라는 걸 실행한다.
profile
개발자

0개의 댓글

관련 채용 정보