3. JPA 시작(1)

1. H2 데이터베이스 설치

http://www.h2database.com -> All Platforms or Platform-Independent Zip

압축을 푼 곳에서 bin/h2.sh를 실행하면 H2 데이터베이스를 서버 모드로 실행한다.

H2 데이터베이스는 JVM 메모리 안에서 실행되는 임베디드 모드와 실제 데이터베이스처럼 별도의 서버를 띄워서 동작하는 서버 모드가 있다.

H2 데이터베이스를 서버 모드로 실행한 후에 웹 브라우저에서 http://localhost:8082를 입력하면 H2 데이터베이스에 접속할 수 있는 아래 그림과 같은 화면이 나온다.

위의 그림의 화면 왼쪽 위를 보면 언어를 선택할 수 있는데 한국어를 선택하자. 그리고 다음과 같이 입력하고 연결 버튼을 선택하자.

  • 드라이버 클래스 : org.h2.Driver
  • JDBC URL : jdbc:h2:tcp://localhsot/~/test
  • 사용자명 : sa
  • 비밀번호 : 입력하지 않는다.

이렇게 하면 test라는 이름의 데이터베이스에 서버 모드로 접근하고, 아래 그림과 같은 화면이 나온다.

예제 테이블 생성

아래 예제의 SQL을 입력하고 실행 버튼을 선택하면 아래 위의 그림처럼 왼쪽 메뉴에서 생성된 MEMBER 테이블을 볼 수 있다.

CREATE TABLE MEMBER {
  ID VARCHAR(255) NOT NULL,   --아이디(기본 키)
  NAME VARCHAR(255),          --이름
  AGE INTEGER NOT NULL,       --나이
  PRIMARY KEY (ID)
)

2. 라이브러리와 프로젝트 구조

JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리는 다음과 같다.

  • hibernate-core : 하이버네이트 라이브러리
  • hibernate-entitymanager : 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
  • hibernate-jpa-2.1-api : JPA 2.1 표준 API를 모아둔 라이브러리

예제에 사용할 프로젝트 구조는 아래와 같다.

1. 메이븐과 사용 라이브러리 관리

JPA에 하이버네이트 구현체를 사용하려면 많은 라이브러리가 필요하지만 핵심 라이브러리는 다음 2가지다.

  • JPA, 하이버네이트(hibernate-entitymanager) : JPA 표준과 하이버네이트를 포함하는 라이브러리, hibernate-entitymanager를 라이브러리로 지정하면 다음 중요 라이브러리도 함께 내려받는다.
    - hibernate-core.jar

    • hibernate-jpa-2.1-api.jar
  • H2 데이터베이스 : H2 데이터베이스에 접속해야 하므로 h2 라이브러리도 지정했다.

3. 객체 매핑 시작

먼저 다음 예제의 SQL을 실행해서 예제에서 사용할 회원 테이블을 만들자. H2 데이터베이스를 설정하면서 이미 생성해두었다면 생략해도 된다.

CREATE TABLE MEMBER (
    ID VARCHAR(255) NOT NULL,   --아이디(기본 키)
    NAME VARCHAR(255),          --이름
    AGE INTEGER,                --나이
    PRIMARY KEY (ID)     
)

다음으로 아래 예제처럼 애플리케이션에서 사용할 회원 클래스를 만들자.

package jpabook.start;

public class Member {

    private String id;

    private String username;

    private Integer 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 Integer getAge() {
        return age;
    }

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

JPA를 사용하려면 가장 먼저 회원 클래스와 회원 테이블을 매핑해야 한다. 다음 표의 매핑 정보를 참고하여 둘을 비교하면서 실제 매핑을 시작해보자.

매핑 정보 회원 객체 회원 테이블
클래스와 테이블 Member MEMBER
기본 키 id ID
필드와 컬럼 username NAME
필드와 컬럼 age AGE

아래 예제처럼 회원 클래스에 JPA가 제공하는 매핑 어노테이션을 추가하자.

package jpabook.start;

import javax.persistence.*;  //**

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

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String username;
	
    //매핑 정보가 없는 필드
    private Integer 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 Integer getAge() {
        return age;
    }

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

회원 클래스에 매핑 정보를 표시하는 어노테이션을 몇 개 추가했다. 여기서 @Entity, @Table, @Column이 매핑 정보다. JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다.

회원 클래스에 사용한 매핑 어노테이션을 하나씩 살펴보자.

@Entity

이 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용된 클래스를 엔티티 클래스라 한다.

@Table

엔티티 클래스에 매핑할 테이블 정보를 알려준다. 여기서는 name 속성을 사용해서 Member 엔티티를 MEMBER 테이블에 매핑했다. 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다(더 정확히는 엔티티 이름을 사용한다).

@Id

엔티티 클래스의 필드를 테이블의 기본 키(Primary Key)에 매핑한다. 여기서는 엔티티의 id 필드를 테이블의 ID 기본 키 컬럼에 매핑했다. 이렇게 @Id가 사용된 필드를 식별자 필드라 한다.

@Column

필드를 컬럼에 매핑한다. 여기서는 name 속성을 사용해서 Member 엔티티의 username 필드를 MEMBER 테이블의 NAME 컬럼에 매핑했다.

매핑 정보가 없는 필드

age 필드에는 매핑 어노테이션이 없다. 이렇게 매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다. 여기서는 필드명이 age이므로 age 컬럼으로 매핑했다. 참고로 여기서는 데이터베이스가 대소문자를 구분하지 않는다고 가정한다. 만약 대소문자를 구분하는 데이터베이스를 사용하면 @Column(name="AGE")처럼 명시적으로 매핑해야 한다.

이것으로 매핑 작업을 완료했다. 매핑 정보 덕분에 JPA는 어떤 엔티티를 어떤 테이블에 저장해야 하는지 알 수 있다.

다음으로 JPA를 실행하기 위한 기본 설정 파일인 persistence.xml을 알아보자.

JPA 어노테이션의 패키지는 javax.persistence이다.

참고

  • 자바 ORM 표준 JPA 프로그래밍

좋은 웹페이지 즐겨찾기