티스토리 뷰
_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프로그래밍> 김영한
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
'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
- ConstraintLayout
- listview
- 알고리즘
- HTTP
- 정렬 알고리즘
- Android
- 이진탐색트리
- 운영체제
- debug
- adapter
- 스프링
- C
- windows
- BOJ
- 퀵정렬
- 안드로이드
- 스프링부트
- 윈도우
- LinearLayout
- 백준
- 네트워크
- WinDbg
- 백준알고리즘
- frameLayout
- RelativeLayout
- OS
- handshake
- C++
- layout
- DATABASE
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |