해당 내용은 인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본 편에서 공부한 내용을 정리한 것입니다.
엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity , @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @id
- 연관 관계 매핑 : @ManyToOne , @JoinColumn
엔티티란?
- @Entity가 붙은 클래스는 jpa가 관리하며 이것을 엔티티라 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
- 주의
기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
final 클래스, enum , interface, inner 클래스 사용 X
저장할 필드에 final 사용 x
@Entity 속성
- @name : JPA에서 사용할 엔티티의 이름을 저장한다.
기본값 : 클래스 이름을 그대로 사용(예 : Member) - @Table : 엔티티와 매핑할 테이블 지정
name : 매핑할 테이블 이름
catalog : 데이터베이스 catalog 매핑
schema 데이터베이스 schema 매핑
uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성
추가 정보
데이터베이스 스키마 자동 생성 기능
- 어플리케이션 로딩 시점에 테이블을 생성해주는 기능도 지원한다. (운영 환경에서는 사용 자제)
- 테이블 중심 -> 객체 중심
- 기존에는 개발 할 때 테이블 막 만들어 놓고 그다음에 객체 만들지만 JPA는 객체 매핑을 해놓으면 어플리케이션 로딩할 때 필요하면 테이블을 다 만들어준다.
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
- 이렇게 생성된 DDL은 개발 환경에서만 사용하고 운영 환경에서는 사용하지 않거나, 적절히 다듬은 후 사용한다.
데이터베이스 자동생성 스키마 자동 생성 - 속성 옵션
- CREATE : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
- CREATE - DROP : CREATE와 같으나 종료 시점에 테이블 DROP
- UPDATE : 변경분만 반영 (운영 DB에는 사용하면 안 됨)
- VALIDATE : 엔티티와 테이블이 정상 매핑되었는지만 확인
- NONE : 사용하지 않음
- 주의점
- 운영 환경에는 절대 create, create-drop, update를 사용하면 안 된다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
- 제약 조건 추가 : 회원 이름은 필수 , 10자 초과 x
@Column(nullable = false, length = 10)
- 유니크 제약조건 추가
@Table(uniqueConstraints = (@UniqueConstraint(name = "NAME_AGE_UNIQUE",
columnNames = ("NAME", "AGE")))))
- DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
필드와 컬럼 매핑
@Column(name = "name",updatable = false)
// 데이터 베이스 컬럼명은 name
// updatable = false 설정 시 이 컬럼은 JPA를 쓸 경우 절대 수정 되지 않는다.
private String Username;
@Column(nullable = false) // 테이블 not null 조건
private Integer age;
@Enumerated(EnumType.STRING) //기본값 ORDINAL
// ORDINAL은 ENUM 순서를 DB에 저장
// STRING은 ENUM 이름을 데이터베이스에 저장
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) // DATE(날짜), TIME(시간), TIMESTAMP(날짜/시간)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP) // 현재 JAVA 8 시대에 들어선 이후로는 사용 잘 안함
private Date LastModifiedDate;
@Lob // VARCHAR를 넘어서는 큰 컨텐츠를 사용하고 싶을 때 (지정 할 수 있는 속성이 없다.)
private String description;
@Transient // 매핑 하고 싶지 않을 경우 ( DB와 전혀 관계 없이 메모리에서만 사용 하고 싶을 경우)
private int temp;
name : 필드와 매핑할 테이블의 컬럼 이름
insertable, updatable : 등록, 수정 가능 여부 (기본값 true)
nullable(DDL) : null 값의 허용 여부를 설정한다.
unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.
columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다.
length(DDL) : 문자 길이 제약조건, String 타입에만 사용한다.
precision, scale(DDL) : BigDecimal 타입에서 사용한다.(BigInteger도 사용할 수 있다.)
precision은 소수점을 포함한 전체 자릿수를 , scale은 소수의 자릿수
기본 키 매핑 방법
1. 직접 할당 : @Id만 사용
2. 자동 생성 : @GeneratedValue 사용
- IDENTITY : 데이터베이스에 위임 , MYSQL (AUTO INCREMENT)
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용 , ORACLE
@SequenceGenerator 필요 - TABLE : 키 생성용 테이블 사용 , 모든 DB에서 사용 가능
@TableGenerator 필요
4. AUTO
IDENTITY 전략
JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행이 되고 , AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행 후 ID 값을 알 수 있는데
JPA의 IDENTITY 전략은 em.persiste() 시점에 즉시 INSERT SQL이 실행되어 DB에서 식별자를 조회한다.
SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트( EX : 오라클 시퀀스)
TABLE 전략
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략 // 모든 데이터베이스에 적용 가능 하지만 성능 이슈가 있다.
데이터 중심 설계의 문제점
1. 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
2. 테이블의 외래 키를 객체에 그대로 가져옴
3. 객체 그래프 탐색이 불가능
4. 참조가 없으므로 uml도 잘못됨
'JPA' 카테고리의 다른 글
[JPA] JPA - 다양한 연관관계 매 (0) | 2024.10.20 |
---|---|
[JPA] JPA - 연관관계 매핑 기초 정리 (0) | 2024.10.19 |
[JPA] JPA - 영속성 관리 (0) | 2021.07.29 |