엔티티의 4가지 상태에 대해 알아보자.
비영속(new/transient) | 영속성 컨텍스트와 전혀 관계가 없는 상태,
|
영속(managed) | 영속성 컨텍스트에 저장된 상태
|
준영속(detached) | 영속성 컨텍스트에서 지운 상태 |
삭제(removed) | 삭제된 상태 |
하나씩 조금 더 구체적으로 알아보자.
🍀 비영속(new/transient)
영속성 컨텍스트와 전혀 관계가 없는 상태, 객체를 생성’만’ 한 상태
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
🍀 영속(managed)
EntityManager.persist(entity);
영속 상태가 된다고 바로 DB에 쿼리가 날라가지 않는다. (즉, DB 저장 X)
transaction.commit();
트랜잭션의 commit 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라간다.
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 객체를 저장한 상태 (영속)
entityManager.persist(member);
🍀 준영속(detached)
영속성 컨텍스트에 저장되었다가 분리된 상태, 영속성 컨텍스트에서 지운 상태
- 준영속 상태로 만드는 방법
- em.detach() → 특정 엔티티만 준영속 상태로 전환
- em.clear() → 영속성 컨텍스트 완전히 초기화
- em.close() → 영속성 컨텍스트를 종료
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태 entityManager.detach(member);
- 준영속 상태에서는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
- Dirty Checking, Update Query
🍀 삭제(removed)
객체를 삭제한 상태(DB에서 삭제)
// 객체를 삭제한 상태
entityManager.remove(member);
🍀 Transaction 커밋 시점
- 쓰기 지연 저장소에 inset A , insertB 를쌓아 놨다가 commit 시점에 한꺼번에 DB에 반영
- transaction.commit() 되는 시점
- flush()
- JPA의 영속성 컨텍스트를 DB와 동기화하는 작업
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
- flush 동작 순서
- 변경 감지(엔티티와 스냅샷 비교) -> 스냅샷이란 최초의 엔티티 상태
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
- 플러시 방법
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
- commit()
- 내부적으로(자동으로) flush를 수행한뒤 트랜잭션을 끝낸다
- flush()
- 즉 flush로 전송된 쿼리는 rollback할 수 있지만 commit은 트랜잭션을 끝내므로 rollback 할 수 없습니다.
- flush는 쿼리를 전송하는 역할이고 commit은 내부적으로 flush를 수행한 뒤 트랜잭션을 끝내는 역할입니다
🍀 트랜잭션 시작, 종료 시점
트랜잭션이 자동으로 시작되는 시점은 아래와 같다.
- DML(INSERT, UPDATE, DELETE) 문장이 실행되는 경우
- DDL(CREATE, ALTER, DROP) 문장이 실행되는 경우
- DCL(GRANT, REVOKE) 문장이 실행되는 경우
트랜잭션은 아래와 같은 상황에 자동으로 종료 된다.
- COMMIT, ROLLBACK 문을 실행한 경우
- DDL 또는 DCL 문 실행
- 기계 장애 또는 시스템 충돌(crash)
- deadlock 발생
- 강제 종료
📍 Java의 Checked Exception과 Unchecked Exception
자바의 예외는 크게 3가지로 나눌 수 있다.
- 체크 예외(Checked Exception)
- 에러(Error)
- 언체크 예외(Unchecked Exception)
위의 사진을 보면, RuntimeException의 하위 클래스들이 Uncheck Exception 이라 하고 RuntimeException의 하위 클래스가 아닌 Exception 클래스의 하위 클래스들을 Checked Exception이라고 하는 것을 알 수 있다!
🍀 체크 예외(Checked Exception)
체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있댜.
예외 발생시 Rollback이 되지 않고 트랜잭션이 commit까지 완료됩니다.
- 존재하지 않는 파일의 이름을 입력(FileNotFoundException)
- 실수로 클래스의 이름을 잘못 적음(ClassNotFoundException)
🍀 언체크 예외(Unchecked Exception)
RuntimeException의 하위 클래스들을 의미한다. 체크 예외와는 달리 에러 처리를 강제하지 않으며,
말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.
예외발생시 Rollback 된다.
- 배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)
- 값이 null이 참조변수를 참조(NullPointerException)
'연합동아리 > SOPT' 카테고리의 다른 글
[NOW SOPT] SERVER - 2차 세미나 정리 (0) | 2024.04.17 |
---|---|
[NOW SOPT] SERVER - 1차 세미나 정리 (0) | 2024.04.10 |