일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- #스파르타내일배움캠프
- Java의 이점
- 객체지향 언어
- 성장기록
- diary
- 인스턴스
- #내일배움캠프
- 클래스
- static
- 스파르타내일배움캠프
- 포맷은 최후의 보루
- Diary 해우소
- 메서드
- 스레드
- TiL_1st_0419
- 스파르타내일배움캠프TIL
- Git
- 생성자
- #스파르타내일배움캠프TIL
- GitHub
- JVM
- Github_token
- 해우소
- 감사기록
- 내일배움캠프
- Java
- 회고록
- KPT
- 변수의 다양성
- Token
- Today
- Total
몬그로이
Entity + JPA 본문
@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 는 괜찮음)