[Spring] JPA (1)

2020. 8. 12. 19:23Spring/Spring

1. JPA

1) JPA

대부분의 프로그램은 사용자가 입력한 데이터나 비즈니스 로직 수행 결과로 얻은 데이터를 데이터베이스에 저장한다. 하지만 자바의 객체와 데이터베이스의 테이블이 정확하게 일치하지 않을 경우, 둘 사이를 매핑하기 위해 많은 SQL 구문과 자바 코드가 필요해진다. (BoardVO.java - BOARD 테이블)

 

ORM (Object Relation Mapping)은 정확하게 일치하지 않는 자바 객체와 테이블 사이를 매핑해준다. ORM은 자바 객체에 저장된 데이터를 테이블의 Row 정보로 저장하고, 반대로 테이블에 저장된 Row 정보를 자바 객체로 매핑해준다. 이러한 매핑 과정은 ORM 프레임워크에서 제공해준다. (BoardVO.java - ORM - BOARD 테이블)

 

지금까지 JDBC와 Mybatis를 이용하여 자바 객체와 테이블을 매핑해왔지만, SQL 명령어를 클래스나 외부 XML 파일에 작성해왔다. 하지만, ORM 프레임워크는 데이터베이스에 필요한 연동 SQL을 자동으로 생성하고, DBMS가 변경될 때 자동으로 변경이 되도록 해준다. 그저 DBMS가 변경되었음을 알려주기만 하면 된다.

 

객체와 테이블 간의 매핑을 구현한 기술은 EJB의 EnitityBean과 Hibernate 프레임워크, TopLink, Cocobase 등이 있다. 이 기술들 중 Hibernate 프레임워크가 ORM의 대표 프레임워크로 자리잡았다. 그리고 이러한 ORM 프레임워크들에 대한 표준화 작업의 결과가 JPA다.

2) JPA 특징

JPA (Java Persistence API)는 모든 ORM 프레임워크의 공통 인터페이스를 제공한다. JDBC는 DBMS에 종속되지 않는 연동을 구현한다. JDBC API 인터페이스 이용 시 데이터베이스 연동 처리는 해당 DBMS 드라이버 클래스들이 감당하는 구조이다. JPA도 마찬가지로 JPA API를 이용만 하면 원하는 ORM 프레임워크 서비스를 사용할 수 있다.

3) JPA 프로젝트 생성

일반 자바 프로젝트 생성을 위해 apache 'maven-archetype-quickstart'로 생성한다.

프로젝트 생성

4) JRE, JDK, JPA 설정

java 버전과 JPA와 jdk Runtimes 선택하고 Apply 버튼을 활성화 하기 위해 'Further configuration required...' 링크를 통해 JPA Implementation을 Disable로 변경하고 저장한다. 설정이 끝나게 되면, /src/main/java/META-INF/persistence.xml 파일이 생성이 된다.

JRE, JDK, JPA 설정

5) 라이브러리 추가

pom.xml

pom.xml

6) 엔티티 클래스 생성

데이터베이스의 테이블과 매핑될 영속 클래스를 생성하여 매핑 관련 설정을 추가한다. 일반 VO 클래스 작성처럼 생성하면 되지만, 이클립스에서 제공하는 JPA Entitiy 생성 기능을 이용한다. 생성 시 persistence.xml 파일에 Board 엔티티 클래스가 자동으로 등록된다.

엔티티 클래스 매핑

7) 엔티티 클래스 작성

JPA 매핑 관련 어노테이션을 설정한다. 엔티티 클래스의 모든 멤버변수는 private로 선언한다. 일반적으로는 객체를 식별하기 위한 유일 식별자를 사용하지 않지만, 영속 객체가 테이블과 매핑될 때 객체 식별 방법이 필요하기에 유일 식별자를 소유하는 클래스로 작성한다.

 

각 변수에 해당하는 Getter / Setter를 설정하고 필요한 어노테이션을 설정한다.

어노테이션 설명
@Entity 엔티티 클래스임을 알리고, 테이블과 매핑된다.
@Table 엔티티와 관련된 테이블을 매핑한다.
@Id 엔티티 클래스 필수 어노테이션으로 특정 변수를 테이블의 기본 키와 매핑한다. @Id 어노테이션이 없는 엔티티 클래스는 JPA가 처리하지 못한다.
@GeneratedValue @Id가 선언된 필드에 기본 키를 자동으로 생성하여 할당할 때 사용한다. 데이터베이스에 따라 자동으로 결정된다.
@Temporal 날씨 타입의 변수에 선언하여 날짜 타입을 매핑할 때 사용한다. TemporalType의 DATE, TIME, TIMESTAMP 중 하나를 선택할 수 있다.
/src/main/java/
Board.java

Board.java

8) persistence.xml

JPA는 persistence.xml 파일을 사용하여 필요한 설정 정보를 관리한다. 설정 파일이 META-INF 폴더 하위에 있을 경우 별도 설정없이 JPA가 인식한다.

/src/main/java/META-INF/
persistence.xml

persistence.xml

9) 테스트 클라이언트

영속성 유닛 (persistence-unit)을 이용하여 EntityManagerFactory 객체를 생성하고 JPA를 이용하여 CRUD 기능을 구현하기 위해 EntityManagerFactory로부터 EntityManager 객체를 얻어온다.

/src/main/java/
BoardServiceClient.java

BoardServiceClient.java

실행 결과로는 Hibernate를 JPA 구현체로 사용했기에 다양한 로그를 확인할 수 있다. hibernate_sequence를 통해 입력할 게시글의 일련번호를 얻고 글 등록을 처리한다. INSERT 문이 자동으로 동작하는 것을 확인할 수 있고 SELECT 문도 자동으로 생성되고 있음을 확인할 수 있다.

구현 화면

구현 화면

※ 버전 간 문제 발생 시 hibernate 버전 정보를 5.4.20.Final로 pom.xml을 수정한다.

 


[참고] ultrakain.gitbooks.io/jpa/content/chapter2/chapter2.5.html

[참고] 스프링 퀵 스타트

728x90

'Spring > Spring' 카테고리의 다른 글

[Spring] JPA 스프링 연동  (0) 2020.08.13
[Spring] JPA (2)  (0) 2020.08.12
[Spring] Dynamic SQL 검색 처리  (0) 2020.08.12
[Spring] Mybatis 스프링 연동  (0) 2020.08.12