객체 매핑 시작
회원 클래스
import javax.persistence.*;
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를 사용하려면 가장 먼저 회원 클래스와 회원 테이블을 매핑해야한다.
매핑 정보가 포함된 회원 클래스
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
해당 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용된 클래스를 엔티티 클래스라고 한다.
@Table
엔티티 클래스에 매핑할 테이블 정보를 알려준다. 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
@Id
엔티티 클래스의 필드를 테이블의 기본 키(Primary Key)에 매핑한다. 이렇게 @Id가 사용된 필드를 식별자 필드라 한다.
@Column
필드를 컬럼에 매핑한다.
매핑 정보가 없는 필드
매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다. 여기서는 필드명이 age이므로 age컬럼으로 매핑했다. 대소문자를 구분하는 데이터베이스를 사용하면 @Column(name="AGE")처럼 명시적으로 매핑해야한다.
데이터베이스 방언
데이터베이스마다 다음과 같은 차이점이 있다.
- 데이터 타입 : 가변 문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용한다.
- 다른 함수명 : 문자열을 자르는 함수로 SQL 표준은SUBSTRING()을 사용하지만 오라클은 SUBSTR()을 사용하낟.
- 페이징 처리 : MySQL은 LIMIT를 사용하지만 오라클은 ROWNUM을 사용한다.
이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(Dialect)이라 한다.
2.11을 보면. 개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해준다. 따라서 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요 없이 데이터 베이스 방언만 교체하면 된다.
애플리케이션 개발
시작 코드
import javax.persistence.*;
import java.util.List;
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(); // [엔티티 매니저 팩토리] - 종료
}
// 비즈니스 로직
private static void logic(EntityManager em) {
String id = "id2";
Member member = new Member();
member.setId(id);
member.setUsername("지한");
member.setAge(12);
//등록
em.persist(member);
//수정
member.setAge(20);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
}
}
코드듣 크게 3부분으로 나뉘어 있다.
- 엔티티 매니저 설정
- 트랜잭션 관리
- 비즈니스 로직
엔티티 매니저 설정
정리
JPA가 반복적인 JDBC API와 결과 값 매핑을 처리해준 덕분에 코드량이 상당히 많이 줄어든 것은 물론이고 심지어 SQL도 작성할 필요가 없었다.
'Server > JPA' 카테고리의 다른 글
[JPA] Soft Delete를 위한 @SQLDelete, @Where (0) | 2023.01.06 |
---|---|
[JPA] Delete와 DeleteById 차이 (0) | 2023.01.02 |
[JPA] 00. JPA 소개 (0) | 2022.09.14 |