[JPA 기본] JPA란?

강신현·2022년 7월 5일
0
post-thumbnail

SQL 중심적인 개발의 문제점

  1. 지루한 코드의 무한 반복
    • CRUD의 반복
    • 자바 객체를 SQL로, SQL을 자바 객체로 변환하는 과정의 반복
  2. 객체 지향과 관계형 데이터베이스 간의 패러다임 불일치
    • 객체지향 : 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공
    • 관계형 데이터베이스 (RDB) : 데이터를 잘 정규화해서 보관
      -> 패러다임이 다른 두 가지를 가지고 억지로 매핑(Object를 RDB에 넣으려고)하기 때문에 여러 가지 문제가 발생한다.

JPA의 필요성

즉, 객체답게 모델링 할수록 매핑 작업만 늘어난다.
객체를 자바 컬렉션에 저장하고 불러오듯(ex list.get)이 DB에 저장할 수는 없을까?
이 고민의 결과가 바로 JPA(Java Persistence API) 이다.

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
    • 기존: 필드 변경시 모든 SQL 수정
    • JPA: 필드만 추가하면 됨, SQL은 JPA가 처리
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 벤더 독립성 (https://www.inflearn.com/questions/302720)
  • 표준

https://gmlwjd9405.github.io/2019/08/03/reason-why-use-jpa.html

JPA

애플리케이션의 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해주는
자바 진영의 ORM 기술표준인 객체지향 기술

  • SQL 작성없이 객체를 데이터베이스에 직접 저장할 수 있도록 도와주는 기술로 애플리케이션과 JDBC 사이에서 동작한다.
  • ORM (Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑해주는 것

1. 저장

jpa.persist(member)

2. 조회

Member member = jpa.find(memberId)

3. 수정

member.setName(“변경할 이름”)

4. 삭제

jpa.remove(member)

중요한 것은 JPA가 SQL을 자동으로 생성해 준다는 것과, 패러다임 불일치를 해결해 준다는 것!

패러다임 불일치 해결

- 상속

저장
-개발자가 할일

jpa.persist(album);

-나머진 JPA가 처리

INSERT INTO ITEM ...
INSERT INTO ALBUM ...

조회
-개발자가 할일

Album album = jpa.find(Album.class, albumId);

-나머진 JPA가 처리

SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

- 연관관계, 객체 그래프 탐색

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

// 객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

-> 마치 객체를 자바 컬렉션에 저장하고 불러오듯(ex list.get)이 DB에 저장, 조회함

- JPA와 비교하기

String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); // SQL
Member member2 = jpa.find(Member.class, memberId); // 캐시
member1 == member2; // 같다.

-> 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장 (약간의 조회 성능 향상)

성능 최적화 기능

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

바로 위 코드처럼 같은 트랜잭션 안에서는 같은 엔티티를 반환하여 약간의 조회 성능 향상

2. 트랜잭션을 지원하는 쓰기 지연

(transactional write-behind)

  1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
  2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin(); // [트랜잭션] 시작
 
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋

만약 persist를 따로 보낸다면 3번의 네트워크를 타기 때문에 효율적이지 않다.
하지만 JPA는 JDBC BATCH SQL 기능으로 한번에 보내기 때문에 효율적이다.

3. 지연 로딩, 즉시 로딩

(Lazy Loading)

- 지연 로딩

객체가 실제 사용될 때 로딩

- 즉시 로딩

JOIN SQL로 한번에 연관된 객체까지 미리 조회

옵션에 따라 지연로딩을 할지 즉시 로딩을 할지 정할 수 있음
예를 들어, 멤버와 팀을 같이 많이 사용하는 경우에는 즉시 로딩이 유리하고 팀을 가끔 사용하는 경우에는 지연 로딩이 유리함

강사님은 개발할 때는 다 지연 로딩으로 하고 나중에 최적화 할 때 필요한 경우에만 즉시 로딩을 사용한다고 함

데이터 베이스 방언

JPA는 특정 데이터베이스에 종속되지 않는다.

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

profile
땅콩의 모험 (server)

0개의 댓글