아래 내용은 김영한님의 '자바 ORM 표준 JPA 프로그래밍' 책의 내용을 요약하였습니다.
2.1 이클립스 설치와 프로젝트 불러오기
- Intellij로 대체
- 책에서 제공한 깃허브를 fork 한 후, clone 해줬다.
- 성공
참고)
https://medium.com/@oopchoi/jpa-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-fc443b647ec8
JPA 프로그래밍
https://www.facebook.com/groups/jpastudy
medium.com
2.2 H2 데이터베이스 설치
- H2 데이터베이스 설치
설치한 후, bin/h2.sh를 실행했는데 오류남
→ 해결 : All Platforms로 다시 다운 했더니 해결 (처음에 windows installer로 설치해서 오류났었음)
- 압축을 푼 곳에서 bin/h2.sh 실행하면 H2 데이터베이스를 서버 모드로 실행함
- test.mv.db 파일을 user 파일 안에 만들어야 함
- 예제 코드 실행했더니 왼쪽에 MEMBER table이 생성됨을 확인
CREATE TABLE MEMBER (
ID VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
AGE INTEGER NOT NULL,
PRIMARY KEY (ID)
)
2.3 라이브러리와 프로젝트 구조
- pom.xml에서 h2 버전을 바꿔줬다.
<h2db.version>2.1.214</h2db.version>
2.4 객체 매핑 시작
매핑 정보 회원 객체 회원 테이블
클래스와 테이블 | Member | MEMBER |
기본 키 | id | ID |
필드와 컬럼 | username | NAME |
필드와 컬럼 | age | AGE |
// 예제 2.6 매핑 정보가 포함된 회원 클래스
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;
...
}
@Entity
- 이 클래스를 테이블과 매핑한다고 JPA에게 알려줌
- @Entity가 사용되는 클래스를 엔티티클래스
@Table
- 엔티티 클래스에 매핑할 테이블 정보를 알려줌
- 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑(더 정확히는 엔티티 이름 사용)
- ex) name 속성을 사용해서 Member 엔티티를 MEMBER 테이블에 매핑
@id
- 엔티티 클래스의 필드를 테이블의 primary key에 매핑
- 식별자 필드라고 함
- ex) 엔티티의 id 필드를 테이블의 ID 기본 키 컬럼에 매핑
@Column
- 필드를 컬럼에 매핑
- ex) name 속성을 사용해서 Member 엔티티의 username 필드를 MEMBER 테이블의 NAME 컬럼에 매핑
매핑 정보가 없는 필드
- 필드명을 사용해서 컬럼명으로 매핑
- ex) 필드명이 age이므로 age 컬럼으로 매핑
- 만약 대소문자를 구분하는 데이터 베이스를 사용하면
명시적으로 매핑해야 함@Column(name="AGE")
참고) JPA 어노테이션의 패키지는 javax.persistence
2.5 persistence.xml 설정
- JPA는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다.
- 이 설정 파일이 META_INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.
- 설정 파일은 persistence로 시작
- JPA 설정은 영속성 유닛(persistence-unit)이라는 것부터 시작
- 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛을 등록
- 영속성 유닛에는 고유한 이름 부여
2.5.1 데이터베이스 방언
- JPA는 특정 데이터베이스에 종속적이지 않은 기술
- 다른 데이터베이스로 손쉽게 교체 가능
- SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(dialect)
- 데이터 타입 : 가변 문자타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2 사용
- 다른 함수명 : 문자열을 자르는 함수로 SQL 표준은 SUBSTRING(), 오라클은 SUBSTR() 사용
- 페이징 처리 : MYSQL은 LIMIT, 오라클은 ROWNUM 사용
- 개발자가 특정 데이터베이스에 종속되는 기능을 많이 사용하면 나중에 데이터베이스를 교체하기 어렵다. → 이러한 문제를 해결하기 위해 대부분의 JPA 구현체들은 다양한 데이터베이스 방언 클래스 제공
2.6 애플리케이션 개발
- 코드는 크게 3부분으로 나뉘어 있다.
- 엔티티 매니저 설정
- 트랜잭션 관리
- 비즈니스 로직
2.6.1 엔티티 매니저 설정
- 엔티티 매니저 팩토리 생성
- JPA를 시작하려면 persistence.xml의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성해야 한다.
- 이때 Persistence 클래스 사용
- 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비함
- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
- 엔티티 매니저 팩토리를 생성하는 비용이 크기 떄문
- 엔티티 매니저 생성
- 엔티티 매니저 팩토리에서 엔티티 매니저를 생성
- 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
- 엔티티 매니저를 가상의 데이터베이스로 생각할 수 있다.
- 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안된다.
- 종료
2.6.2 트랜잭션 관리
- JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 함.
- 트랜잭션을 시작하려면 엔티티 매니저(em)에서 트랜잭션 API를 받아와야 함.
- 비즈니스 로직이 정상 동작하면 트랜잭션을 커밋, 예외가 발생하면 롤백
2.6.3 비즈니스 로직
- 엔티티를 저장하려면 엔티티 매니저의 persist() 메소드에 저장할 엔티티 넘겨줌.
- 엔티티 매니저를 통해 데이터베이스에 등록, 수정, 삭제, 조회한다.
2.6.4 JPQL
- 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 검색 조건이 포함된 SQL을 사용해야 한다.
- JPA는 JPQL(Java Persistence Query Language)라는 쿼리 언어 사용
- 차이점
- JPQL은 엔티티 객체를 대상으로 쿼리(클래스와 필드를 대상으로 쿼리)
- 데이터베이스 테이블을 전혀 알지 못함.
- 대소문자 명확하게 구분
- SQL은 DB 테이블을 대상으로 쿼리
- 대소문자 구분X
- JPQL은 엔티티 객체를 대상으로 쿼리(클래스와 필드를 대상으로 쿼리)
2.7 정리
- JPA가 반복적인 JDBC API와 결과 값 매핑을 처리해준 덕분에 코드량이 상당히 많이 줄어든 것은 물론이고 심지어 SQL도 작성할 필요가 없었다.
Reference)
자바 ORM 표준 JPA 프로그래밍 - 김영한 지음
'Server' 카테고리의 다른 글
[JPA] Chapter 4 엔티티 매핑 1 (0) | 2023.05.11 |
---|---|
[JPA] Chapter 3 영속성 관리 (0) | 2023.05.05 |
[JPA] Chapter 1 JPA 소개 (0) | 2023.04.06 |
[Server] 포트포워딩으로 외부환경에서 접속하기 (0) | 2023.03.28 |
[Windows] 서버 환경 구축 / XAMPP 설치 (0) | 2023.03.27 |