📌 JPA를 사용해서 테이블과 매핑할 클래스에 필수로 붙여야 하는 어노테이션
name
@Entity(name : "지정할 엔티티 이름")
default = 클래스 이름 그대로 사용.
if) 다른 패키지에 이름이 같은 엔티티 클래스가 있으면 이름 지정해서 충돌하지 않도록 해야 한다.
📌 엔티티와 매핑할 테이블 지정
name
@Table(name : "매핑할 테이블 이름")
default = 엔티티 이름
catalog
: catalog 기능이 있는 데이터베이스에서 catalog를 매핑.
schema
: schema 기능이 있는 데이터베이스에서 schema 매핑.
uniqueConstraints(DDL)
: DDL 생성 시 유니크 제약조건 만들며, 2개 이상의 복합 유니크 제약 조건도 만들 수 있음.
➕ 스키마 자동생성 기능을 사용해 DDL을 만들 때만 사용.
- JPA는 데이터베이스 스키마 자동 생성 기능 지원.
-> 클래스 매핑 정보를 통해 어떤 테이블에 어떤 칼럼을 사용하는지 알 수 있음.- JPA는 매핑 정보와 데이터베이스 방언을 사용해 데이터베이스 스키마 생성.
- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성.
방언 : SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능.
-> 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르다.
ex) 데이터 타입 중 가변 문자 타입 - MySQL에서는 VARCHAR, 오라클에서는 VARCHAR2.
애플리케이션 개발자가 특정 데이터베이스에 종속되는 기능을 많이 사용하면
추후에 데이터베이스 교체가 어렵기 때문에,
하이버네이트를 포함한 대부분의 JPA 구현체들은 이 문제를 해결하기 위해 데이터베이스 방언 클래스 제공.
persistence.xml
resources.META-INF.persistence.xml (스프링부트에서는 수동 생성)
<property name = "hibernate.hbm2ddl.auto" value="create" />
-> 이 속성 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성.
persistence.xml
<property name = "hibernate.show_sql" value="true" />
-> 콘솔에 실행되는 테이블 생성 DDL 출력.
DDL (Data Definition Language)
: 데이터 정의어.
데이터 생성, 수정, 삭제 등 데이터의 전체적인 골격을 정하는 역할의 언어
ex) CREATE, ALTER, DROP(삭제), TRUNCATE(테이블 초기화)
DML (Data Manipulation Language)
: 데이터 조작어
테이블에 있는 행과 열을 조작하는 언어.
데이터베이스 사용자가 저장된 데이터를 실질적으로 처리하는 데에 사용하는 언어.
ex) INSERT, UPDATE, DELETE(데이터 삭제)
DCL (Data Control Language)
: 데이터 제어어
데이터베이스에 접근 권한 관련 언어.
데이터 제어 언어.
데이터의 보안, 무결성, 회복 등을 정의하는 데에 사용.
ex) GRANT(특정 작업에 대한 수행 권한 부여), REVOKE(특정 작업에 대한 권한 박탈, 회수)
DQL (Data Query Language)
정해진 스키마 내에서 쿼리할 수 있는 언어.
DQL을 DML의 일부분으로 취급하기도 한다.
ex) SELECT
TCL (Transaction Control Language)
DML을 거친 데이터의 변경 사항 수정 가능한 언어.
ex) COMMIT(DML이 작업한 내용 데이터베이스에 커밋, 트랜잭션 작업이 정상적으로 완료되었음을 관리자에게 알림),
ROLLBACK(커밋했던 내용 다시 롤백, 트랜잭션의 작업이 비정상적으로 종료되었을 때 원래 상태로 복구)
application.yml에서 처리.
ddl-auto : create
=> 스키마 자동 생성
show-sql : true
=> SQL 쿼리 출력
스키마 자동 생성하기를 통해 만들어지는 DDL에 제약 조건 추가 가능.
ex)
@Column(name = "NAME", nullable = false, length = 10)
이런 기능은 DDL 자동 생성 시에만 사용되고, JPA의 실행 로직에는 영향을 주지 않는다.
-> DDL을 직접 만들 경우, 필요 ❌.