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-영속성-컨텍스트란)
JDBC (Java Database Connectivity)
자바에서 db에 접속할 수 있도록 해주는 자바 api.
SQL Mapper
객체와 sql의 필드를 매칭해 데이터를 객체화하는 기술
객체의 테이블 간 관계 매핑하는 것이 아니라, sql문 직접 작성하고 쿼리 수행 결과를 어떤 객체에 매핑해 줄 지 바인딩하는 방법. 즉 sql에 의존적인 방법. (ex. mybatis, jdbcTemblate)
단점 :
sql 개발자가 직접 작성해야 함.
dbms에 종속적.
객체와 곤계형 테이블 구조 간 패러다임 불일치 발생
jpa는 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스.
hibernate는 jpa의 구현체.
spring data jpa는 jpa 추상화 시킨 리포지토리 인터페이스 제공
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차캐시에 저장한다.