1. JPA 사용하기 전 문제
어플리케이션이 데이터베이스를 직접 다룰 때 다음과 같은 문제점이 있었다.
- 훨씬 더 번거롭다.
- SQL 의존적이라 변경에 취약하다. - ORM 이 없는 환경에서는 백엔드 개발자가 비즈니스 로직 개발보다, SQL 작성에 더 많은 노력을 들여야 했다. SQL 작성이 단순하고 반복적인데, 실수하기 쉽다는 단점도 있었다.
- 객체지향 모델과 관계형 데이터베이스의 패러다임 불일치가 발생한다. ( 아래 표 참조)
- 밀도 문제 : 데이터베이스의 데이터가 더 정형화되어있고 까다롭다.
- 관계형 데이터 베이스에는 상속의 개념이 없다. 하지만 상속은 객체의 역할과 구현을 분리해주기 위해 객체 지향 프로그래밍에서 가장 핵심적인 기능 중 하나이다.
이러한 패러다임 불일치에서 기인한 문제들과, 반복적이고 번거로운 어플리케이션 단에서의 쿼리 작업을 줄여주기 위해서 ORM(객체 관계 매핑)기술들이 등장하게 되었다
2. ORM, JPA 등장
JPA: Java Persistence API 자바 ORM 기술에 대한 표준 명세
JPA 역할
- 쿼리를 자동으로 만들어 준다.
- 어플리케이션 계층에서 sql 의존성을 줄여서 번거로운 작업을 단축시켜 준다.
- 패러다임의 불일치를 해결해준다.
- 특정한 상황을 제외하고는,성능도 높여준다. (최적화)
- 방언도 지원해준다. h2 Databse를 붙여도, mySql, oracle 뭘 붙여도 코드의 변경이 없다. 관계형 db이자 표준을 준수한 sql을 지원한다면, jpa가 방언들도 알아서 처리해준다.
3. DB 의 연관관계 이해
- 자바는 객체와 레퍼런스로, 데이터베이스는 테이블사이의 관계(FK)로 정보 사이의 연관관계를 표현하고 처리한다
- 이 두 방식의 차이를 해결해주기 위해서 JPA에는 “Java 어플리케이션 상에서”, “데이터베이스의 연관관계”를 표현해주기 위한 장치들을 가지고 있다.
< DB 의 연관관계 체크사항 >
✔️ JPA 가 제공하는 연관관계는 결국 DB 의 연관관계를 표현하기 위함
✔️ 따라서 먼저 DB 의 연관관계를 이해해야 한다.
✔️ DB 의 연관관계는 비즈니스 요구사항에 맞춰 이루어진다.
4. JPA 연관관계
JPA 의 경우는 Enitity 클래스의 필드 위에 연관관계 어노테이션 (@) 을 설정해 주는 것만으로 연관관계가 형성된다.
5. Spring Data JPA 이해
Spring Data JPA 는?
- JPA 를 편리하게 사용하기 위해, 스프링에서 JPA 를 Wrapping
- 스프링 개발자들이 JPA 를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반복적인 코드들을 Spring Data JPA 가 대신 작성해준다.
- Repostiory 인터페이스만 작성하면, 필요한 구현은 스프링이 대신 알아서 구현한다.
< Spring Data JPA 추가기능 구현방법 - Spring Data JPA 의 Query Methods >
6. JPA 영속성 컨텍스트 이해와 1차 캐시 이해
'1차 캐시' 사용의 장점
- DB 조회 횟수를 줄임
- '1차 캐시'를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장 (객체 동일성 보장)
- 1차 캐시 Entity 객체에만 업데이트 반영됨
- User DB 에는 반영되지 않음
Entity 업데이트 방법 (1)
- userRepository.save() 사용
Entity 업데이트 방법 (2)
-
- @Transactional 을 추가
- 굳이 userRepository.save() 함수를 호출하지 않아도, 함수가 끝나는 시점에 변경된 부분을 알아서 업데이트 해 줌 (이를 "Dirty check" 라고 함)
- 간단히 함수가 종료되는 시점에 각 Entity 에 save() 가 호출된다라고 이해
7. (참고) 하이버네이트 (Hibernate)?
- JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준
- 스프링 부트에서 기본적으로 "하이버네이트" 사용 중
'Coding > Spring' 카테고리의 다른 글
[16] IntelliJ 단축키 모음 (0) | 2022.12.07 |
---|---|
[15] JPA (2) 심화 (0) | 2022.12.07 |
[13] @Valid, @Validated (작성중. 수정필요) (0) | 2022.12.06 |
[12] 정규식(regex, rational expression) (0) | 2022.12.06 |
[11] Database 와 SQL (0) | 2022.12.06 |