TIL_221010_자바 ORM 표준 JPA 프로그래밍_01 정리

창고·2022년 10월 10일
0

1. 강의 소개, 도입부

(1) JPA 도입, 실무에서 어려운 이유

  • 단순한 예제와 달리 실무는 수십 개 이상의 복잡한 객체와 테이블을 사용 -> 맞음 ㅋㅋ...
  • JPA의 내부 동작 방식을 이해하지 못하고 사용 -> 맞음 ㅋㅋ
  • 강의 목표 : 객체와 테이블 설계 매핑
    • 객체와 테이블을 제대로 설계하고 매핑하는 방법
    • 기본 키 외래 키 매핑
    • 1:N, N:1, 1:1, N:M 매핑
    • 실무 노하우 + 성능
    • 어떠한 복잡한 시스템도 JPA로 설계 가능
  • 강의 목표 : JPA 내부 동작 방식 이해
    • JPA 내부 동작 방식을 그림과 코드로 설명
    • JPA가 어떤 SQL을 만들어 내는지 이해
    • JPA가 언제 SQL을 실행하는지 이해
  • 학습 방법
    • JPA는 표준 스펙만 500페이지로 방대
    • 강의는 이론 + 라이브 코딩
    • 6단계의 실전 예제
    • 강의를 메인, 책은 참고서로

2. JPA와 모던 자바 데이터 저장 기술 (중요)

(1) SQL 중심적인 개발의 문제점

  • 지금 시대는 객체를 관계형 DB에 저장해 관리해야 함 -> SQL 중심적으로 될 수 밖에 없음
  • SQL 중심적 개발의 문제점 : 무한 반복, 지루한 코드 (CRUD, 자바 객체를 SQL로, SQL를 자바 객체로...)
  • 패러다임의 불일치 (객체 VS 관계형 데이터베이스)
  • 객체와 관계형 데이터베이스의 차이
    ㄱ. 상속 : 객체는 있으나 RDB는 없다고 해도 무방 (그나마 유사한 것은 슈퍼타입 서브타입)
    ㄴ. 연관관계 : 객체는 참조(member.getTeam())를 통해, RDB는 PK, FK로 Join (JOIN ON M.TEAM_ID = T.TEAM_ID)
    ㄷ. 객체에서는 쉽게 처리할 것도 RDB에서 처리하려면 단순 노가다 / 복잡해질 수 밖에 없음
    ㄹ. 객체 그래프 탐색 : 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하나 SQL과 엮이게 되면 처음 실행하는 SQL에 따라 탐색 범위가 결정되어버림 -> 엔티티 신뢰 문제가 발생
    -> 상황에 따라 동일한 회원 조회 메서드를 여러벌 생성해야 함 (회원, 회원-주문, 회원-주문-금액...)
    ㅁ. 비교하기 : 객체 끼리는 참조가 같을 경우 같은 객체로 처리하나, SQL과 연계할 경우 같은 객체라고 판단하지 않음
  • 결론 : 객체답게 모델링 할 수록 매핑 작업만 늘어나게 됨
  • 객체를 Java 컬렉션에 저장하듯이 DB에 저장하는 방법이 없을까? -> JPA의 탄생

(2) JPA 소개

  • JPA는 애플리케이션과 JDBC 사이에서 동작 (DB 처리에 필요한 SQL을 알아서 생성해줌)
  • JPA에서 가장 중요한 점 : 객체 - DB 간 패러다임 불일치를 해결함
  • JPA는 표준 명세 -> 인터페이스의 모음
  • Hibernate, EclipseLink, DataNucleus -> 대부분은 Hibernate
  • JPA를 왜 사용해야 하는가?
    • SQL 중심적인 개발 -> 객체 중심으로
    • 생산성 (CRUD가 아주 쉬움), 유지보수 (필드만 추가하면 되며 SQL은 JPA가 처리)
    • 패러다임의 불일치 해결
      • JPA와 상속 (JPA가 알아서 SQL 쿼리를 짜서 처리)
      • JPA의 연관관계
      • JPA와 객체 그래프 탐색 -> 신뢰할 수 있는 엔티티, 계층
      • JPA와 비교하기 -> 동일 트랜잭션에서 조회한 엔티티는 같음을 보장
    • 성능 최적화
    • 1차 캐시와 동일성(identity) 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환, 약간의 조회 성능 향상
      • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
    • 트랜잭션을 지원하는 쓰기 지연 (transactinal write-behind)
      • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
      • JDBC BATCH SQL 기능을 사용 한번에 SQL 전송
    • 지연 로딩 (Lazy Loading)
      • 즉시 로딩 : 객체가 실제 사용될 때 로딩
      Member member = memberDAO.find(memberId); -> SELECT M.*, T.* FROM MEMBER JOIN TEAM....
      Team team = member.getTeam();
      String teamName = team.getName();
      • 지연 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
      Member member = memberDAO.find(memberId); -> SELECT * FROM MEMBER
      Team team = member.getTeam();
      String teamName = team.getName(); -> SELECT * FROM TEAM    
    • 데이터 접근 추상화와 벤더 독립성
    • 표준
  • 결론 : ORM은 객체와 RDB 두 기둥 위에 있는 기술, RDB 공부도 아주 중요하므로 꾸준히 공부할 것
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글