Spring/JPA기본

JPA란? JPA 장점, JPA 프로젝트 설정

Per ardua ad astra ! 2021. 7. 8. 11:45

ORM(Object-reational mpping)

=> 객체 관계 매핑. 객체지향 언어의 이점을 살려서 관계형 데이터베이스 언어에 접근하는 언어 

     객체는 객체대로 설계, 관계형 DB는 관계형 DB대로 설계가 가능하다.  

     이 둘 사이를 이어주는건(mapping) JPA가 알아서한다.

     

JPA(Java Persistence API)

- Java의 ORM 기술표준
- SQL을 한땀한땀 만드는 행동줄임(SQL 중심의 개발에서 객체 중심으로 개발 가능)

 

JPA의 장점

-> SQL문을 한땀한땀 만들고 수정하지 않아도 된다.
 ex) 만약 속성하나 추가 -> 모든 쿼리 수정
-> 객체지향 언어의 성질과 관계형 데이터베이스의 성질의 차이를 극복하기 쉽다. 
 ex) 자바의 컬렉션 형태의 데이터 처리방법을 그대로 사용하여 DB를 다룰 수 있다면 베스트이지 않을까? -> 대신 객체와 테이블을 제대로 설계하고 매핑할 줄아야한다. 
-> JPA와 패러다임의 불일치 해결 

 

단순예시


  JPA를 쓰지 않으면 (DB 드라이버를 활용해 데이터를 가져오면)

Member member1 = jpa.find(memberId) 
Member member2 = jpa.find(memberId)  
member1 != member2

  

JPA를 쓰면 
 

Member member1 = jpa.find(memberId) // SQL
Member member2 = jpa.find(memberId) // 캐시
member1 == member

왜?? JPA는 자바의 collection에서 꺼내온 것처럼 동일한 트랙잭션에서 조회한 엔티티는 같음을 보장하기 때문에 

JPA의 성능 최적화 기능
-> 1차 캐시와 동일성 보장
-> 트랙잭션을 지원하는 쓰기 지연


알아야할 것

- 객체와 테이블의 적절한 설계와 매핑
- 객체와 테이블을 제대로 설계하고 매핑하는 방법을 
- 기본키와 외래키 매핑
- 1:N, N:1, 1:1, N:M 매핑 
- JPA의 내부 동작 방식 제대로 이해
- JPA가 어떤 SQL을 만들어내는지
- JPA가 언제 SQL을 실행하는지


JPA와 CRUD

저장: jpa.persist(member)
조회: Member member = jpa.find(Member.class, memberId)
수정: member.setName("변경할 이름")
삭제: jpa.remove(member)

 


JPA 프로젝트 설정

 

1. 의존설정

pom.xml에서   

<dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.13.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>
</dependencies>


를 추가하고 메이븐 프로젝트 새로고침(인텔리제이의 경우 우측 상단에 아주 조그만 표시가 뜬다)을 한다.

hibernate는 jpa의 의존설정으로, h2databse는 데이터베이스 및 드라이버 의존설정으로 알아두자.
hibernate의 버전은 자신이 사용하는 springboot의 버전과 연동되는 버전으로 하는 것이 좋고, h2databse의 버전도 확인 해서 의존설정 해주는 것이 좋다.


2. JPA 설정

resource디렉토리 안에 META-INF라는 디렉터리를 생성한다. 그리고 persistence.xml 파일을 만들어서 

<?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>


를 복붙한다. JPA 표준을 설정하는 것으로 이해하자.

필수속성에는 jdbc.driver 설정을 h2로 하고 h2에서 설정한 user, password, 경로와 Dialect를 설정해준다.
+"JPA는 특정 DB에 종속하지 않는다" 는 장점이 있다. 
=> 가능이유: 각각의 DB에는 특정 방언(SQL 표준을 지키지 않는 특정 DB언어의 고유한 기능) 이 있는데 해당 DB에 따라 Dialect를 설정하면  JPA가 각 DB에 해당하는 Dialect를 생성해서 호환의 문제로 부터 자유로울 수 있다.

 

이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다. 
출처: https://www.inflearn.com/course/ORM-JPA-Basic#

 

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

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

www.inflearn.com