몬그로이

Entity + JPA 본문

카테고리 없음

Entity + JPA

Mon Groy 2024. 5. 16. 21:03

@Entity

 

Java Persistence API (JPA)에서 사용되는 주석(annotation)으로,
객체를 데이터베이스 테이블에 매핑하기 위해 사용된다


@Entity(name="abc") 와 같이 사용할 수 있는데
디폴트 값으로 클래스명이 들어가기 때문에 abc에 클래스명을 챙겨 넣지 않아도 된다


@Id

해당 필드가 엔티티의 주요 식별자(primary key)임을 나타냄

+ 생성된는 고유한 값으로 client가 정하는 것이 아님


@GeneratedValue 

해당 필드가 자동으로 생성되는 값임을 나타냄

 

@Table

엔티티 클래스와 실제 데이터베이스 테이블 간의 매핑을 세부적으로 제어할 때 사용

기본적으로 JPA는 엔티티 클래스의 이름을 가지고 해당 클래스를 매핑할 테이블 이름을 유추한다

 

그러나 때로는 엔티티 클래스의 이름과 테이블 이름을 다르게 하거나, 

특정 데이터베이스 스키마에 매핑할 필요가 있을 때 사용


다양한 속성을 가지고 있어서 데이터베이스 테이블을 세부적으로 제어할 수 있다
schema, catalog, uniqueConstraints 등의 속성을 활용하여 추가적인 설정 가능

스키마(Schema)

RDB(관계형 데이터베이스)에서 데이터의 구조와 관련된 것을 정의하는 개념이다

데이터베이스는 하나 이상의 스키마를 포함하며,

각 스키마는 테이블, 뷰, 인덱스, 저장 프로시저, 함수 등과 같은 데이터베이스 객체들을 포함한다

JPA에서 @Table 어노테이션을 사용할 때

스키마를 지정하는 것도 가능하다

 


 

 

JPA


SQL을 직접 사용하지 않고도

데이터 베이스의 데이터들을 관리할 수 있게 해주는 Spring에서 제공하는 기능

이 때 관리 대상은 Entity들이고

이 Entity들을 영속성 context로써 관리하는데

1. 관리는 Entity Manager를 통해서 하게 된다
Entity Manager를 이용하기 위해서는 EntityManagerFactory를 생성해야 한다
애플리케이션 하나 당 하나만 생성 가능하다

EntityManagerFactory를 생성하는 방법
/resources/META-INF 에 persistence.xml 파일을 생성 후 정보를 넣는다

EntityManagerFactory 를 줄여서 emf 라는 변수명을 사용하는데
Test 이전에 @BeforeEach 아래 메서드에
emf = Persistence.createEntityManagerFactory("persistenceUnitName") 을 적어주어야
persistence.xml로 넘어가서 적용하기 시작한다
그 후에 em = emf.createEntityManager(); 를 통해서 EntityManager도 생성해 주어야 한다
그 후 테스트 코드에서 사용된다

2. 변경사항이 생겼을 때 바로 영속성 컨텍스트로써 할당하지 않고 유예를 둔다
이 때 필요한 개념이 트랜젝션이다
트랜젝션은 SQL 관리 방법의 일부로 특정 조건에 맞춰져야만 영구적으로 변경을 하는 것으로,
JPA에서도 변경된 정보를 처음부터 반영하지 않고,

Action Queue라고 할당된 저장소에 가지고 있다가 마지막에 요청이 왔을 때 영속성으로 할당배정한다


EntityTransaction et = em.getTransaction();

으로 불러온 후
et.begin();

으로 시작한다


try {
} catch {

문을 사용한다

et.commit();

영구적 으로 반영하겠다 //트랜젝션
et.rollback();

오류 발생했을 때 되돌리겠다 //트랜젝션

em.close(); 

사용한 EntityManager 종료 //매니저
emf.close(); 

사용한 EntityManagerFactory 종료 //매니저팩토리

3. 영속성 컨텍스트는 Entity 관리를 위해서 캐시저장소를 가지고 있다 
em.persist(); 캐시 저장소에 저장 //매니저

ex.printStackTraced();

4. 캐시저장소 조회 >> DB 조회

em.find(Memo.class, 1); 

캐시저장소에서 찾아줘 >> 없을 경우  DB 조회 진행됨

5. 삭제
Memo memo = em.find(Memo.class, 2);

key값이 2인 메모 찾아서 지워줘
em.remove(); memo

6. et.commit 이 필요 없음
컨텍스트 변경 내용을 DB에 반영
em.flush();

+. 테스트 할 때 디버깅으로 한는 이유는
문제가 발생했을 때 제대로 작동하는 지 확인해야 하기 때문

+. DELETE, INSERT, UPDATE 등으로 DB에 접근해야 하는 경우는

트랜젝션이 반드시 가동되어야만 실행시킬 수 있다. 

아니면 오류처리됨(SELECT 는 괜찮음)