ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] JPA 소개
    강의노트/JPA - 기본편 2021. 3. 31. 10:25

    SQL 중심적인 개발의 문제점

    지금 시대는 객체를 관계형 DB에 관리

    객체를 관계형 데이터베이스에 저장

    객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까? JPA의 탄생 배경

     

     

    SQL 중심적인 개발의 문제점

    • 무한 반복, 지루한 코드 (CRUD)
    • SQL 의존적인 개발을 피하기 어렵다
    • 패러다임의 불일치
      • 객체 vs 관계형 데이터베이스

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

    • 상속
    • 연관관계
      • 참조 vs FK를 이용한 조인
      • 객체는 한 방향으로 관계를 맺음 vs 테이블은 양방향으로 관계를 맺음
    • 데이터 타입
    • 데이터 식별 방법

    객체 그래프 탐색

    • 객체는 자유롭게 객체  그래프를 탐색할 수 있어야 한다.
    • '.'을 찍어서 연관된 객체를 탐색하는 것을 객체 그래프 탐색이라 한다.
      • 객체 그래프 탐색은 처음 실행하는 SQL에 따라 탐색 범위 결정

    객체 vs 관계형 데이터베이스 패러다임 불일치 

    • 엔티티 신뢰 문제
    • 모든 객체를 미리 로딩할 수는 없다.
      • 상황에 따라 동일한 회원 조회 메서드를 여러벌 생성해야한다.
    • 계층형 아키텍처에서 진정한 의미의 계층 분할이 어렵다.
    • 비교하기

    JPA 소개

    JPA란?

    • Java Persistence API
      • JPA는 인터페이스의 모음
    • 자바 진영의 ORM 기술 표준
    • 애플리케이션과 JDBC 사이에서 동작

    ORM (Object-relational mapping)

    • 객체는 객체대로 설계
    • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
    • ORM 프레임워크가 중간에서 매핑
    • 대중적인 언어에는 대부분 ORM 기술이 존재

    JPA를 왜 사용해야 하는가?

    • SQL 중심적인 개발에서 객체 중심으로 개발
    • 생산성
    • 유지보수
      • 기존 : 필드 변경시 모든 SQL 수정
      • JPA : 필드만 추가하면 됨, SQL은 JPA가 처리
    • 패러다임의 불일치 해결
      • JPA와 상속 : Table 슈퍼타입 서브타입 관계로 생성 후 패러다임이 안맞는 부분을 JPA가 해결
      • JPA와 연관관계, 객체 그래프 탐색
      • 신뢰할 수 있는 엔티티, 계층 : 지연 로딩
      • JPA와 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
    • 성능 최적화 기능
      • 1차 캐시와 동일성(identity) 보장
      • 트랜잭션을 지원하는 쓰기 지연 - INSERT (버퍼링)
        • JPA 옵션을 통해서 지정 가능
      • 지연 로딩과 즉시 로딩
        • 지연 로딩 : 객체가 실제 사용될 때 로딩
        • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
    • 데이터 접근 추상화와 벤더 독립성
    • 표준

    용어 설명

    객체 지향 프로그래밍

    추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공

     

    처음 실행하는 SQL에 따라 탐색 범위 결정

    SELECT M.*, T.*
    	FROM MEMBER M
        JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
        
    member.getTeam();	// OK
    member.getOrder();	// null

     

    엔티티 신뢰 문제

    class MemberService {
    	...
        public void process() {
        	Member member = memberDAO.find(memberId);
            member.getTeam();                // ???
            member.getOrder().getDelivery(); // ???
        }
    }

     

    비교하기

    // DAO를 통한 조회
    String memberId = "100";
    Member member1 = memberDAO.getMember(memberId);
    Member member2 = memberDAO.getMember(memberId);
    
    member1 == member2;   // 다르다.
    
    // 자바 컬렉션에서 조회
    String memberId = "100";
    Member member1 = list.get(memberId);
    Member member2 = list.get(memberId);
    
    member1 == member2;   // 같다.

     

    JPA 동작

     

    JPA와 연관관계, 객체 그래프 탐색

    // 연관관계 저장
    member.setTeam(team);
    jpa.persist(member);
    
    // 객체 그래프 탐색
    Member member = jpa.find(Member.class, memberId);
    Team team = member.getTeam();

     

    지연 로딩과 즉시 로딩

    // 지연 로딩
    Member member = memberDAO.find(memberId);  // SELECT * FROM MEMBER
    Team team = member.getTeam();
    String teamName = team.getName();          // SELECT * FROM TEAM
                                               // 실제 해당 객체의 값을 조회 시 쿼리가 나간다.
                                               
    // 즉시 로딩
    Member member = memberDAO.find(memberId);  // SELECT M.*, T.* FROM MEMBER M JOIN TEAM T..
    Team team = member.getTeam();
    String teamName = team.getName();

     

     

    참고 자료

    자바 ORM 표준 JPA 프로그래밍 - 기본편

    '강의노트 > JPA - 기본편' 카테고리의 다른 글

    [JPA] 플러시 (flush)  (0) 2021.05.27

    댓글

Designed by Tistory.