-
02. JPA 시작JPA 2021. 1. 17. 21:22
1. 객체 매핑 시작
먼저 SQL을 실행해서 예제에서 사용할 회원 테이블을 만들자.
다음으로 애프리케이션에서 사용할 회원 클래스를 만들자.
package com.toy.movie.domain.database.member; 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; } }
JPA를 사용하려면 가장 먼저 회원 클래스와 회원 테이블을 매핑해야 한다.
회원 클래스에 매핑 정보를 표시하는 어노테이션 몇 개 추가했다. 여기서 @Entity, @Table, @Id, @Column이 매핑 정보다.
JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다.
회원 클래스에 사용한 매핑 어노테이션을 하나씩 살펴보자.
@Entity: 이 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용된 클래스를 엔티티 클래스라 한다.
@Table: 엔티티 클래스에 매핑할 테이블 정보를 알려준다. 여기서는 name 속성을 사용해서 Member 엔티티를 MEMBER 테이블에 매핑했다. 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
@Id: 엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다. 여기서는 엔티티의 id 필드를 테이블의 ID 기본 키 컬럼에 매핑했다. 이렇게 @Id가 사용된 필드를 식별자 필드라 한다.
@Column: 필드를 컬럼에 매핑한다. 여기서는 name 속성을 사용해서 Member 엔티티의 username 필드를 MEMBER 테이블의 NAME 컬럼에 매핑했다.
매핑 정보가 없는 필드
age 필드에는 매핑 어노테이션이 없다. 이렇게 매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다.
만약 대소문자를 구분하는 데이터베이스를 사용하면 대소문자를 구분하여 명시적으로 매핑해야 한다.
이것으로 매핑 작업을 완료했다.
2. persistence.xml 설정
JPA는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다. 이 설정 파일이 META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.
<?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="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.user" value="****"/> <property name="javax.persistence.jdbc.password" value="****"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/toy"/> <!-- 방언 설정 --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> <!-- 옵션 --> <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>
3. 데이터베이스 방언
JPA는 특정 데이터베이스에 종석적이지 않은 기술이다. 따라서 다른 데이터베이스로 손쉽게 교체할 수 있다.
그런데 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르다는 문제점이 있다.
예를 들어 데이터베이스마다 다음과 같은 차이 점이 있다.
- 데이터 타입: 가변 문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용한다.
- 다른 함수명: 문자열을 자르는 함수로 SQL 표준은 SUBSTRING()를 사용하지만 오라클은 SUBSTR()을 사용한다.
- 페이징 처리: MySQL은 LIMIT를 사용하지만 오라클은 ROWNUM을 사용한다.
이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에 서는 방언이라 한다.
개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해준다. 따라서 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요 없이 데이터 베이스 방언만 교체하면 된다.
4. 애플리케이션 개발
public class JpaMain { public static void main(String[] args) { //엔티티 매니저 팩토리 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성 EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득 try { tx.begin(); //트랜잭션 시작 logic(em); //비즈니스 로직 tx.commit();//트랜잭션 커밋 } catch (Exception e) { e.printStackTrace(); tx.rollback(); //트랜잭션 롤백 } finally { em.close(); //엔티티 매니저 종료 } emf.close(); //엔티티 매니저 팩토리 종료 } public static void logic(EntityManager em) {...} }
코드는 크게 3부분으로 나뉘어 있다.
- 엔티티 매니저 설정
- 트랜잭션 관리
- 비즈니스 로직
'JPA' 카테고리의 다른 글
JPA 영속성(persistence)란? (1) 2024.04.02 03. 영속성 관리 (0) 2021.01.31 01-3. JPA란 무엇인가? (0) 2021.01.14 01-2. JPA 소개 (2) 2020.12.29 01-1. JPA 소개 (0) 2020.12.01