woowacourse-study / 2022-jpa-study

🔥 우아한테크코스 4기 JPA 스터디 (22.06.13~22.07.02) 🔥
5 stars 1 forks source link

[섹션 1, 섹션 2, 섹션 3] 루키 제출합니다. #2

Closed wishoon closed 2 years ago

wishoon commented 2 years ago

SQL 중심적인 개발의 문제점

패러다임의 불일치

  • 객체 vs 관계형 DB는 서로의 패러다임이 불일치
  • 객체는 필드, 메서드를 캡슐화하여 객체간의 연관관계를 맺는 것이 목표
  • 관계형 DB는 데이터를 잘 정규화 해서 보관하는 것이 목표

객체와 관계형 DB의 차이

  • 상속
  • 객체는 상속 관계가 있지만 관계형 DB는 상속관계가 없음
  • 관계형 DB에서 상속과 유사하게 Table 슈퍼타입 서브타입 관계가 있음
  • 연관관계
  • 객체는 객체 참조를 통해서 연관된 객체를 가져올 수 있지만, 관계형 DB는 외래키를 통해서 JOIN을 사용해 연관된 테이블을 가져올 수 있음
  • 객체는 단방향에서만 조회를 할 수 있지만, 관계형 DB는 양방향에서 외래키를 통해 조회를 할 수 있음


JPA

ORM & JPA

  • Object-relational mapping(객체 관계 매핑)
  • 객체는 객체대로 설계, 관계형 DB는 관계형 DB대로 설계
  • ORM이 중간에서 매핑해주는 역할을 수행
  • 자바 진영에서 사용하는 ORM 기술이 JPA

JPA를 사용함으로써 유의해야 하는 점


영속성 컨텍스트

엔티티 메니저 팩토리, 엔티티 메니저

  • JPA를 사용한 웹 어플리케이션은 일반적으로 하나의 EntityManagerFactory를 가짐
  • 사용자 요청이 올 때마다 EntityManagerFactory에서 EntityManager를 생성
  • 생성된 EntityManager는 커넥션 풀에서 connection 하나와 연결되어서 DB 작업 수행. 이때의 EntityManagerconnection과 밀접한 관계가 있으므로 스레드간에 공유 혹은 재사용하면 안됨

영속성 컨텍스트

  • 엔티티를 영구 저장하는 환경이며, 엔티티 매니저는 저장, 조회한 엔티티들은 영속성 컨테스트에 보관
  • 영속성 컨텍스트는 논리적인 개념임

영속성 컨테스트를 사용함으로 얻는 이점

  • 1차 캐시
  • 엔티티 조회 즉, em.find()를 사용했을 때 영속성 컨텍스트에 해당 엔티티가 있는 경우 쿼리를 날리지 않음
  • 이 이유는, 영속성 컨텍스트 내부의 1차 캐시에서 해당 엔티티를 생성하거나 조회했을 때 해당 엔티티를 저장하고 있기 때문
  • 단, 트랜잭션 단위가 1차 캐시의 생명주기이기 때문에 실질적 도움은 크지 않음
  • 영속 엔티티의 동일성 보장
  • 자바 컬렉션에서 값을 가져왔을 때, 동일한 값을 보장해주는 것 처럼, 영속성 컨텍스트에 저장된 같은 엔티티를 조회했을 때 동일성을 보장해줌
  • 이유는 1차 캐시를 사용하기 때문
  • 엔티티 등록, 트랜잭션을 지원하는 쓰기 지연
  • em.persist()를 수행한다고 데이터베이스에 insert 쿼리가 적용되지 않음
  • 쓰기 지연 SQL 저장소라는 곳에 insert 쿼리가 쌓이게 되는데, 트랜잭션을 커밋하는 시점에 batch를 통해서 한번에 insert를 수행함
  • 이를 통해, batch insert를 보다 편하게 사용할 수 있음 (성능 최적화)
  • 엔티티 수정 (변경 감지)
  • 엔티티를 조회한 후, 엔티티 속성을 수정하였을 때 update SQL을 사용해야 할 것 같지만 변경 감지로 인해서 필요 없음
  • 그 이유는 JPA는 데이터베이스 커밋을 하는 시점에 내부적으로 flush라는 것이 호출되는 데, 이때 현재 엔티티스냅샷이란 것을 비교
  • 스냅샵은 DB에서 영속성 컨텍스트 내부에 최초롤 들어온 상태를 보관하는 것을 말하기 때문에, 변경이 있을 경우 JPA쓰기 지연 SQL 저장소update SQL을 보내고, DB에 반영되게 되는 것

플러시

  • 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 작업 수행
  • 다음과 같은 순으로 플러시가 동작
    1. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 내용을 스냅샷과 비교해 수정된 엔티티를 찾는다. 있을 경우 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록
    2. 쓰기 지연 SQL 저장소에 있는 쿼리를 데이터베이스에 반영
  • 플러시에 대해서 오해하는 점으로 영속성 컨테스에 보관된 엔티티를 지우는 것이 아니라, 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이 플러시
injoon2019 commented 2 years ago

제목 형식 실화입니까?

wishoon commented 2 years ago

ㅋㅋㅋㅋㅋㅋㅋ 딱히 떠오르는게 없네유..