View

JPA 원리 1: JPA 소개

soooeun 2024. 1. 16. 02:33

SQL 중심적인 개발의 문제점

애플리케이션을 개발할 때는 보통 객체 지향 언어로 개발한다.

데이터베이스는 대부분 관계형 DB를 사용한다.

→ 지금 시대는 객체를 관계형 DB에 관리함.

  1. 무한 반복되고, 지루한 코드.
    • CRUD만 무한 반복해서 개발함.
    • 중간에 필드가 수정되는 경우, 모든 SQL문을 수정해야함.
  2. 패러다임의 불일치: 객체 vs 관계형 데이터베이스
    객체(Object) → RDB, NoSQL, File, OODB 등 다양한 형태로 저장할 수 있음.
    하지만 현실적인 대안은 RDB를 선택한다.
    객체 → SQL → RDB: 이런 과정으로 RDB에 저장한다.

 

객체와 관계형 데이터베이스의 차이

  1. 상속
    데이터베이스 테이블에는 상속이 없다 → 슈퍼타입(ex. Item), 서브타입(ex. Album) 관계로 설계함.
    따라서 Album을 조회할 때: 각각의 테이블에 따른 조인 SQL 작성하고, 각각의 객체 생성하고…
    ⇒ 이렇게 복잡하기 때문에 DB에 저장할 객체에는 상속 관계를 안 쓴다.
    • 하지만 자바 컬렉션에 저장하면? → Album album = list.get(albumId);로 한 줄로 조회 가능하다.

  2. 연관관계
    • 객체는 참조를 사용한다.
    • 테이블을 외래키를 사용하기 때문에 JOIN을 해야한다.
    따라서, 객체를 테이블에 맞추어 모델링하면, Member가 team객체(참조)를 가지는게 아니라 team_id를 가지게 된다.
    → 이건 객체다운 모델링이 아니다.
    • 또한, SQL은 모든 객체를 미리 로딩할 수가 없다. 미리 로딩하려면 어마어마하게 긴 SQL문이 필요하다.
    • Ex. Member랑 연결된 Team이 소속된 Group의 …

  3. 데이터 타입
    똑같은 member를 SQL로 두 번 조회한 경우, 두 인스턴스를 다르게 인식한다.
    • 자바 컬렉션에서 조회하는 경우: 컬렉션에서 조회하기 때문에 같다고 인식한다.

  4. 데이터 식별 방법
    SQL을 사용할 때: 객체답게 모델링 할수록 매핑 작업만 늘어난다.

 

🤨 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까?

 

 

 

JPA 소개

: Java Persistence Api. 자바 ORM 표준.

JPA는 애플리케이션과 JDBC 사이에서 동작한다.

  • JPA 동작 방식 - Ex. 저장
    • Entity 분석
    • INSERT문 SQL 생성
    • JDBC API 사용
    • 패러다임 불일치 해결(상속 등의 문제…)

 

  • JPA는 인터페이스의 모음

 

 

JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
    • 저장(persist), 조회(find), 수정(setName…), 삭제(remove)

 

  • 유지보수
    • 기존에는: 테이블의 필드가 변경되면 모든 SQL을 수정해야 한다.
    • JPA는: 필드만 추가하면 됨. 유지보수할 부분이 줄어듦.

 

  • 패러다임 불일치 해결(상속 문제 해결)
    • 상속(슈퍼타입, 서브타입) 객체를 SQL로 넣을 때: 두 번의 SQL을 실행해야함.
    • JPA를 사용하면: 개발자는 그냥 album을 insert하기만 하면 된다. 나머지는 JPA가 알아서 2번의 SQL로 나눠서 실행시켜준다.

 

  • JPA와 연관관계, 객체 그래프 탐색
    • 자유롭게 객체 그래프를 탐색할 수 있다.
    • 지연 로딩으로 성능 최적화도 가능.

 

  • JPA의 성능 최적화 기능
    1. 1차 캐시와 동일성(identity) 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환(약간의 조회 성능 향상): 같은 객체를 조회하는 경우, 처음에만 SQL이 실행되고 두 번째 요청은 그냥 캐시에서 들고온다.
    2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
      • JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 전송한다.
    3. 지연 로딩(Lazy Loading)
      • 지연 로딩: 객체가 실제 사용될 때 로딩.(필요할 때마다 SQL을 실행)
      • 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회

'Develop > Spring' 카테고리의 다른 글

Record  (1) 2023.11.24
JPA2. 지연 로딩과 조회 성능 최적화(2) - ✨중요✨  (0) 2023.08.30
JPA2. API 개발 기본(1)  (0) 2023.08.25
JPA1. 웹 계층 개발(5)  (0) 2023.08.25
JPA1. 주문 도메인 개발(4)  (0) 2023.08.23
Share Link
reply
«   2025/07   »
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