ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1. JPA 소개 & JPA 시작하기
    Spring-Boot/자바 ORM 표준 JPA 프로그래밍 - 기본편 2022. 11. 14. 16:52

    목표1 - 객체와 테이블 설계 매핑

    - 객체와 테이블을 제대로 설계하고 매핑하는 방법

    - 기본 키와 외래 키 매핑

    - 1:N, N:1, 1:1, N:M 매핑

    - 실무 노하우 + 성능까지 고려

    - 어떠한 복잡한 시스템도 JPA로 설계 가능

     

    목표2 - JPA 내부 동작 방식 이해

    - JPA의 내부 동작 방식을 이해하지 못하고 사용

    - JPA 내부 동작 방식을 그림과 코드로 자세히 설명

    - JPA가 어떤 SQL을 만들어 내는지 이해

    - JPA가 언제 SQL을 실행하는지 이해

     

    객체와 관계형 데이터베이스의 차이

    1. 상속

    - 객체 상속관계 VS Table 슈퍼타입 서브타입 관계

    2. 연관관계

    - 객체는 참조를 사용 : member.getTeam()

        ㆍ엔티티신뢰문제 & 모든 객체를 미리 로딩할 수는 없다.

    - 테이블은 외래 키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID

    3. 데이터 타입

    4. 데이터 식별 방법

     

    JPA

    - Java Persistence API

    - 자바 진영의 ORM 기술 표준

     

    ORM

    - Object-relational mapping(객체 관계 매핑)

    - 객체는 객체대로 설계

    - 관계형 데이터베이스는 관계형 데이터베이스대로 설계

    - ORM 프레임워크가 중간에서 매핑

    - 대중적인 언어에는 대부분 ORM 기술이 존재

     

    JPA를 왜 사용해야 하는가?

    - SQL 중심적인 개발에서 객체 중심으로 개발

    - 생산성

        ㆍ저장: jpa.persist(member)

        ㆍ조회: Member member = jpa.find(memberId)

        ㆍ수정: member.setName("변경할 이름")

        ㆍ삭제: jpa.remove(member)

    - 유지보수

        ㆍ기존: 필드 변경시 모든 SQL 수정

        ㆍJPA: 필드만 추가하면 됨, SQL은 JPA가 처리

    - 패러다임의 불일치 해결

        ㆍ1.JPA와 상송

        ㆍ2.JPA와 연관관계

        ㆍ3.JPA와 객체 그래프 탐색

        ㆍ4.JPA와 비교하기

    - 성능

        ㆍ1. 1차 캐시와 동일성(identity) 보장

              º 1. 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상 

              º 2. DB Isolation Level이 Read Commit 이어도 애플리케이션에서 Repeatable Read 보장

        ㆍ2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)

              º 1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음

              º 2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

        ㆍ3. 지연 로딩(Lazy Loading)

              º 지연로딩 : 객체가 실제 사용될 때 로딩

              º 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

    - 데이터 접근 추상화와 벤더 독립성

    - 표준


    데이터베이스 방언

    - JPA는 특정 데이터베이스에 종속 X

    - 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름

        ㆍ가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2

        ㆍ문자열을 자르는 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR()

        ㆍ페이징 : MySQL은 LIMIT, Oracle은 ROWNUM

    - 방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

     

    - hibernate.dialect 속성에 지정

        ㆍH2 : org.hibernate.dialect.H2Dialect

        ㆍOracle 10g : org.hibernate.dialect.Oracle10gDialect

        ㆍMySQL : org.hibernate.dialect.MySQL5InnoDBDialect

    - 하이버네이트는 40가지 이상의 데이터베이스 방언 지원

     

    객체와 테이블을 생성하고 매핑하기

    - @Entity : JPA가 관리할 객체

    - @Id : 데이터베이스 PK와 매핑

     

    주의

    - 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유

    - 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다)

    - JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

     

    JPQL

    - JPA를 사용하면 엔티티 객체를 중심으로 개발

    - 문제는 검색 쿼리

    - 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색

    - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능

    - 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

     

    - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공

    - SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

    - JPQL은 엔티티 객체를 대상으로 쿼리

    - SQL은 데이터베이스 테이블을 대상으로 쿼리

     

    - 테이블이 아닌  객체를 대상으로 검색하는 객체 지향 쿼리

    - SQL을 추상화해서 특정 데이터베이스 SQL에 의존X

    - JPQL을 한마디로 정의하면 객체 지향 SQL

     

    댓글

Designed by Tistory.