오늘은!! 졸지 않고 다 흡수할 것이다!!
hibernate.ddl-auto : Hibernate가 Entity 클래스와 연결된 테이블을 자동으로 생성, 수정, 삭제할 수 있게 하는 속성
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mysql://localhost:3306/menudb
username: ohgiraffers
password: ohgiraffers
jpa:
show-sql: true
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
create : 테이블 생성
update : 테이블 업데이트
validate : Entity 클래스와 테이블이 일치하는지만 검증
create-drop : 프로그램 종료 시 해당 테이블을 삭제. 존재하지 않는 테이블을 생성하면서 진행하기 위해 create 옵션을 설정한다.
@Entity 어노테이션
@Id : primary key 지정
@GeneratedValue : primary key 생성에 관여
- strategy : 자동 생성 전략을 지정
- GenerationType.IDENTITY : 기본 키 생성을 데이터베이스에 위임(= MySQL의 AUTO_INCREMENT)
- GenerationType.SEQUENCE : 데이터베이스 시퀀스 객체 사용(ORACLE의 SEQUENCE)
- GenerationType.TABLE : 키 생성 테이블 사용
- GenerationType.AUTO : 자동 선택 (MySQL이라면 IDENTITY, ORACLE이라면 SEQUENCE로 선택)
- generator : strategy 값을 GenerationType.TABLE로 지정한 경우 사용되는 테이블 이름을 지정
- initialValue : strategy 값을 GenerationType.SEQUENCE로 지정한 경우 시퀀스 초기값을 지정
- allocationSize : strategy 값을 GenerationType.SEQUENCE로 지정한 경우 시퀀스 증가치를 지정
@Column : 엔티티 클래스의 필드와 데이터베이스의 컬럼 매핑을 지정. 필드의 이름과 데이터베이스의 컬럼명, 자료형 등을 지정할 수 있음
name 매핑할 테이블의 컬럼 이름
insertable 엔티티 저장 시 필드 저장 여부 (default : true)
updatable 엔티티 수정 시 필드 수정 여부 (default : true)
table 엔티티와 매핑될 테이블 이름. 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용. (@SecondaryTable 사용)
nullable NULL 값 허용 여부 (default : true)
unique 컬럼의 유일성 제약 조건. 두 개 이상 컬럼에 unique 제약조건을 설정하기 위해서는 클래스 레벨에서 @Table의 uniqueConstraints 속성에 설정.
columnDefinition 직접 컬럼의 DDL을 지정
length 문자열 길이. String 타입에서만 사용. (default : 255)
@Transient : 해당 필드를 데이터베이스 테이블의 컬럼에 매핑하지 않는다. 해당 필드는 데이터베이스에 저장되거나 검색되지 않는다. 주로 데이터베이스에는 필요하지 않지만 객체 내에서 로직을 처리하는 데 사용되는 필드에 사용됨
@Enumerated : Enum 타입 매핑을 위해 사용됨.
@TableGenerator : 테이블 이용해 기본 키 생성 @GeneratedValue와 함께 사용됨
엔터티 접근 방식
1. 엔티티 객체의 필드에 직접 접근
@Access(AccessType.FIELD) (default이므로 제거해도 동일하게 동작)
2. getter 메소드를 이용하는 방식
@Access(AccessType.PROPERTY)
: 클래스 레벨에 설정하면 모든 필드에 대해 getter 방식 적용
(but, @Id 어노테이션이 필드에 있다면 엔티티를 생성하지 못하기 때문에 @Id 어노테이션을 getter 메소드 위로 옮겨야함)
@Embeddable : 임베디드 타입을 정의
공통적으로 사용되는 것들을 재사용하기 위해 만든 별도의 클래스를 엔티티에 포함시키는 것을 말함
해당 임베디드 타입이 엔티티의 한 부분임을 명시하는데 사용됨
임베디드 타입을 포함하는 엔티티의 필드에 선언해야 함.
어노테이션이 선언된 클래스는 직렬화 가능해야하므로 Serializable 인터페이스 구현해야함
복합키 매핑
1. @EmbeddedId 사용
복합키를 구성하는 필드들을 하나의 클래스로 묶은 뒤 해당 클래스를 어노테이션 사용하여 매핑
일부 필드만을 매핑할 수도 있으므로 유연한 매핑 가능함
2. @IdClass 사용
복합 키의 역할을 하는 클래스를 생성
복합키 구성하는 필드들을 별도의 클래스로 분리한 뒤 해당 클래스를 어노테이션의 갑으로 지정
모든 필드를 한번에 매핑 가능(매핑이 엔티티에 몰려 엔티티가 길어짐)
별도의 매핑 클래스를 사용하지 않기 때문에 코드가 간결