티스토리 뷰
_JPA 란
- Java Persistence API
-
자바에서 DB에 데이터 CRUD 편하게 해주는 API
-
자바표준 ORM 프레임워크
-
Object relational mapping > 객체 관계 맵핑 > 객체와 테이블의 맵핑
-
- JPA는 인터페이스의 모음
_JPA 사용하는 이유 / 장점
DB를 사용하면서 자바 객체 ↔ SQL 변환하는 코드가 반복될 수 밖에 없다.
이 변환을 조금 더 쉽게해주는 것이 JPA이다.
JPA를 사용하는 이유가 돋보이는 예제로 같이 설명하겠다.
public class Student {
String name;
String studentNumber;
public Student(String name, String studentNumber) {
this.name = name;
this.studentNumber = studentNumber;
}
}
위 Student 객체로 SQL 쿼리를 이미 다 작성한 후에, 필드가 하나 더 추가된다면 쿼리문을 다 수정해야할 것이다.
하지만 JPA를 사용하면 쿼리 업데이트(?)가 쉽다.
1) 생산성
-
저장 : jpa.persist(Student)
-
조회 : Student student = jpa.find(studentId)
-
수정 : student.setName("홍길동")
-
삭제 : jpa.remove(student)
CRUD가 간단하게 가능하다
2) 유지보수
위에 Student를 예로 든것처럼, 필드가 추가될 때 쿼리까지 같이 수정할 필요가 없다.
_JPA 동작방식
-
저장
-
StudentDAO > JPA - JDBC API > INSERT SQL > DB
-
JPA가 적절한 INSERT 쿼리를 생성 (개발자가 쿼리 생성하는 것이 아님)
-
패러다임의 불일치를 해결해줌
-
-
-
조회
-
StudentDAO > find(id) > JPA - JDBC API > SELECT SQL > DB > Entity Object > StudentDAO
-
JPA가 적절한 SELECT 쿼리를 생성 (개발자가 쿼리 생성하는 것이 아님)
-
패러다임의 불일치를 해결해줌
-
-
_JPA 성능
1) 1차 캐시와 동일성 보장
같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
String studentId = "20181234"
Student s1 = jpa.find(Student.class, studentId); // SQL
Student s2 = jpa.find(Student.class, studentId); // 캐시
print(s1 == s2) // true
위의 경우 SQL이 1번만 실행됨
2) 트랜잭션을 지원하는 쓰기 지연
transaction.begin();
em.persist(studentA);
em.persist(studentB);
em.persist(studentC);
transaction.commit();
트랜잭션을 마지막에 커밋할 때까지 INSERT SAL을 모으고, 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보냄
3) 지연로딩과 즉시로딩
-
지연로딩 : 객체가 실제 사용될 때 로딩
-
즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
Spring/JPA 공부하면서 정리 목적으로 남기는 포스팅입니다.
문제가 있을 시, 댓글로 남겨주시면 수정하겠습니다.
참고자료
강의 : www.inflearn.com/course/ORM-JPA-Basic
서적 : <자바 ORM 표준 JPA프로그래밍> 김영한
'spring' 카테고리의 다른 글
[Spring boot] Controller, 정적 컨텐츠, MVC/템플릿 엔진, API (0) | 2021.01.04 |
---|---|
[Spring boot] 스프링부트 빌드하고 실행하기 (0) | 2021.01.03 |
[Spring boot] IntelliJ - Github 연동 방법 (0) | 2021.01.03 |
[SPRING/SPRING BOOT] RestTemplate을 이용한 HTTP 통신 (0) | 2020.04.26 |
- Total
- Today
- Yesterday
- LinearLayout
- C
- listview
- 안드로이드
- 알고리즘
- 스프링
- C++
- 윈도우
- 백준알고리즘
- RelativeLayout
- ConstraintLayout
- 스프링부트
- 운영체제
- 이진탐색트리
- OS
- DATABASE
- 퀵정렬
- 네트워크
- frameLayout
- BOJ
- 정렬 알고리즘
- adapter
- handshake
- Android
- windows
- HTTP
- 백준
- debug
- layout
- WinDbg
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |