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
5. 영속성 관리 - JPA 내부 구조
5-1. 영속성 컨텍스트

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

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

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
5-4. 영속 상태
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)라는 걸 실행한다.