일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 나만재밌는이야기
- 모던자바인액션
- 메서드참조
- 잡담
- Java8
- 클린코드
- 일빵빵알파벳파닉스
- 발음공부
- spring configuration
- 동작파라미터화
- 프레디케이트
- 스프링5레시피
- 영속성
- 일급함수
- JPA
- 람다
- 객체지향생활체조원칙
- 엔티티매핑
- 다시보기연습
- ES6
- 스프링구성
- 생각
- 제대로알기
- 1월의독서
- gulp
- 달리기를말할때내가하고싶은이야기
- es5
- a-d
- spring5receipe
- 영속성컨텍스트
- Today
- Total
notepad
[JPA-BASIC] 엔티티 매핑 본문
인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 내용 정리
객체와 테이블 매핑 @Entity, @Table
컬럼 매핑 @Column
기본키 매핑 @Id
연관관계 매핑 @ManyToOne, @JoinColumn
@Entity
- 엔티티가 붙은 클래스는 JPA가 관리. 엔티티라고한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 엔티티 어노테이션이 필수이다
- 주의 : 기본 생성자는 필수(파라미터가 없는 public, protected 생성자)
- final클래스, enum, interface, inner class에는 사용 불가
- 저장할 필드에 final 사용 금지
@Table 엔티티와 매핑할 테이블 지정
- name, catalog, schema, uniqueConstraints (DDL생성시 유니크 제약조건 생성)
- 속성 사용 가능
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL사용
- 자동 생성된 DDL은 개발 장비에서만 사용
- 운영 서버에서는 적절히 다듬은 후 사용
META-INF/persistence.xml
hibernate.hbm2ddl.auto 옵션
- create / create-drop / update / validate / none
- 로컬 환경이 아니면 되도록 쓰지말자 + 주의하자
매핑 어노테이션 정리
@Column 컬럼 매핑
@Tempral 날짜 타입 매핑 -> java8 이후 어노테이션 없이 LocalDateTime 사용
@Eunmerated enum타입 매핑
@Lob blob, clob 매핑
@Transient 매핑 무시 : 특정 필드를 컬럼에 매핑하지 않음
필드와 컬럼 매핑
@Column
- name / insertable, updatable 등록 변경 가능 여부 / nullable/ unique (제약조건명이 지정을 위해 @Table의 uniqueConstranints 을 더 많이 사용한다) / length, columnDefinition /precision, scale
BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수 다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다.
@Table(name = “Member”,
uniqueConstraints = {@UniqueConstraint(name = “NAME_UNIQUE”, columnNames = “name”)})
class Member{
//
}
기본 키 매핑
@Id, @GeneratedValue
```
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
```
@Id만 사용 -> 직접 ID 할당
@GeneratedValue 사용 -> 자동 생성 / 전략 지정 가능
IDENTITY : 데이터베이스에 위임, MySQL
- Auto increment -> 1차 캐시 사용을 위해 엔티티 영속시점(em.persist()) 에 Insert 쿼리를 실행시켜 키 값을 가져온다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
SEQUENCE : DB 시퀀스 사용, ORACLE / @SequenceGenerator 필요
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR"
sequenceName = "MEMBER_SEQ" //DB
initialValue = 1
allocationSize = 50
)
class Member {
@Id @GeneratedValue(strategy = GenerationType.Sequence, generator = "MEMBER_SEQ_GENERATOR"
private Long id;
TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 가능 @TableGenerator필요
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략
- 장점: 모든 데이터베이스에 적용 가능
- 단점: 성능
- AUTO : 방언에 따라 자동 지정, 기본값
시퀀스 전략에서의 성능 최적화
allocationSize 값 조정을 통해 네트워크 통신 횟수를 줄인다. (미리 allocationSize 만큼 시퀀스를 가져와 메모리에 저장 후 시퀀스를 부여한다)
allocationSize : 시퀀스 한번 호출에 증가하는 수 (성능 최적화에 사용)
키 범위를 미리 확보해 놓는 것이기 때문에 서버 여러대(동시성 문제) 를 걱정하지 않아도 된다.
권장하는 식별자 전략
- 기본키 제약 조건 : not null, unique, 변하면 안된다.
- 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 이용하자
- 권장 : Long형 + 대체키(랜덤값) + 키 생성 전략
시퀀스, UUID & 랜덤값
그냥 sequence 나 autoIncrement를 사용
궁금한 점
: 여러대의 서버에서 시퀀스를 가져다 쓰고 insert하면 1 다음에 51이 들어가거나 할 수 도 있는건가?
서버가 2대 이상이라면 DB상에는 시퀀스 순서가 다르게 들어갈 수 있습니다. (중복이 되지는 않습니다.)
그런데 가급적 시퀀스는 순서를 보장하는데 쓰시지 말고 순서에 대한 부분은 별도의 날짜 컬럼을 사용하시는 것을 권장합니다.
** reflection 과 proxy, jvm
** catalog / schema
'JPA' 카테고리의 다른 글
[JPA 활용1] 요약 (0) | 2020.08.07 |
---|---|
[JPA 활용2] 기본~ 고급 요약 (0) | 2020.08.07 |
[JPA 활용2] 고급 - 지연 로딩과 조회 성능 최적화 (0) | 2020.08.05 |
[JPA 활용2] API 개발 기본 (0) | 2020.08.03 |
[JPA-BASIC] 영속성 관리 (0) | 2020.07.16 |