수진개발서
article thumbnail

서론

요즘은 필수 기술스텍이 된 JPA를 학습하려고 한다.
왜 JPA를 사용하는 것인지? JPA는 무엇인지? 그리고 마지막으로 JPA의 사용 환경을 셋팅하면서 실습 준비를 할 것이다.
해당 포스팅은 모두 김영한님의 "자바 ORM 표준 JPA프로그래밍-기본편"을 기반으로 작성하는 것이다.

JPA란?

JPA가 무엇인지 정의하기 전에 한 가지 개념에 대해 알아야한다.

ORM(Object Relational Mapping) 이란?

  • RDB테이블을 객체지향적으로 사용하기 위한 기술
  • 객체와 RDB의 테이블을 매핑하여 자바 프로그램 코드상에서 RDB를 객체지향적으로 쓸 수 있게 고려한 기술
  • 객체는 객체대로 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑

이와 마찬가지로 자바의 영속성 관리와 ORM을 위한 표준 기술이 JPA(Java Persistent API)이다.

JPA 사용 이유?

객체와 관계형 데이터 베이스는 패러다임이 불일치하다.
- 객체지향 프로그래밍: 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
- 관계형 데이터베이스: 데이터 중심으로 구조화, 집합적인 사고가 필요. 추상화, 상속, 다형성 같은 개념이 없다.


이처럼 패러다임이 불일치한 상황에서 자바 컬렉션에 저장하듯이 DB에 저장하는 방법인 JPA를 사용하게 된다.

한마디로 객체 중심의 애플리케이션 개발이 가능하다.

 

추가로,
스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 Spring-data-jpa프레임워크이지 JPA는 아니다.
순수 JPA는 Java진영에서 ORM으로 사용하는 인터페이스의 모음이다.

 

jpa

 

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

상속

케이스마다 조회하기 위해서는 JOIN과정이 필요하다. 하지만, 자바 컬렉션에 저장한다면?
list.get(albumId)로 해결할 수 있다.

연관관계

객체와 테이블에는 연관관계를 하기위해서는 외래키를 사용해야한다.

class Member {

    String id;      // MEMBER_ID 컬럼 사용
    Long teamId;    // TEAM_ID FK 컬럼 사용
    String userName;
}

class Team {

    Long id;        // TEAM_ID PK 사용
    String name;
}

Member 객체에서 연관된 Team 객체를 조회할 수 없다.

즉, 객체 지향의 특징을 잃어버린다.

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

객체를 조회할 때 외래키를 참조로 변환하는 일을 JPA가 처리해준다.

JPA 환경셋팅

라이브러리 버전 선택방법

Spring > Project > SpringBoot > 내가 사용하는 SpringBoot 버전의 공식문서 확인 > 검색을 통해 사용하는 버전을 확인

필자는 6.2.5.Final버전을 사용하면 된다.

JPA라이브러리 & JPA 설정

JPA 라이브러리, 실습을 위한 h2라이브러리 다운 (pom.xml)

?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
 <modelVersion>4.0.0</modelVersion> 
 <groupId>jpa-basic</groupId> 
 <artifactId>ex1-hello-jpa</artifactId> 
 <version>1.0.0</version> 
 <dependencies> 
 <!-- JPA 하이버네이트 --> 
 <dependency> 
 <groupId>org.hibernate</groupId> 
 <artifactId>hibernate-entitymanager</artifactId> 
 <version>5.3.10.Final</version> 
 </dependency> 
 <!-- H2 데이터베이스 --> 
 <dependency> 
 <groupId>com.h2database</groupId> 
 <artifactId>h2</artifactId> 
 <version>1.4.199</version> 
 </dependency> 
 </dependencies> 
</project>

JPA 설정하기(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>
  • /META-INF/persistence.xml 위치
  • persistence-unit name으로 이름 지정
  • javax.persistence로 시작: JPA 표준 속성
  • hibernate로 시작: 하이버네이트 전용 속성

데이터베이스 방언

각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다. 따라서 데이터베이스 방언이라고 부른다.위의 명령어를 사용하는 데이터베이스에 맞게 바꾸어주면 된다.
하이버네이트는 40가지 이상의 데이터베이스 방언을 제공한다.

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> //h2 데이터베이스 
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle8iDialect"/> //oracle 데이터베이스 
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> //MySql 데이터베이스

Reference

https://ultrakain.gitbooks.io/jpa/content/chapter2/chapter2.5.html
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21711&category=questionDetail&tab=curriculum

 

학습 페이지

 

www.inflearn.com

 

2.5 persistence.xml 설정 · jpa

 

ultrakain.gitbooks.io

 

'코딩 > JPA' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (2) 2023.07.17
[JPA] 영속성 전이, 고아객체(Cascade)  (1) 2023.01.07
[JPA] Soft Delete 적용하기  (0) 2023.01.06
profile

수진개발서

@sujin_park0607

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!