[JPA-Basic][1] JPA란?

kiteB·2021년 10월 8일
0

JPA

목록 보기
1/28
post-thumbnail

[ 💡 강의 소개 ]

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

두 번째 로드맵의 첫 번째 강의, 자바 ORM 표준 JPA 프로그래밍 - 기본편을 시작하였다.


[ SQL 중심적인 개발의 문제점 ]

1. 지루한 코드의 무한반복

  • 기능을 하나 추가해서 테이블이 생성될 때마다 CRUD SQL을 다 만들어줘야 한다.
  • 자바 객체 ↔ SQL 과정의 반복

너무 비효율적이며, SQL에 의존적인 개발을 할 수 밖에 없다!

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

  • 객체 지향 - 추상화, 캡슐화, 정보은닉 등 시스템의 복잡성을 제어하는 다양한 장치들을 제공한다.
  • 관계형 데이터베이스 - 데이터를 잘 정규화하는 것이 목표이다.

패러다임이 다른 두 가지를 억지로 매핑하기 때문에 여러 가지 문제가 생긴다.


객체와 RDB의 차이

1. 상속

  • Object: 상속 관계가 있다.
  • RDB: 상속 관계가 없다.
    • Object의 상속 관계와 유사한 물리 모델로, Table 슈퍼타입-서브타입 관계가 존재한다.

2. 연관관계

  • Object: 참조를 사용한다.
member.getTeam()
  • RDB: 외래 키를 사용한다.
JOIN ON M.TEAM_ID = T.TEAM_ID

[ JPA 소개 ]

💡 JPA

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준

1. ORM이란?

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

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

2. JPA 동작

  • JPA는 애플리케이션과 JDBC 사이에서 동작한다.
    • 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용해서 SQL을 호출해서 DB와 통신한다.
    • 즉! 개발자가 직접 JDBC API를 사용하는 것은 ❌

📌 JDBC API

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

1) 저장

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

패러다임 불일치 해결!

2) 조회

  • JPA에 조회 요청하면 JPA가 내부적으로 JDBC API를 사용해서 ResultSet을 가져온다.
  • JPAResultSet을 객체에 매핑해준다.

3. JPA는 표준 명세

  • JPA는 인터페이스의 모음이다.
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
    • 하이버네이트, EclipseLink, DataNucleus
      → 이 중 대부분 하이버네이트를 사용한다.

4. JPA를 사용해야 하는 이유는?

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

1) 생산성

이미 기본적인 CRUD 코드가 구현되어 있다!

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

개발자는 이런 코드들을 그냥 가져다가 쓰기만 하면 된다. 🤸🏻‍♀️

2) 유지보수

  • 기존: 필드 변경 시 모든 SQL 수정
  • JPA: 필드만 추가하면 된다. SQL은 JPA가 처리!

3) JPA와 패러다임의 불일치 해결

JPA와 상속

  • 개발자:
jpa.persist(album);
  • 나머지는 JPA가 처리:
INSERT INTO ITEM ...
INSERT INTO ALBUM ...

JPA와 연관관계

  • 연관관계 저장
member.setTeam(team);
jpa.persist(member);

JPA와 객체 그래프 탐색

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

JPA와 비교하기

String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);

member1 == member2;	//같다!
  • 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.

4) JPA의 성능 최적화 기능

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

  • 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. → 약간의 조회 성능 향상
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);	//SQL
Member member2 = jpa.find(Member.class, memberId);	//캐시

println(member1 == member2);	//true

=> SQL 1번만 실행된다.

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

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

지연 로딩(Lazy Loading)

  • 지연 로딩: 객체가 실제 사용될 때 로딩
SELECT * FROM MEMBER
SELECT * FROM TEAM
  • 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
SELECT M.*, T.* 
FROM MEMBER
JOIN TEAM ...
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글