저번 글에서 언급했듯 JPA에서 가장 중요한 점
2023.09.16 - [JPA/ORM 표준 JPA 기본] - [ORM 표준 JPA 프로그래밍] 3. 영속성 관리 - 내부 동작 방식
1. 영속성 컨텍스트에서 내부적으로 어떻게 돌아가는지 매커니즘에 대한 이해
2. 실제 설계적인 측면(객체와 RDB를 어떻게 매핑해서 사용하는지)
저번 글의 내용을 빌려와 영속성 컨텍스트의 내부 동작 방식중 중요한 것만 간단하게만 설명한다. 자세한 글은 저번 글을 참고하길 바란다.
1차 캐시: 영속성 컨텍스트 내부에는 1차 캐시가 있어, 한 트랜잭션 안에서는 같은 엔티티를 반환한다.
더티 체킹: 영속 상태의 엔티티의 변경 사항을 자동으로 데이터베이스에 반영한다.
쓰기 지연: 트랜잭션을 커밋할 때까지 SQL을 쌓아두고, 한 번에 데이터베이스에 반영한다.
이제 실제 객체와 RDB의 설계적 매핑에 대해 알아보자.
엔티티 관련 어노테이션
@Entity: JPA가 관리할 객체에 선언한다. 이 어노테이션은 클래스 레벨에만 선언할 수 있다.
@Table: 엔티티와 매핑할 테이블을 지정한다. 테이블 이름과 클래스 이름이 다를 경우에 사용한다.
@Column: 필드와 데이터베이스 테이블의 컬럼을 매핑한다.
@Id: 엔티티의 기본 키와 매핑한다.
@ManyToOne, @JoinColumn: 다대일 관계를 매핑한다.
객체와 테이블 매핑
주의사항
@Entity가 붙은 클래스는 기본 생성자가 필수다.
final 필드는 사용할 수 없으며, enum, inner 클래스에는 사용할 수 없다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Table
만약 RDB 테이블의 이름이 엔티티 객체 클래스와 이름을 다르게 해야할 경우 사용한다.
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "USER", uniqueConstraints = {
@UniqueConstraint(
columnNames = {"username", "email"}
)
})
public class Member {
@Id
private Long id;
private String name;
}
이렇게 설정 후 실행시 나가는 Query
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
USER member0_
where
member0_.id=?
다음과 같이 Table 명이 USER인 것을 볼 수 있다.
@Table 어노테이션 안에는 uniqueConstraints 속성을 사용하여 유니크 제약 조건을 설정할 수 있다.
데이터베이스 스키마 자동 생성
1. 스키마 자동 생성의 중요성
JPA는 애플리케이션 로딩 시점에 데이터베이스 스키마를 자동으로 생성하는 기능을 제공한다. 이 기능은 개발 과정에서 매우 유용하며, 컬럼 매핑을 이해하기 편하기 때문에 데이터 베이스 스키마 자동생성부터 학습힌다. 하지만 이 기능은 운영 환경에서는 사용되어서는 안 된다.
2. 설정 방법
Spring없이 persistence.xml을 사용할 경우
<property name="hibernate.hbm2ddl.auto" value="create" />
application.properties일 경우
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create
application.yml일 경우
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: root
jpa:
hibernate:
ddl-auto: create
3. 옵션 설명
create, create-drop, update - (운영 DB에서는 사용 금지)
create: 기존 테이블을 삭제한 후 다시 생성합니다. (DROP + CREATE)
create-drop: 애플리케이션 종료 시점에 테이블을 DROP한다.
update: 변경된 사항만 데이터베이스에 반영합니다.
validate: 엔티티와 테이블이 정상적으로 매핑되었는지만 확인한다.
none: 자동 생성 기능을 사용하지 않는다.
create로 두고 실행시 DML이 실행되기 전 DDL이 먼저 실행된다.
Hibernate:
drop table USER if exists
Hibernate:
create table USER (
id bigint not null,
name varchar(255),
primary key (id)
)
기존의 값은 유지하되 컬럼만 추가하고 싶을 경우엔 update로 실행하면된다.
update 실행 결과
Hibernate:
alter table USER
add column age integer not null
Hibernate:
select
member0_.id as id1_0_0_,
member0_.age as age2_0_0_,
member0_.name as name3_0_0_
from
USER member0_
where
member0_.id=?
하지만 컬럼을 지운 후에 업데이트로 실행시 컬럼이 삭제되지는 않는다.
운영 장비에는 절대 createm create-drop, update를 사용하면안된다 !!
환경별 전략 개발 초기 단계: create 또는 update 옵션을 사용한다.
테스트 서버: update 또는 validate 옵션을 사용한다.
스테이징과 운영 서버: validate 또는 none 옵션을 사용한다.
'JPA > ORM 표준 JPA' 카테고리의 다른 글
[ORM 표준 JPA] 6. 연관관계 매핑 1 (0) | 2023.09.23 |
---|---|
[ORM 표준 JPA] 5. 엔티티 매핑2 - 기본키 전략 (0) | 2023.09.20 |
[ORM 표준 JPA] 3. 영속성 관리 - 내부 동작 방식 (0) | 2023.09.16 |
[ORM 표준 JPA 프로그래밍] 2. JPA와 Hibernate: 데이터베이스와의 다리 역할 (0) | 2023.09.13 |
[ORM 표준 JPA 프로그래밍] 1. JPA 등장 배경과 소개 (0) | 2023.09.13 |