JPA(Java Persistence API)란 자바 진영에서 만든 ORM 기술 표준으로 관계형 데이터베이스와 자바 객체 사이의 매핑을 대신해주며, 개발자가 SQL 쿼리를 직접 작성하지 않고 데이터베이스와 상호작용할 수 있도록 도와줍니다.
- ORM이란? 객체와 관계형 데이터베이스 간의 변환을 처리해주는 기술로 객체를 보다 쉽게 DB에 저장할 수 있도록 해준다.
1. 등장 배경
JPA는 객체 지향 프로그래밍과 관계형 데이터베이스의 패러다임 불일치를 해결하기 위해 등장했습니다. 객체 지향 프로그래밍은 상속, 다형성, 캡슐화, 추상화 등을 활용해 재사용 가능한 코드를 작성하지만 관계형 데이터베이스는 테이블 구조의 데이터 관리로 상속이나 추상화 같은 개념이 없습니다.
객체와 데이터베이스 사이의 불일치를 맞춰주기 위해 개발자가 직접 매핑을 해야만 했었습니다. 하지만 이런 방식은 지나친 반복과 SQL에 의존적인 개발을 하게됩니다. JPA는 개발자들이 관계형 데이터베이스를 객체 지향적인 방식으로 다룰 수 있도록 해주며 더욱 생산적이고 유지보수 또한 간편해집니다.
개발자 입력
jpa.persist(user)
User user = jpa.find(User.class,userId)
JPA 처리
INSERT INTO USER()..
SELECT * FROM ...
2. 하이버네이트
JPA는 자바에서 관계형 데이터베이스를 사용하기 위한 방식을 정의한 인터페이스로서 그 구현체가 있어야만 사용할 수 있습니다.
대표적인 구현체가 하이버네이트(Hibernate)입니다.
자바용 ORM 프레임워크로 데이터베이스 종류에 상관없이 데이터베이스와 상호작용할 수 있도록 합니다.
3. JPA 특징
- 에너테이션을 이용한 매핑
- String, int, LocalDate 등 기본적인 타입 매핑
- 커스텀 타입 변환기
- 한 개 이상 칼럼을 한 개 타입으로 매핑
- 상속, 클래스 간 연관 지원
@Entity
엔티티는 관계형 데이터베이스의 테이블과 매핑되며 @Entity가 붙은 클래스는 JPA가 관리하게 됩니다.
주의할 점은
- 기본 생성자가 필수
- final,enum,interface,inner 클래스에는 사용이 불가
@Table
- 매핑할 테이블 정보의 이름, 스키마, 인덱스, 제약 조건 등을 지정
- @Table(name="USER") 으로 테이블 이름 명시
- 생략 시 엔티티 클래스 이름으로 지정
@Id
- 엔티티 클래스의 primary key를 나타내며 DB테이블의 기본 키와 매핑
- 주로 멤버 변수 위에 선언되며 이는 해당 변수가 DB테이블의 기본 키와 매핑됨을 지정
@GeneratedValue
- 엔티티 클래스의 식별자 값을 자동 생성하는 방법을 지정
- Generation.AUTO: 데이터 베이스에 따라 자동으로 식별자 값을 생성
- Generation.IDENTITY: 데이터 베이스의 자동 증가 퀄럼을 이용하여 식별자 값 생성
- Generation.SEQUENCE: 데이터 베이스 시퀀스를 이용하여 식별자 값 생성
@Column
- 엔티티 클래스의 필드와 데이터베이스 컬럼 사이의 매핑 정보를 지정
- 해당 변수를 데이터 베이스 컬럼에 매핑하고 컬럼의 이름, 길이, 고유 제약 조건 등 다양한 속성을 설정할 수 있음
@Enumerated
- enum 타입을 매핑할 때 설정
- @Enumerated(EnumType.STRING) : enum타입 값 이름을 설정