- 목차
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관 관계 매핑 : @ManyToOne, @JoinColumn
1. 객체와 테이블 매핑
1. @Entity
- 이 어노테이션이 붙으면 JPA가 관리한다.
- 이 어노테이션 사용 시 주의점
- 기본 생성자 필수 (public or protected 생성자)
- 다양한 기술을 사용하기 위해서 필요
- final 클래스, enum, interface, inner 클래스에는 사용 불가
- 저장할 필드에 final 사용 x
- @Entity 속성
- name : JPA에서 사용할 엔티티 이름 지정 (기본값으로는 클래스 이름 그대로)2. @Table
- 엔티티와 매핑할 테이블 지정
- 속성 : name, catalog, schema, uniqueConstraints (DDL)
1-2. 데이터베이스 스키마 자동 생성
- @Entity 어노테이션이 붙은 클래스는 필드를 보고나면 칼럼을 어떻게 만들 지 알 수 있다.
- 따라서 JPA는 DB 테이블 생성 기능을 애플리케이션 실행 시점에 제공한다.
- DDL 생성 : 데이터베이스에 맞는 방언을 사용해서 적절하게.
- 반드시 생성된 DDL은 운영 환경(or 다듬어서 사용)이 아니라 개발 환경에서만 사용!
- 데이터베이스 스키마 자동생성 옵션
- update 옵션 :
ALTER TABLE add column age integer not null
칼럼만 추가되게끔 변경분만 반영
- 주의점!
- 운영 장비에는 절대 create, create-drop, update 를 사용하면 안된다!
- 개발 초기: create, update
- 테스트 서버 : update, validate
- 스테이징과 운영 서버 : validate
-> 자동 테이블 생성은 웬만하면 사용하지 말자!
- DDL 생성 기능
- JPA 기능으로 데이터베이스에 영향을 주는 옵션인 것. (DDL 생성 기능)
- 2. 필드와 컬럼 매핑
- Integer : 비슷한 숫자형으로 됨.
- Enum : @Enumerated
- 날짜 : @Temporal (type 3가지 : date, time, timestamp)
- @Lob : VARCHAR를 넘어서는 훨씬 큰 컨텐츠를 넣고 싶을 떄 사용.
- @Transient : 데이터베이스에 칼럼으로 등록하고 싶지 않은 필드에 사용.
2-1. @Column
- 속성
- @unique 대신 Table의 @uniqueConstraints 추천 : 칼럼 명이 이상하게 변하기 때문
2. 2 @Enumerated
ORDINAL 기본 옵션을 사용 시, 나중에 enum 추가했을 떄 인덱스에 맞게 저장하기 떄문에 위험한 문제 발생할 수 있음. STRING 으로 EnumType을 지정하는 것을 필수적으로!
2-3. @Temporal
- java에서
- LocalDate : date와 매핑
- LocalDateTime: timestamp와 매핑
2-4. @Lob
2-5. @Transient
- 매핑하기 싫을 떄 사용
3. 기본 키 매핑
4. 기본 키 매핑
- @Id: 직접 넣어줄 떄
- @GeneratedValue( 전략)
- IDENTITY : 데이터베이스에 위임
- 발생하는 문제점
- 데이터베이스에 맡기는데, insert query가 날아가야 데이터베이스가 null로 들어간 id 에 값을 할당한다. (pk 값이 나옴)
- 영속성 컨텍스트는 Id가 있어야 1차 캐시에 저장한다.
- 영속성 컨텍스트가 데이터베이스에 쿼리를 날릴 때는 트랜잭션 커밋 후이다.
- 원래는 그러지 않지만 커밋하기 전에도 즉시 INSERT 쿼리 문을 전송한다.
- 영속성 컨텍스트에 제대로 저장되기 위해 먼저 데이터베이스에 저장되고 id를 할당받은 후 1차 캐시에 넣는 것이다.
- SEQUENCE : 이걸 쓰면 id는 Long을 쓰는 걸 권장 (데이터베이스의 SEQUENCE 객체를 이용해서 만들 때, 10억이면 한바퀴 도는데 그떄마다 뭔갈 변경하는게 더 어려움. )
- generator 사용하는 경우
-
- TABLE : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
- 장점 : 모든 데이터베이스에 적용가능
- 단점 : 성능
-
- 아래가 적용 코드 위에가 그 결과로 나온 sql문
- MY_SEQUENCES 라는 테이블이 만들어진다.
- 이 전략을 잘 쓰지는 않는다.
- 속성
-
- 그래서 결국 권장하는 식별자 전략? ??
-
- Long 자료형 + autoIncrement, 랜덤 값 조합 값 등으로 사용할 것을 권장.
- AUTO
'개발 > java' 카테고리의 다른 글
[Spring Security] Spring Security 의 동작과정과 구현 (0) | 2024.04.14 |
---|---|
Spring 에서 configuration 을 다루는 방법 - @Value vs @ConfigurationProperties (2) | 2024.02.26 |
[Spring - JPA] 3. 영속성관리 (1) | 2024.02.18 |
[Spring - JPA] 2. JPA 개요 (1) | 2024.02.18 |
[Spring - JPA] 1. JPA 소개 (1) | 2024.02.03 |