자바 ORM 표준 JPA 프로그래밍 - 기본편 수업을 듣고 정리한 내용입니다.

 

  • JPA의 내부 동작 방식
  • 객체와 관계형 데이터베이스 테이블을 올바르게 매핑하는 방법

📚 1. SQL 중심적인 개발의 문제점

📖 A. 무한 반복, 지루한 코드

  • 테이블이 생성될 때마다 CRUD SQL을 다 만들어줘야 한다.
  • 자바 객체 ↔️ SQL 과정을 반복

➡️ 너무 비효율적이며, SQL에 의존적인 개발을 피하기 어렵다!

 

📖 B. 패러다임의 불일치 - 객체 vs 관계형 데이터베이스

객체 지향 프로그래밍 : 상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.

관계형 데이터베이스 : 키와 값들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.

 

객체를 영구 보관하기 위해 다양한 저장소가 있다.

  • 파일에 저장할 시 검색할 수가 없다.
  • 관계 DB에 저장해야 하는데, 양이 광범위하게 많다. (수정할 때마다 작업해야함)

 

✔️ 객체와 관계형 데이터베이스의 차이
(1) 상속

관계형 DB에는 상속관계가 없다. (있어도 객체와 다른 상속관계)

스크린샷 2022-03-02 오후 6 27 46
  • 테이블에 따른 조인 SQL 작성, 각각의 객체 생성 매우 복잡하다.
  • 그러므로, DB에 저장할 객체는 상속 관계를 쓰지 않는다.

 

(2) 연관관계

스크린샷 2022-03-02 오후 6 34 52
  • 객체는 참조를 사용 : member.getTeam()
  • 테이블은 외래 키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID

 

➡️ 객체를 테이블에 맞추어 모델링 해야한다.
➡️ 테이블에 맞춘 객체 저장, 객체 모델링 저장까지는 아무 문제가 없다.

다만, 객체 모델링 조회할 때 상당히 복잡하다.
기존 객체 조회할 시

Member member = list.get(memberId);
Team team = member.getTeam();
  • 또한, 엔터티 신뢰 문제가 발생한다.

 

자바 컬렉션 사용

list.add(member);

➡️ 객체 모델링 조회를 자바 컬렉션에서 관리할시 간단하다.

 

✏️ 참고
데이터 타입, 데이터 식별 방법에서도 문제가 있다.

 

✔️ 그래서?

  • 객체지향 설계, 객체답게 모델링 할수록 매핑 작업만 늘어나고 더욱 힘들어진다.
  • 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까?

➡️ 해결책 : JPA(Java Persistence API)

 

📚 2. JPA - Java Persistence API

자바 진영의 ORM 기술 표준

✔️ ORM

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

 

✔️ JPA는 애플리케이션과 JDBC 사이에서 동작
스크린샷 2022-03-03 오후 12 11 24

  • 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용해서 SQL을 호출해서 DB와 통신한다.
  • 개발자가 직접 JDBC API를 사용하는 것은 아니다.

 

JDBC API : 자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준 → JDBC API를 사용하면, 특정 데이터베이스의 정확한 사용법에 대해 몰라도 된다!

 

✔️ JPA 동작 - 저장
스크린샷 2022-03-03 오후 12 12 21

  • MemberDAO에서 객체를 저장하기 위해서 Member 객체를 JPA에 넘긴다.
  • JPAMember 객체를 분석 후 적절한 INSERT query를 생성한다.
  • JPA가 내부적으로 JDBC API를 사용하여 INSERT query를 DB에 보낸다.

 

✔️ JPA 동작 - 조회

스크린샷 2022-03-03 오후 12 12 27
  • JPA에 조회 요청하면 JPA가 내부적으로 JDBC API를 사용해서 ResultSet을 가져온다.
  • JPAResultSet을 객체에 매핑해준다.

 

✔️ JPA는 표준 명세
스크린샷 2022-03-03 오후 12 21 49

  • JPA는 인터페이스의 모음
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
  • 하이버네이트, EclipseLink, DataNucleus

 

✔️ JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 벤더 독립성
  • 표준

 

✔️ 생산성

JPA에서는 이미 CRUD 코드가 구현되어 있다.

  • 저장 : jpa.persist(member)
  • 조회 : Member member = jpa.find(memberId)
  • 수정 : member.setName(“변경할 이름”)
  • 삭제 : jpa.remove(member)

 

✔️ 유지보수
기존에는 필드 변경시 모든 SQL 수정 (귀찮다.)

스크린샷 2022-03-03 오후 12 27 46

 

JPA를 사용시 필드만 추가하면 된다. SQL은 JPA가 처리한다.
스크린샷 2022-03-03 오후 12 27 58

 

✔️ JPA와 패러다임의 불일치 해결
1. JPA와 상속
2. JPA와 연관관계
3. JPA와 객체 그래프 탐색
4. JPA와 비교하기

 

상속 - 저장
스크린샷 2022-03-03 오후 12 31 22

 

상속 - 조회
스크린샷 2022-03-03 오후 12 31 28

 

연관관계, 객체 그래프 탐색
스크린샷 2022-03-03 오후 12 31 33

 

신뢰할 수 있는 엔티티, 계층
스크린샷 2022-03-03 오후 12 31 47

 

JPA와 비교하기
스크린샷 2022-03-03 오후 12 31 53

 

✔️ JPA의 성능 최적화 기능
(1) 1차 캐시와 동일성 보장

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

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

  • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
  • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

(3) 지연 로딩과 즉시 로딩

  • 지연로딩 : 객체가실제사용될때로딩
  • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

🔔 ORM

  • 객체와 RDB 두 기둥위에 있는 기술이다. (RDB 공부 많이 해야함)

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글