-
JavaSpring 심화 강의 수강과 실습을 진행했습니다
저번 엽떡을 먹고 역류성 식도염이 도진것인지 명치쪽이 답답하고 몸도 아퍼서
오늘은 집중을 되게 못했던것 같네요 .. 정리하고 마치겠습니다
영속성 컨텍스트 : 엔티티를 영구 저장 하는 환경, 비유적으론 엔티티 매니저마다
개별적으로 부여되는, 어떠한 논리적 공간JPA 엔티티의 상태 - 1차 캐시라는 것을 가지고 있습니다
부하가 심한 작업을 자주하는 것을 줄여야 할 필요가 있어 영속성 컨텍스트 내부에 1차캐시를 둠- find(”memberB”)와 같은 로직이 있을 때 먼저 1차 캐시를 조회
- 있으면 해당 데이터를 반환
- 없으면 그 때 실제 DB로 “SELECT * FROM….” 의 쿼리를 내보냅니다.
- 그리고 반환하기 전에 1차캐시에 저장하고 반환
- “쓰기 지연 SQL 저장소”가 있습니다
- memberA, memberB를 영속화
- entityManager**.commit()** 메서드를 호출
- 내부적으로 쓰기 지연 SQL 저장소에서 Flush가 일어나고
- **“INSERT A”, “INSERT B”**와 같은 쓰기 전용 쿼리들이 DB로 흘러들어감
- DirtyChecking을 통해 데이터의 변경을 감지해서 자동으로 수정해줍니다..
- 사실 1차 캐시에는 DB의 엔티티의 정보만 저장하는것이 아닙니다.
- 해당 엔티티를 조회한 시점의 데이터의 정보를 같이 저장해둡니다.
- 그리고 엔티티객체와 조회 시점의 데이터가 다르다면 변경이 발생했다고 알 수 있겠죠?
- 해당 변경 부문을 반영 할 수 있는 UPDATE 쿼리를 작성해둡니다.
- 데이터의 어플리케이션 단의 동일성을 보장해줍니다!
Mapping 심화
- @Entity : 기본 생성자는 필수이며, final 클래스, enum, interface 등에는 사용 할 수 없음
- @Table : 엔티티와 매핑할 테이블의 이름
- @Column : 객체 필드를 테이블 컬럼에 매핑하는데 사용 ( 생략 가능 )
- @Enumerated : Enum 테이블에 사용 ( Ordinal, String ) - String 해당 문자열 그대로 저장해서
비용 크지만 Enum 변경되도 위험 없어서 일반적으로 사용함
Proxy : 지연 로딩 기능 사용을 위한 가짜 객체 = 프록시 객체
- 즉시 로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회 @ManyToOne(fetch = FetchType.EAGER)
- 지연 로딩 : 연관된 엔티티를 실제 사용할 때 조회설정 방법 : @ManyToOne(getch = FetchType.LAZY)
- 1차 캐시라는 것을 가지고 있습니다