본문 바로가기
Framework and Tool/JPA

JPA - 환경구축 및 객체맵핑, persistence.xml

by ocwokocw 2021. 6. 23.

- 참조: 자바 ORM 표준 JPA 프로그래밍

- 참조: http://www.h2database.com/html/tutorial.html#creating_new_databases

- 환경 구축

JPA Project를 시작하기 위해 환경을 구축해보자. 환경설정은 STS(Spring Tool Suit) 의 Spring Starter Project 를 이용한다. 아래 그림을 참조하여 Maven과 Java 8 version 을 선택한다.

그 다음 화면에서 Dependency 를 고를 수 있다. Spring Web 과 Template 엔진으로 Thymeleaf 를 기본으로 선택해준다. H2 DB와 Spring Data JPA 를 선택한다.

설치를 끝냈으면 h2 를 다운받아야 한다. H2는 In-memory 형으로도 사용할 수 있지만 Server 모드로도 사용이 가능하다. http://www.h2database.com/html/download.html 에서 Last Stable version을 다운로드 한다. Windows Installer 로 설치하고 시작을 누르면 아래와 같은 화면을 볼 수 있다.

위에서 H2 Console 을 누르면 아래와 같이 화면이 뜬다. 아래화면에서 Generic H2 (Server)를 골라주고 비밀번호를 입력하지 않고 연결을 누르면 된다 고 책에는 되어있지만 나의 경우엔 되지 않는다.

인터넷을 좀 찾다보면 트러블 슈팅을 한 기록이 있다. http://www.h2database.com/html/tutorial.html#creating_new_databases 페이지를 참조해서 Embedded 형으로 database를 한번 생성해줘야 한다. 아래와 같이 그냥 엔터 입력하고 Password 도 엔터 입력하면 Connected 로 접속된다. quit 을 타이핑하여 종료해준다.

초기 접속화면은 아래와 같다. 이제 실습에 사용할 DDL 로 테이블을 생성해야 한다.

아래와 같이 DDL 을 입력하고 실행 버튼을 누르면 Navigator 에 MEMBER 테이블에 생기는걸 볼 수 있다.

 

CREATE TABLE MEMBER (
ID VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
AGE INTEGER NOT NULL,
PRIMARY KEY (ID)
)

 

MEMBER 테이블이 생성되었다.

 


- 객체 맵핑 및 persistence.xml

기본 코드를 통해 JPA를 이해해보자.

우선 객체를 맵핑하는 Member 클래스부터 살펴보자. 

 

@Entity
@Table(name = "MEMBER")
public class Member {

	@Id
	@Column(name = "ID")
	private String id;
	
	@Column(name = "NAME")
	private String userName;
	
	private int age;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Member [id=" + id + ", userName=" + userName + ", age=" + age + "]";
	}
}

 

위의 코드에서 나타나는 어노테이션들은 아래와 같은 용도로 사용된다.

  • @Entity: 해당 클래스를 테이블과 맵핑한다고 JPA 에게 알려준다
  • @Table: name 속성의 값으로 테이블과 맵핑한다.
  • @Id: 테이블의 기본 키에 맵핑한다.
  • @Column: 필드를 테이블 컬럼에 맵핑한다.
  • 생략: age 필드와 같이 맵핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명에 맵핑한다. 대소문자를 구분하는 DB 라면 @Column 어노테이션을 사용해서 명시적으로 맵핑 해줘야 한다.

JPA 설정 파일이 META-INF/persistence.xml 클래스 패스 경로에 있으면 별도 설정없이 JPA 를 인식할 수 있다. src/main/resources 하위에 META-INF 폴더를 만들고 persistence.xml 파일을 생성하여 아래 내용을 입력한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">

    <persistence-unit name="jpabook">

        <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.id.new_generator_mappings" value="true" />

            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>

</persistence>

 

XML의 요소를 하나씩 살펴보자

  • persistence-unit: 영속성 유닛이라고 하며, 일반적으로 연결할 디비와 1대1 관계이다.
  • javax.persistence.jdbc.*: jdbc에 연결할 속성을 정한다.
  • hibernate.*: 데이터베이스 방언(Dialect)을 설정한다.

JPA는 하나의 표준이며 우리가 알고 있는 하이버네이트, EclipseLink 등은 그에대한 구현체이다. javax.persistance 는 JPA 표준이라 구현체에 종속되지 않지만, hibernate 속성은 특정 구현체인 하이버네이트에서만 사용할 수 있다.

 

하이버네이트는 방언(Dialect)을 참조하여 SQL을 생성한다. 만약 Oracle 을 이용하여 페이징처리를 구현하였는데 갑자기 프로젝트 막바지에 돈이없다고 고객이 MySQL 로 바꾸라고 한다면 Mybatis 구현에서는 페이징처리를 모두 LIMIT 구문으로 변경해야 한다. JPA 는 H2, 오라클, MySQL에 대한 방언도 지원하며, 만약 DB 벤더가 변경되는 경우 방언(Dialect)만 변경하면 된다.

 

댓글