□ Entity
- JPA에서 관리되는 클래스 객체를 의미
- Entity 클래스는 DB테이블과 매핑되어 JPA에 의해 관리됨
@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
@Id
private Long id;
// nullable: null 허용 여부
// unique: 중복 허용 여부 (false 일때 중복 허용)
@Column(name = "username", nullable = false, unique = true)
private String username;
// length: 컬럼 길이 지정
@Column(name = "contents", nullable = false, length = 500)
private String contents;
}
- @Entity에 (name = " ")으로 이름을 줄 수 있으며, 기본 값은 클래스명이다.
- Entity를 객체화 할 때 기본생성자를 사용, 클래스 내에 다른 생성자가 여부 확인 필요
□ 영속성 컨텍스트
- Entity를 효율적으로 쉽게 관리하기 위해 만들어진 공간
- 영속성 컨텍스트 : Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간
- EntityManager : Entity를 관리하는 관리자, EntityManagerFactory를 통해 생성
- EntityManagerFactory : 일반적으로 DB에 하나만 생성되어 애플리케이션이 동작하는 동안 사용됨,
Entity를 만들기 위해서는 DB에 대한 정보르 전달 해야함.
-> 정보 전달은 /resources/META-INF/ 위치에 persistence.xml파일을 만들어 정보 전달 - JPA의 트랜잭션 : 모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 변경을 반영하지만
SQL중 하나라도 실패한다면 모든 변경을 되돌린다.
START TRANSACTION; # 트랜잭션을 시작합니다.
INSERT INTO memo (id, username, contents) VALUES (1, 'Robbie', 'Robbie Memo');
INSERT INTO memo (id, username, contents) VALUES (2, 'Robbert', 'Robbert Memo');
SELECT * FROM memo;
COMMIT; # 트랜잭션을 커밋합니다.
SELECT * FROM memo;
※ COMMIT를 하기 전까지는 SELECT를 통해 조회는 가능하나 데이터베이스의 변경 발생하지않는다.
- 영속성 컨텍스트의 기능
- 1차 캐시 : - 영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고있으며 em.persist(memo)메서드가 호출되면 Entity 객체
캐시 저장소에 저장한다.
- 캐시 저장소에서 조회되지않으면 DB SELECT 조회 후 캐시 저장소에 저장
- DB 조회 횟수를 줄임
- 1차캐시를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장(객체 동일성 보장)
- 쓰기 지연 저장소
- 변경 감지(Dirty Checking) : 트랜잭션이 commit되고 em.flush();가 호출되면 Entity의 현재 상태와 저장한 최초 상태를 비교하여
변경내용이 있다면 Update SQL을 생성하여 쓰기지연 저장소에 저장하고 모든 쓰기 지연 저장소의
SQL을 DB에 요청한다. 마지막으로 트랜잭션이 commit되면서 반영된다.
특징 | 1차 캐시 | 쓰기 지연 저장소 |
범위 | 세션 단위 (세션 종료 시 사라짐) | 전역적 (애플리케이션 내 여러 세션에서 공유 가능) |
사용 목적 | 조회 성능 향상 및 변경 사항 추적 | 쓰기 성능 향상 및 데이터베이스 부하 감소 |
데이터 접근 방식 | 세션 내에서 엔티티를 캐시하여 조회 | 데이터는 캐시에 저장되었다가 비동기적으로 데이터베이스에 저장 |
일관성 관리 | Hibernate가 자동으로 관리 | 추가적인 일관성 관리 필요 |
□ Entity의 상태
- 비영속(Transient) : 영속석 컨텍스트에 저장되지 않아 JPA의 관리를 받지 않음( new를 통해 생성된 Entity객체)
- 영속(Managed) : persist()메서드를 통해 영속성 컨텍스트에 저장하여 관리되고있는 상태
- 준영속(Detached) :
- detach(entity) : 해당 entity를 준영속상태로 변경
- clear() : 모든 Entity를 준영속상태로 변경(비우기)하고 영속성 컨텍스트는 계속 사용가능
- close() : 영속성 컨텍스트 종료, 모든 Entity들은 준영속상태로 변경하고 영속성 컨텍스트 종료
- merge() : 준영속 상태에서 다시 영속 상태로 변경
- 영속성 컨텍스트에서 조회 없으면,
- DB조회
- 위 두개중에 있으면 Update 수행
- 없으면 Insert 수행
- 삭제(Removed) : remove(entity)메서드로 영속 상태의 entity를 삭제
'Java & Spring > Spring' 카테고리의 다른 글
29일차 - Spring강의(인증과 인가) (0) | 2024.08.23 |
---|---|
28일차 - Spring강의(Bean 수동 등록, Type중복 시 Bean 주입) (0) | 2024.08.22 |
25일차 - Spring강의(IoC와 DI) (0) | 2024.08.19 |
25일차 - Spring강의(3 Layer Architecture) (0) | 2024.08.19 |
21일차 - Spring강의(Spring MVC) (0) | 2024.08.12 |