일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- git
- 카카오
- 시스템호출
- C언어
- 알고리즘
- Spring
- 카카오 코테
- nestJS
- 카카오 알고리즘
- 스프링
- @Component
- 프로그래머스
- python
- nestjs auth
- 코테
- Nodejs
- 해시
- 컴포넌트스캔
- OpenCV
- 코딩테스트
- 가상면접사례로배우는대규모시스템설계기초
- 파이썬
- TypeORM
- @Autowired
- nestjs typeorm
- thymeleaf
- spring boot
- AWS
- C++
- 구조체배열
- Today
- Total
공부 기록장 💻
[Spring/JPA] JPA (Java Persistent API) 란? 본문
[Spring/JPA] JPA (Java Persistent API) 란?
dream_for 2023. 4. 24. 02:08자바 ORM 표준 JPA 프로그래밍 - 기본편(인프런) 참고
JPA란?
JPA는 Java Persistent API의 줄임말로, Java 진영의 ORM 기술 표준이다.
여기서 ORM (Object Relational Mapping) 이란, 객체와 관계형 데이터베이스를 매핑해주는 기술이다.
객체 지향 프로그래밍에서 객체는 객체대로 설계하고, 관계형 DB에서서는 DB, Table 대로 설계했을 때, ORM 프레임워크가 중간에서 이 둘을 연결하는 역할을 한 것이다.
JPA와 JDBC
JPA는 Java 어플리케이션이 DB와 SQL 문을 통해 연결되는 Connection 기술인 JDBC API와 JVM 사이에서 JDBC API를 보다 더 간단하게 사용할 수 있게 도와주는 중간다리의 역할을 한다.
JPA를 왜 사용해야 하는가?
1. SQL 중심적인 개발에서 객체 중심으로 개발 가능이 가능하다.
마치 Java에서 Collections 프레임워크를 이용해 메모리 기반으로 데이터를 저장하는 것과 같이 사용이 가능하다.
이를 통해 생산성이 증가하고, 유지보수에도 매우 편리하다.
아래와 같이 CRUD 기능에 대한 메서드가 이미 구현되어 있기 때문에 생산성이 향상된다.
jpa.persist(member) // 저장
Member member = jpa.find(memberId) // 조회
member.setName("이름") // 수정
jpa.remove(member) // 삭제
2. 패러다임의 불일치를 해결한다.
다음과 같이 상속 관계에 있는 Item과 Album, Movie, Book 객체에 대해서
여러 연관 관계를 맺고 있는 객체에 대한 복잡한 SQL 쿼리문 작성 없이,
JPA에서 구현된 간단한 메서드들을 이용하면 저장, 조회, 연관관계 저장 및 객체 그래프 탐색까지
패러다임의 불일치를 모두 해결해준다.
3. 동일한 Transaction 내에서 같은 엔티티 조회 보장
JPA는 Java 의 Collections에서 동일한 객체의 비교하는 것과 유사하게
동일한 트랜잭션 내에서 조회한 엔티티에 대해 두 엔티티가 서로 같은 객체임을 보장한다.
4. DB 성능 최적화 기능을 제공한다.
1) 1차 캐시와 동일성을 보장한다.
같은 트랜잭션 내에서는 위와 같이 같은 엔티티를 반환하게 되는데, 이 때 조회 성능이 향상된다고 할 수 있다.
DB Isolation Level이 Read Commit이어도, 애플리케이션에서는 Repeatable Read를 보장하는데
아래와 같이 100 번의 memberId 값을 갖고 있는 엔티티를 조회했을 때, 첫번째로 조회한 m1의 경우 쿼리문으로 동작하여 DB에서 데이터를 가져오지만, 동일한 객체 m2에 대해서 조회할 때는, 캐싱을 이용해 메모리 상에서 엔티티를 가져오게 된다.
결론적으로 아래의 경우 SQL을 1번만 실행한 것이라고 할 수 있다.
2) 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)을 제공한다.
하나의 트랜잭션을 커밋할 때가지 INSERT 또는 UPDATE SQL을 모아, JDBC BATCH SQL 기능을 사용해 한 번에 SQL 을 전송하고 commit 할 수 있다.
이를 통해 성능을 보다 최적화할 수 있게 된다.
3) 지연 로딩과 즉시 로딩 기능을 제공한다.
지연 로딩이란, 객체가 실제 사용될 때 로딩하는 것을 말하고,
즉시 로딩의 경우 JOIN SQL로 한 번에 연관된 객체까지 미리 조회하는 것을 말한다.
아래 예시와 같이, Member과 Team처럼 외래 키로 연관된 객체를 얼마나 많이 함께 조회하느냐에 따라 전략을 수립하여 지연 로딩과 즉시 로딩 중 어느 것을 사용할지 결정할 수 있다.
결론.. JPA를 잘 사용하기 위해서는?
결국 JPA라는 ORM 기술은 JAVA를 비롯한 객체 지향 프로그램의 객체와 관계형 DB의 엔티티를 매핑, 연결해주는 도구이다.
JPA를 잘 사용하기 위해서는 객체 지향의 개념과 관계형 DB의 개념에 대한 이해가 바탕이 되어야 한다.
'# Tech Studies > Java Spring • Boot' 카테고리의 다른 글
[Spring/JPA] 양방향 연관관계와 연관관계의 주인, mappedBy 란? (0) | 2023.04.25 |
---|---|
[Spring/JPA] 영속성 컨텍스트의 flush란? (0) | 2023.04.24 |
[Spring] 빈 스코프란? (Singleton, Prototype Scope) (1) | 2023.03.22 |
[Spring] @JsonProperty를 이용해 Json 데이터의 파라미터 key 값을 변경하여 전달하기 (0) | 2023.02.21 |
[Spring/Thymeleaf] 타임리프 템플릿 View에서 서버로부터 전달된 model 객체의 필드 값이 null인 경우 해결하기 (Safe Navigation Operator, ${객체?.필드}) (0) | 2023.02.16 |