일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 값 타입
- 테킷
- VB
- spring
- Git
- 알고리즘
- 멋쟁이사자처럼
- Java
- orm
- spring jpa
- responsepart
- 반복문 탈출
- 스프링부트 쇼핑몰 프로젝트
- 프로그래머스
- Visual Basic
- querydsl
- PDF병합
- break-label
- 체인호출
- JPA
- springboot
- 코딩테스트
- PDFBOX
- 제작기
- 연관관계
- 커밋 컨벤션
- 부트캠프
- DOCS
- Hibernate
- GitFlow
Archives
- Today
- Total
섭섭한 개발일지
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch04 본문
git : https://github.com/Dev-Chaee/Java_JPABook/tree/ch04-jpa
CHAPTER 04
[ 엔티티 매핑 ]
- @Entity :
- JPA를 사용해 테이블과 매핑할 클래스는 반드시 이 어노테이션을 사용해야 한다.
- 속성
- name : 사용할 엔티티 명을 지정한다. 설정하지 않은 경우 클래스명으로 정해진다.
- 기본생성자는 필수, 저장할 필드에 final을 사용하면 안된다.
- 속성
- JPA를 사용해 테이블과 매핑할 클래스는 반드시 이 어노테이션을 사용해야 한다.
- @Table :
- 엔티티와 매핑할 테이블을 지정하는 어노테이션이다. 생략할 경우 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
- 속성
- name : 매핑 테이블 이름
- catalog : catalog 기능이 있는 데이터베이스에서 catalog 를 매핑한다.
- schema : schema 기능이 있는 데이터베이스에서 schema 를 매핑한다.
- uniqueConstraints : DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들
때만 사용된다.
- 속성
- 엔티티와 매핑할 테이블을 지정하는 어노테이션이다. 생략할 경우 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
- @Enumerated :
- 이넘 타입을 사용하기 위해서는 해당 어노테이션을 선언해야 한다.
- 속성
- STRING : 값을 enum에 있는 자체(문자)로 저장한다.
- ORDINAL : 값을 저장할때 순번으로 저장을 한다. (보통 사용하지 않는다.)
- 속성
- 이넘 타입을 사용하기 위해서는 해당 어노테이션을 선언해야 한다.
- @Temporal :
- 자바의 날짜 타입은 위 어노테이션을 붙여서 사용한다.
- @Lob :
- 문자열 제한 없이 디비에 저장을 하기 위해서는 VARCHAR가 아닌 CLOB로 저장해야하여 위와 같은 어노테이션을 사용한다.
Lob을 사용하면 CLOB, BLOB 타입으로 매핑할 수 있다.
- 문자열 제한 없이 디비에 저장을 하기 위해서는 VARCHAR가 아닌 CLOB로 저장해야하여 위와 같은 어노테이션을 사용한다.
- ddl auto
- create : 기존 테이블을 삭제하고 새로 생성한다.
- create-drop : create의 기능에서 앱이 종료될 때 생생한 DDL을 제거하는 기능 추가
- update : 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다.
- validate : 테이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 앱을 실행하지 않는다.
- none : 자동 생성 기능을 사용하지않게 한다. 보통은 그냥 ddl auto 속성 자체를 삭제한다고 한다.
- 개발환결별 추천 속성 (JPA2.1부터는 update와 validate 옵션을 지원하지 않는다고 한다)
- 개발 초기 단계 : create, update
- 초기화 상태로 테스트를 진행하는 환경 : create, create-drop
- 테스트 서버 : update, validate
- 스테이징과 라이브 서버 : validate, none
- 이름 매핑 전략
- 카멜 표기법을 언더스코어 표기법으로 변경, 하이버네이트 5에서는 아래 명령어로 가능하다.
<property name="hibernate.physical_naming_strategy" value="org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"/>
- 카멜 표기법을 언더스코어 표기법으로 변경, 하이버네이트 5에서는 아래 명령어로 가능하다.
- 제약조건
- @Column 속성에 다양한 제약 조건을 추가할 수 있다.
- nullable = false : NOT NULL
- length : 길이 제한
- @Table에 유니크 제약 조건 주는 방법
@Table(name = "MEMBER", uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )})
- @Column 속성에 다양한 제약 조건을 추가할 수 있다.
- 기본 키
- 기본키는 직접할당과 자동할당 크게 두가지로 나뉘어져 있다.
- 자동 할당 전략으로 변경하기 위해 persistence.xml에 아래의 속성을 true로 해주어야 한다.
하이버네이트는 JPA 규격에 맞는 키생성 전략을 개발했는데 과거의 버전과의 호환성을 맞추기 위하여 아래 속성의 기본 값을 false로 두었다.- 기본 키 자동 생성 전략
- IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
- 주로 MySQL, PostgreSQL,SQL Server, DB2에서 사용한다. 이 전략은 AUTO_INCREMENT 와 같은 것이다.
- 이 전략은 INSERT가 된 후에 ID값을 조회할 수 있다. 그렇기에 JPA가 데이터베이스를 추가로 조회를 해야 값을 알 수 있다는 것이다.
JDBC3에 추가된 getGeneratedKeys() 를 사용하면 데이터를 저장하면서 동시에 생성된 기본 키를 얻어올 수 있다.
하이버네이트는 이 메소드를 사용해서 데이트베이스와 한번만 통신을 한다. - 엔티티는 영속 상태가 되기 위해서는 기본키 값이 있어야 한다. 이 전략의 경우 persist를 함과 동시에 DML이 전송되므로 트랜잭션이 지원하는 쓰기 지연이 동작하지 않는다.
- SEQUENCE : 데이터베이스 시쿼스를 사용해서 기본 키를 할당한다.
- 시퀀스는 유일한 값을 순서대로 생성한다.
- 이는 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.
@Entity @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "BOARD_SEQ", initialValue = 1, allocationSize = 1 ) public class Board { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; }
- 시퀀스 전략은 IDENTITY와는 조금 다르다. 시퀀스 전략은 persist를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다
그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어난다. - 속성
- name : 식별자 생성기 이름
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다
- allocationSize : 시퀀스 한 번 호출에 증가하는 수
- catalog, schema : 데이터베이스 catalog, schema 이름
- IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
- 기본 키 자동 생성 전략
<!-- 키 생성 전략 --> <property name="hibernate.id.new_generator_mappings" value="true"/>
- TABLE : 키 생성 테이블을 사용한다.
- 테이블 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 시쿼스를 흉내내는 전략이다.
이 전략은 테이블을 사용하므로 모든 데이터베이스에서 적용할 수 있다. - 속성
- name : 식별자 생성기 이름
- table : 키생성 테이블명
- pkColumnName : 시퀀스 컬럼명
- valueColumnName : 시퀀스 값 컬럼명
- pkColumnValue : 키로 사용할 값 이름
- initialValue : 초기 값, 마지막으로 생성된 값이 기준이다.
- allocationSize : 시퀀스 한 번 호출에 증가하는 수
- catalog, schema : 데이터베이스 catalog, schema 이름
- uniqueConstraints(DDL) : 유니크 제약 조건을 지정할 수 있다.
- 테이블 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 시쿼스를 흉내내는 전략이다.
- AUTO 전략
- 데이터베이스 종류도 많고 기본 키를 만드는 방법도 다양하다. Auto 속성은 데이터베이스에 따라 전략을 자동으로 선택한다.
- strategy의 기본 속성이 auto이다.
- 정리
- 영속성 컨텍스트는 엔티티를 식별자로 구분하므로 영속상태로 만들려면 식별자 값이 있어야 한다.
- 권장 식별자 선택 전략
- 기본 키 값 조건
- NOT NULL
- UNIQUE
- 불변
- 기본 키 값 조건
- 테이블의 기본키를 선택하는 전략은 크게 2가지가 있다.
- 자연키
- 비즈니스에 의미가 있는 키
- 예 : 주민등록번호, 이메일, 전화번호
- 비즈니스에 의미가 있는 키
- 대리키
- 비즈니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다.
- 예 : 오라클 시퀀스, AUTO_INCREMENT, 키생성 테이블 사용
- 비즈니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다.
- 자연키
- 자연키보다는 대리키를 권장한다.
- 필드와 컬럼 매핑 레퍼런스 정리한 내용이 책ㄱ 145p에 있으므로 필요한 매핑이 있을 때 찾아서 자세히 읽어보는 것을 권장한다.
'프로그래밍 > JPA' 카테고리의 다른 글
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch07 (0) | 2023.02.08 |
---|---|
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch06 (0) | 2023.02.01 |
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch05 (0) | 2023.01.30 |
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch03 (0) | 2023.01.30 |
[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch01 (0) | 2023.01.30 |
Comments