JPA

Haechan Kim·2023년 2월 3일
0

Spring

목록 보기
27/68

JPA와 ORM
JPA(Java Persistence API) : 자바 orm 기술에 대한 api 표준 명세.
jpa는 orm 사용위한 인터페이스 모아둔 것.

ORM (object relational mapping) : 객체와 db의 테이블을 자동으로 매핑해 주는 것.
즉 내가 코드 상에서 생성한 객체가 db상에 어떤 테이블과 연결이 된다는 뜻.
-> 객체 조작함으로써 db 조작할 수 있게 됨.
객체가 테이블이 되도록 매핑 시켜주는것.
sql 쿼리가 아닌 직관적 코드(메서드)로서 데이터 조작이 가능하다.
쿼리를 직접 작성하지 않기 때문에 생산성 높아짐. 비지니스 로직에 더 집중할 수 있음.
but, 쿼리가 복잡해지면 orm으로 표현에 한계가 있고, 성능이 raw query보다 느려짐.

특정 db에 종속되지 않음 -> 추상화한 데이터 접근 계층 제공하므로 설정에 사용 db만 지정하면 됨.

어떻게 자동으로 매핑을 해줄까?
-> 영속성 프레임워크 떄문.

  • 영속성 (Persistence)
    데이터 생성한 프로그램 종료되더라도 사라지지 않는 데이터 특성
    영속성 갖지 않는 데이터는 메모리에만 존재하므로 종료시 모두 없어짐

  • 영속성 프레임워크
    자료 db에 저장하는 과정 도와주고 자동화하는 매개 소프트웨어
    데이터 가공하는 자바 객체 층과 데이터 저장하는 db층 이어주는 역할

  • 영속성 컨택스트
    엔티티 영구 저장하는 환경.
    엔티티에 대한 캐시라고 생각.
    애플리케이션과 db 사이 객체 보관하는 가상 db 같은 역할
    엔티티 매니저 통해 엔티티 저장/조회 시 엔티티 매니저는 영속성 컨택스트에 엔티티를 보관/관리.

  • 영속성 컨텍스트의 특징 (https://velog.io/@neptunes032/JPA-영속성-컨텍스트란)

    • 1차 캐시
    • 동일성 보장
    • 쓰기 지연 (transactional write-behind)
      ㄴ 엔티티 매니저는 트랜잭션 커밋 직전까지 내부 쿼리 저장소에 insert sql 모아두고 트랜잭션 커밋 시 모아둔 쿼리 db에 보냄.
    • 변경 감지 (dirty checking)
      ㄴ 영속성 컨텍스트에서 관리하는 엔티티에 대한 db상 실제 업데이트는 commit/flush 시 엔티티에 대한 값이 조회할 때를 기준으로 변경됐는지 확인 후, 한번에 db에 대한 업데이트.
    • 지연 로딩
  • JDBC (Java Database Connectivity)
    자바에서 db에 접속할 수 있도록 해주는 자바 api.

  • SQL Mapper
    객체와 sql의 필드를 매칭해 데이터를 객체화하는 기술
    객체의 테이블 간 관계 매핑하는 것이 아니라, sql문 직접 작성하고 쿼리 수행 결과를 어떤 객체에 매핑해 줄 지 바인딩하는 방법. 즉 sql에 의존적인 방법. (ex. mybatis, jdbcTemblate)
    단점 :
    sql 개발자가 직접 작성해야 함.
    dbms에 종속적.
    객체와 곤계형 테이블 구조 간 패러다임 불일치 발생

jpa는 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스.
hibernate는 jpa의 구현체.
spring data jpa는 jpa 추상화 시킨 리포지토리 인터페이스 제공

jpa에서 중요한 것 두가지

  • 객체와 관계형 db 연결
  • jpa 내부 동작

jpa는 영속성 컨텍스트인 entityManager 통해서 entity 관리하고 이러한 엔티티가 db와 매핑되어 사용자가 엔티티에 대한 crud 실행했을 때 ->
엔티티와 관련된 테이블에 대한 적절한 쿼리문 생성하고 관리하고 있다가 ->
필요시 jdbc api 통해 db에 날림.

<질문>

  • ORM에 대해 간단히 설명하고 장단점에 대해 설명해주세요.
    ㄴ 객체와 db의 테이블이 매핑을 이루는 것이다. 즉 내가 코드 상에서 생성한 객체가 db상에 어떤 테이블과 연결이 되므로, 객체를 조작함으로써 db 조작할 수 있게 된다. 쿼리를 직접 작성하지 않기 때문에 생산성 높아지고 비지니스 로직에 더 집중할 수 있다. 하지만 쿼리가 복잡해지면 ORM으로 표현에 한계가 있고, 성능이 raw query보다 느려진다.

  • 영속성 프레임워크의 두 종류를 비교해서 설명해주세요.
    ㄴ ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간 관계를 바탕으로 sql을 자동생성 한다. SQL Mapper는 sql문을 직접 작성하고 쿼리 수행 결과를 어떤 객체에 매핑해 줄 지 바인딩하는 방법이다. 즉 객체와 sql문을 매핑해 데이터를 객체화 하는 기술이다.

  • 영속성이라는 개념에 대해서 설명해주세요.
    ㄴ 데이터 생성한 프로그램 종료되더라도 사라지지 않는 데이터 특성이다.
    영속성 갖지 않는 데이터는 메모리에만 존재하므로 종료시 모두 없어진다.

  • 영속성 컨텍스트란?
    ㄴ 엔티티를 영구 저장하는 환경으로 애플리케이션과 db 사이 객체 보관하는 가상 db 같은 역할을 한다.
    엔티티 매니저 통해 엔티티 저장/조회 시 엔티티 매니저는 영속성 컨택스트에 엔티티를 보관/관리한다.
    데이터의 CRUD를 다루는 클래스와 파일로 구성되어 있으며, JDBC의 복잡한 프로그래밍을 간단한 작업으로 대체해 빠른 개발과 안정적인 구동을 보장해준다.

  • 엔티티의 생명 주기에 대해서 설명해주세요.

  • 영속성 컨텍스트의 특징 중 1차 캐시와 그 과정에 대해 설명해주세요.
    ㄴ 영속성 컨텍스트 내부에 있는 캐시로 영속 상태의 엔티티를 이곳에 저장한다. 데이터 조회 시 1차 캐시에 해당 데이터가 있는지 탐색한다. 없으면 데이터베이스에 접근해 값을 탐색한다. 탐색 결과를 바로 리턴하는 것이 아닌 다음 탐색에서 재사용 할 수 있도록 1차캐시에 저장한다.

0개의 댓글