WEB/JPA

0. 자바 ORM 표준 JPA 프로그래밍 - 기본편

www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

인프런에 있는 강의를 보며 정리한 내용입니다!

 

목표 : 객체와 테이블 설계 매핑 

- 객체와 테이블을 제대로 설계하고 매핑하는 방법

- 기본 키와 외래 키 매핑

- 1:N, N:1, 1:1, N:M 매핑

- 실무 노하우 + 성능 고려

- JPA 내부 동작 방식 이해하기

- JPA가 언제, 어떤 SQL을 만들어 실행하는지 이해

 

 

JPA를 배우기 앞서 어떤 문제점이 있었고 어떤게, 어떻게 개선되었는지 확인 해 볼것이다.

SQL 중심적인 개발의 문제점

 

현재

- 대부분 애플리케이션은 객체 지향 언어를 사용한다. 

- 관계형 DB 를 사용한다. (NoSQL 보다는 아직까지는 관계형)

 

결론적으로 객체를 관계형 DB에 관리해야한다. 

그러므로 SQL 밖에 모르는 관계형 DB를 관리하기 위해 SQL를 계속해서 써줘야하 한다 -> 지루하고 무한 반복되는 코드가 추가된다

 

패러다임의 불일치

객체 vs 관계형 데이터베이스

 

* 관계형 데이터베이스 

- 객체 -> SQL 변환 -> SQL -> RDB

   SQL 로 변환하기 위해 개발자가 각각의 SQL문을 작성하는 노가다를 한다.

- 진정한 의미의 계층 분할이 어렵다. 

- Entity를 신뢰할 수 없다. 

   해당 쿼리가 어떤걸 조회해서 가지고 오는지 눈으로 확인하지 않는 이상 정확하게 알기 어려움

- 모든 객체를 미리 로딩할 수 없다

   객체를 조회할 때 조건을 주고 싶다면 해당 SQL를 또 작성해야 한다.

 

* 객체

자바 컬렉션에서 조회를 한다면?

같은 주소값을 바라보게 되기 때문에 같은 반환 값을 갖고 있어 Entity를 신뢰할 수 있다.

하지만 객체답게 모델링 할수록 매핑 작업만 늘어나게 된다.  -> 그래서 SQL 중심적인 개발을할 수 밖에 없었다.

 

이렇게 생겨난게 JAVA 진영의 ORM 기술 표준 JPA 이다.

 

ORM은 뭘까?

ORM은 Object Relational Mapping 즉, 객체-관계 매핑의 줄임말이다. 객체-관계 매핑을 풀어서 설명하자면 우리가 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational DataBase)에서 쓰이는 데이터인 테이블 자동으로 매핑(연결)하는 것을 의미한다. 그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생하는데, 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. 따라서 ORM을 이용하면 따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.

출처: https://geonlee.tistory.com/207 [빠리의 택시 운전사]

 

프로젝트 세팅, 실습 

더보기

0. h2 설치 - 가상DB

h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Suppor

h2database.com

1. 의존성 설정

hibernate를 의존성에 추가해줄건데. 보통 JPA는 Spring과 연동하여 사용하기 때문에 

docs.spring.io/spring-boot/docs/current/reference/html/appendix-dependency-versions.html#dependency-versions

 

Dependency versions

 

docs.spring.io

에서 사용할 Spring 프로젝트 버전에 맞춰 hibernate를 버전을 사용한다.

    implementation 'org.hibernate:hibernate-entitymanager:5.4.30.Final'
    implementation 'com.h2database:h2:1.4.200'

 

2. JPA 설정 - persistence.xml

- JPA 설정 파일

- /META-INF/persistence.xml  ( 표준위치 )

- javax.persistence로 시작 : JPA 표준 속성

- hibernate로 시작 : 하이버네이트 전용 속성

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

데이터베이스 방언  -> dialect  에 설정

- JPA는 특정 데이터베이스에 종속 하지 않는다. 

- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.

- SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능(방언)

 

JPA를 왜 사용해야 하는걸까?

1. 생산성

JPA에 쿼리가 만들어져 있기 때문에 불러와서 쓰기만 하면 된다.

예) 저장 : jpa.persist(member)

      조회 : Member member = jpa.find(memberId) 등등 ... 

2. 유지보수

기존에는 필드 변경시 모든 SQL을 수정해야 한다. (으읅 ㅠ)

JPA를 사용하면 필드만 추가하면 된다 SQL은 JPA가 해주기 때문이다!

3. 패러다임의 불일치 해결

- 상속

JPA가 저장을 하거나 조회를 할때 알아서 조인을 하거나 쿼릴르 날린다.

- 연관관계, 객체 그래프 탐색

자바 컬렉션에 넣는것 처럼 get으로 가져올 수 있음 -> 객체 그래프 탐색

연관관계(연관되어있는 다른 테이블의 데이터)를 저장하는것 또한 set으로 저장 -> 연관관계 저장

- 신뢰할 수 있는 엔티티, 계층

지연로딩이라는 기능이 있어서 자유로운 객체 탐색이 가능하다. 직접 가지고 온거기 때문에 신뢰할 수 있다.

 -> 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장

4. JPA의 성능 최적화 기능

- 1차 캐시와 동일성 보장

같은 트랜잭션 안에서는 같은 엔티티를 반환한다. -> 같은 조회를 하면 메모리에 있는 같은 값을 가지고 온다. (결과적으로 SQL 1번 실행)

- 트랜잭션을 지원하는 쓰기 지연

버퍼링 기능을 말한다. 트랜잭션을 커밋할 때까지 INSERT SQL을 모아준다 -> JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

- 지연 로딩 / 즉시 로딩

지연 로딩 : 객체가 실제 사용될 때 로딩

즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

 

 

 

그럼 JPA 안에서 JDBC는 어떻게 작동 되는걸까?

애플리케이션이 JPA에게 명령을 내려서 JDBC API를 사용 한다.

JPA가 중간에서 객체에 따라 SQL문을 자동으로 작성해주는 역할을 한다.

JPA 기본 - 김영한 / 인프런

JPA는 이렇게 생겨났어요!

 EJB(자바 표준) -> 하이버네이트(오픈 소스) -> JPA(자바 표준)

 

JPA는 이렇게 구성되어있어요!