IT/개발

[Spring] JPA란

Terriermon 2021. 10. 29. 14:04

JPA

자바 진영의 ORM 기술 표준 명세

ORM(Object Relational Mapping)
객체-관계 매핑, 객체지향프로그래밍(OOP)의 클래스와 RDB의 테이블을 자동으로 매핑하는 것을 의미
객체는 객체대로, RDB는 RDB대로 설계하여 ORM이 중간에서 매핑하는 형태
https://geonlee.tistory.com/207

장점
- 완벽한 객체지향적인 코드: 클래스의 메서드를 통해 데이터베이스 조작
- 재사용성, 유지보수, 리팩토리 용이
- DBMS 종속성 ❌

단점
- 객체-관계 간의 불일치: 세분성, 상속성, 일치, 연관성, 탐색

3가지 구현체를 명세한 인터페이스 모음

 

동작 과정

동작 과정

- 애플리케이션과 JDBC 사이에서 동작

 

조회

저장

 

 

장점

 

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

 

- 생산성

> CRUD 간편

  • 저장: jpa.persist(class)
  • 조회: Class class = jpa.find(class.id)
  • 수정: class.setName("변경할 이름")
  • 삭제: jpa.remove(class)

- 유지보수

 

- 패러다임 불일치 해결

  개발자가 할 일 JPA가 처리
저장 jpa.persist(album); INSERT INTO ITEM
INSERT INTO ALBUM
조회 Album album = jpa.find(Album.class, albumId); SELECT I.*, A.* FROM ITEM I JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

 

- 성능 최적화

> 1차 캐시 기능

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

println(member1 == member2) //true

--> SQL이 1번만 실행되어서 TRUE가 Return

> 쓰기 지연(버퍼링), batch 기능

transasction.begin(); //트랜잭션

emp.persist(memberA);
emp.persist(memberB);
emp.persist(memberC);
// 데이터베이스에 바로 실행X

transaction.commit(); //트랜잭션 커밋시, 데이터베이스에 isnert sql을 보냄

> 지연로딩과 즉시로딩

Member member = memberDAO.find(memberId);
TEAM team = member.getTeam();
STring teamName = team.getName();

// 지연 로딩 --> 각각 실행
SELECT * FROM MEMBER;
SELECT * FROM TEAM;

// 즉시 로딩
SELECT M.*, T.* FROM MEMBER JOIN TEAM

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

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