JPA

Haechan Kim·2022년 9월 5일
0

Spring

목록 보기
15/68

관계형 db - oracle, mysql
sql 중심 개발의 문제점.
객체 vs 관계형 db
ㄴ 둘이 다르다!

  • 상속

  • 연관관계
    객체는 참조 사용, 테이블은 외래 키 사용
    객체는 한 방향, 테이블은 양방향

객체를 테이블에 맞춰 모델링

객체답게 모델링 할수록 매핑 작업 늘어남

객체를 자바 컬렉션에 저장하듯 db에 저장할 수는 없을까? - JPA

JPA - 자바진영 orm(객체 관계 매핑) 기술 표준

객체는 객체대로, 관계형 db는 관계형 db대로 설계.
orm 프레임워크가 중간에서 매핑.

sql 알아서 생성, jdbc api 사용.
패러다임 불일치 해결

  • JPA 소개

jpa는 인터페이스의 모음.
jpa를 구현한 구현체: 하이버네이트

생산성 - jpa와 crud
저장: jpa.persist(member)
조회: Member member = jpa.find(memberId)
수정: member.setName("변경할 이름")
삭제: jpa.remove(member)

마치 자바 컬렉션 처럼.

  • 지연 로딩과 즉시 로딩
    지연: 멤버, 팀 따로 조회
    즉시: 멤버, 팀 한번에 가져옴 - 멤버, 팀 항상 같이 불린다면 이거 쓰는게 좋다

orm은 객체와 rdb 두 기둥위에 있는 기술
rdb(관계형 db)공부 중요!! 사실 더 중요..

JPA 구동 방식

persistence 클래스에서 시작
-> 생성 -> EntityManagerFactory

jpa에서 '트랜잭션' 이란 단위 매우 중요!
데이터 변경하는 모든 작업은 꼭 트랜잭션 안에서 작업해야 함.

  • 수정
Member findMember = em.find(Member.class, 1L); // 찾고
findMember.setName("HelloJPA"); // 이름 수정하고

// em.persist(findMember); // 저장? 안해도 됨.
// 값만 바꿨는데 어떻게 되는거지?
// jpa가 변경이 됐는지 안됐는지 트랜잭션 커밋하기 직전에 다 체크.
// 바뀐게 있으면 업데이트 쿼리 날림. 트랜잭션 커밋 직전에.

엔티티 매니저 팩토리는 하나만 생성해서 앱 전체에서 공유
엔티티 매니저는 쓰레드간 공유 x (쓰고 버리기 close)

jpa의 모든 데이터 변경은 트랜잭션 안에서 실행!
트랜잭션이란? db에서 상태변화의 한 주기 (https://sky-h-kim.tistory.com/16)

  • jpql
    객체 지향 sql
    jpa는 엔티티 객체 중심 개발
    검색 퀴리시에도 테이블 아닌 '엔티티 객체' 대상으로 검색

  • 영속성 관리
    jpa에서 가장 중요한 두가지!
    ㄴ 객체와 관계형 db 매핑하기 (orm)

영속성 컨텍스트: 엔티티를 영구저장하는 환경이라는 뜻

// 여기까지는 비영속. 아무상태도 아님.
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");

// 여기서부터 영속상태
// em 내부에 영속성 컨텍스트 통해서 이 멤버가 관리됨.
em.persist(member);
// db에서 가져온 것이 아니라 1차 캐시에서 조회.
// 실행해 보면 select문 없음
Member findMember = em.find(Member.class, 101L);
Member findMember2 = em.find(Member.class, 101L);
System.out.println("findMember = " + findMember.getName());
System.out.println(findMember == findMember2); // 영속 엔티티의 동일성 보장

persist 까지는 insert 쿼리 db에 보내지 않음. commit 하는 순간에 보냄.
그동안 쓰기 지연 sql 저장소에 저장해둠.

  • 플러시
    commit 시 flush() 호출됨.
    ㄴ 플러시: 영속성 컨텍스트 변경 내용 db에 반영
    그때 엔티티와 스냅샷 둘 비교 -> 변경 감지 (Dirty Checking)
    엔티티가 변경 되었으면 업데이트 쿼리.

영속성 컨텍스트 변경 사항과 db 맞추는 작업.

변경 감지 -> 수정된 엔티티 쓰기 지연 sql 저장소에 등록 -> 쓰기 지연 sql 저장소 쿼리 db에 전송

플러시는 영속성 컨텍스트 비우는게 아님!
영속성 컨텍스트의 변경 내용 db에 동기화 하는게 플러시.

데이터베이스 스키마 자동 생성 - 앱 실행 시점에 (개발에서만 쓰기)
db 방언 활용해 db에 맞는 적절한 ddl 생성

운영 장비에는 절대 create, create-drop, update 사용하면 안됨!!

개발 초기에는 create 또는 update
여러 개발자 참여 테스트 서버는 update 또는 validate
스테이징, 운영 서버는 validate, none

직접 스크립트 짜서 넣는게 좋다. 가급적이면 로컬 pc에서만 쓰기.

0개의 댓글