기간
2023/3/20 ~ 2023/3/24

수업
실시간 ZOOM 수업


Day 17(Hibernate)

하드웨어에 저장하는 persistence(영속성)

@Entity 하이버네이트가 관리해줌

hibernate가 관리하는 entity를 repository에 save된 후 persistence context에 관리됨
→ 바로 조회하면 캐싱돼서 persistence context에서 가져오기 때문에 DB 조회 쿼리가 발생하지 않음
⇒ 영속화 시킨 객체의 디폴트 생성자를 리플렉션해서 호출함

영속화된 걸 update → flush() 변경

영속화되지 않은 걸 update → 변경 안 됨


Day 18(Repository)

영속 객체: @Entity, PC 안에 존재, PK 존재, 기본 생성자

준영속 객체: 영속 객체를 detach로 꺼낸 상태 → flush가 이뤄지지 않음: 더 이상 영속 객체가 아니라서 변경 감지가 이뤄지지 않음

entitiManager의 merge()

  1. PK 존재 확인 →PK가 존재하지 않으면 insert(transaction 종료 시점에)
  2. PK DB 조회
  3. transaction 종료 시점에 flush(update)
    ⇒ 쓰지 않음

JpaRepository를 상속한 interface를 어떻게 new 할까?
→ 서버 실행 시에 동적으로 클래스를 만듦: 리플렉션으로
⇒ Ioc 컨테이너에 동적으로 구현된 클래스가 빈으로 등록하고 컴포넌트 스캔(부모를 찾는다)


Day 19(연관관계)

insert, select만 하는 시스템
→ NoSQL

scalar
→ 한 건

vector
→ list [1, 2, 3, 4]

matrix
→ n차원

연관관계의 주인 조회
1. 주인이 아닌 애들이 있는지 찾는다. (user)
2. 연관관계에 있는 애들을 포함해서 가져온다. (join)
3. flat → ORM(Object Relational Mapping)

spring batch

jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        default_batch_fetch_size: 100

100건까지 쿼리 한번만 날림(join 안 하면 연관관계에 있는 테이블 조회가 따로 되겠지만 그것도 한 번씩만 됨)

N+1 문제 → in query → default_batch_size(or fetch join)

  1. 주인만 select 한다.
  2. 주인이 아닌 애들은 각각 select 한다.
profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글