1. JPA 사용하기 전 문제

어플리케이션이 데이터베이스를 직접 다룰 때 다음과 같은 문제점이 있었다.

  • 훨씬 더 번거롭다.
  • SQL 의존적이라 변경에 취약하다. - ORM 이 없는 환경에서는 백엔드 개발자가 비즈니스 로직 개발보다, SQL 작성에 더 많은 노력을 들여야 했다. SQL 작성이 단순하고 반복적인데, 실수하기 쉽다는 단점도 있었다.
  • 객체지향 모델과 관계형 데이터베이스의 패러다임 불일치가 발생한다. ( 아래 표 참조)

  1. 밀도 문제 : 데이터베이스의 데이터가 더 정형화되어있고 까다롭다.
  2. 관계형 데이터 베이스에는 상속의 개념이 없다. 하지만 상속은 객체의 역할과 구현을 분리해주기 위해 객체 지향 프로그래밍에서 가장 핵심적인 기능 중 하나이다.

이러한 패러다임 불일치에서 기인한 문제들과, 반복적이고 번거로운 어플리케이션 단에서의 쿼리 작업을 줄여주기 위해서 ORM(객체 관계 매핑)기술들이 등장하게 되었다

 

 

2. ORM, JPA 등장

JPA: Java Persistence API 자바 ORM 기술에 대한 표준 명세

 

JPA 역할

  1. 쿼리를 자동으로 만들어 준다.
  2. 어플리케이션 계층에서 sql 의존성을 줄여서 번거로운 작업을 단축시켜 준다.
  3. 패러다임의 불일치를 해결해준다. 
  4. 특정한 상황을 제외하고는,성능도 높여준다. (최적화)
  5. 방언도 지원해준다. 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 >

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#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() 가 호출된다라고 이해
    💡 정확한 이해 위해 필요한 추가학습 내용 : 쓰기 지연 SQL 저장소, flush, commit 등
  •  

 

 

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

+ Recent posts