1. 객체와 테이블 매핑 @Entity @Table
- @Entity : JPA가 관리, 엔티티라 함
- 주의
- 기본 생성자 필수
- 파라미터없음
- public
- protected
- final 클래스, enum, interface, inner 클래스 사용 불가
- 저장할 필드에 final 사용불가 (변경가능하기 때문)
- 기본 생성자 필수
- 주의
- @Table : 엔티티와 매핑할 테이블 지정
- name : 매핑할 이름
- catalog : DB 카탈로그 매핑
- schema : DB 스키마 매핑
- uniqueConstraints(DDL) : DDL 생성시 유니크 제약조건 생성
2. 데이버베이스 스키마 자동생성
- DDL을 애플리케이션 실행시점에 자동 생성
- 테이블중심 → 객체중심!
- DB 방언(dialect)을 사용해서 DB에 맞는 DDL 생성
- persistence.xml
- create : 기존테이블 삭제 후 다시생성 (운영장비에 사용 X)
- create-drop : create와 같으나 종료시점에 테이블 DROP (운영장비에 사용 X)
- update : 변경문만 반영 (운영장비에 사용 X)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지않음
- <property name="hibernate.hbm2ddl.auto" value="create" />
- 개발초기 : create, update
- 테스트서버 : update, validate
- 스테이징, 운영서버 : validate, none
3. 필드와 컬럼 매핑 @Column
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
- @Column : 컬럼매핑
- name : 테이블 컬럼 이름
- insertable, updateable : 등록, 변경 가능여부
- nullable(DDL) : null값 허용 여부. 기본 true, nullable = false → not null
- unique(DDL) : 유니크 제약조건. 제약조건이름때문에, @Table(uniqueConstraints)로 설정함
- columnDefinition : 컬럼 정보를 직접줄 수 있다. columnDefinition = varchar(100) default ‘EMPTY’
- length(DDL) : String 제약조건
- @Enumerated : enum 타입매핑
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 : 나중에 enum값이 추가되면 큰 오류로 남겨질 수 있음
- EnumType.STRING: enum 이름을 데이터베이스에 저장
- @Temporal : 날짜타입 매핑
- 최근 버전은 그냥 어노테이션 없이 LocalData, LocalDateTime을 사용하면 된다.
- TemporalType.DATA : 날짜
- TemporalType.TIME : 시간
- TemporalType.TIMESTAMP : 날짜시간
- @Lob : 큰 값
- @Transient : 매핑하지 않음(메모리에서만 사용)
4. 기본 키 매핑 @Id @GeneratedValue
@GeneratedValue
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- 기본 키 생성을 DB에 위임
- null로 들어가면 자동으로 생성해 줌
- @GeneratedValue(strategy = GenerationType.SEQUENCE)
- : 기본 키 생성을 등록된 시퀀스로 생성
권장
Long형 + 대체키 + 키 생성전략
실전예제1 - 요구사항 분석과 기본 매핑
1. 도메인 모델 분석
2. 테이블설계
3. 엔티티 설계 및 매핑
데이터 중심 설계의 문제점
- 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
- Order order = em.find(Order.class, 1L); // order.getMember() 를 사용하지 못한다. // 관계형 DB에 맞춘 설계임 Long memberId = order.getMemberId(); Member member = em.find(Member.class, memberId);
- 테이블의 외래키를 객체에 그대로 가져옴
- 객체 그래프 탐색이 불가능
- 참조가 없으므로 UML도 잘못됨
1. 객체와 테이블 매핑 @Entity @Table
- @Entity : JPA가 관리, 엔티티라 함
- 주의
- 기본 생성자 필수
- 파라미터없음
- public
- protected
- final 클래스, enum, interface, inner 클래스 사용 불가
- 저장할 필드에 final 사용불가 (변경가능하기 때문)
- 기본 생성자 필수
- 주의
- @Table : 엔티티와 매핑할 테이블 지정
@Entity
@Table(name = "MBR")
public class Member {}
- name : 매핑할 이름
- catalog : DB 카탈로그 매핑
- schema : DB 스키마 매핑
- uniqueConstraints(DDL) : DDL 생성시 유니크 제약조건 생성
2. 데이버베이스 스키마 자동생성
- DDL을 애플리케이션 실행시점에 자동 생성
- 테이블중심 → 객체중심!
- DB 방언(dialect)을 사용해서 DB에 맞는 DDL 생성
- persistence.xml
- create : 기존테이블 삭제 후 다시생성 (운영장비에 사용 X)
- create-drop : create와 같으나 종료시점에 테이블 DROP (운영장비에 사용 X)
- update : 변경문만 반영 (운영장비에 사용 X)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지않음
- <property name="hibernate.hbm2ddl.auto" value="create" />
- 개발초기 : create, update
- 테스트서버 : update, validate
- 스테이징, 운영서버 : validate, none
3. 필드와 컬럼 매핑 @Column
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
- @Column : 컬럼매핑
- name : 테이블 컬럼 이름
- insertable, updateable : 등록, 변경 가능여부
- nullable(DDL) : null값 허용 여부. 기본 true, nullable = false → not null
- unique(DDL) : 유니크 제약조건. 제약조건이름때문에, @Table(uniqueConstraints)로 설정함
- columnDefinition : 컬럼 정보를 직접줄 수 있다. columnDefinition = varchar(100) default ‘EMPTY’
- length(DDL) : String 제약조건
- @Enumerated : enum 타입매핑
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 : 나중에 enum값이 추가되면 큰 오류로 남겨질 수 있음
- EnumType.STRING: enum 이름을 데이터베이스에 저장
- @Temporal : 날짜타입 매핑
- 최근 버전은 그냥 어노테이션 없이 LocalData, LocalDateTime을 사용하면 된다.
- TemporalType.DATA : 날짜
- TemporalType.TIME : 시간
- TemporalType.TIMESTAMP : 날짜시간
- @Lob : 큰 값
- @Transient : 매핑하지 않음(메모리에서만 사용)
4. 기본 키 매핑 @Id @GeneratedValue
@GeneratedValue
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- 기본 키 생성을 DB에 위임
- null로 들어가면 자동으로 생성해 줌
- @GeneratedValue(strategy = GenerationType.SEQUENCE)
- : 기본 키 생성을 등록된 시퀀스로 생성
권장
Long형 + 대체키 + 키 생성전략
실전예제1 - 요구사항 분석과 기본 매핑
1. 도메인 모델 분석
2. 테이블설계
3. 엔티티 설계 및 매핑
데이터 중심 설계의 문제점
- 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
- Order order = em.find(Order.class, 1L); // order.getMember() 를 사용하지 못한다. // 관계형 DB에 맞춘 설계임 Long memberId = order.getMemberId(); Member member = em.find(Member.class, memberId);
- 테이블의 외래키를 객체에 그대로 가져옴
- 객체 그래프 탐색이 불가능
- 참조가 없으므로 UML도 잘못됨
1. 객체와 테이블 매핑 @Entity @Table
- @Entity : JPA가 관리, 엔티티라 함
- 주의
- 기본 생성자 필수
- 파라미터없음
- public
- protected
- final 클래스, enum, interface, inner 클래스 사용 불가
- 저장할 필드에 final 사용불가 (변경가능하기 때문)
- 기본 생성자 필수
- 주의
- @Table : 엔티티와 매핑할 테이블 지정
@Entity
@Table(name = "MBR")
public class Member {}
- name : 매핑할 이름
- catalog : DB 카탈로그 매핑
- schema : DB 스키마 매핑
- uniqueConstraints(DDL) : DDL 생성시 유니크 제약조건 생성
2. 데이버베이스 스키마 자동생성
- DDL을 애플리케이션 실행시점에 자동 생성
- 테이블중심 → 객체중심!
- DB 방언(dialect)을 사용해서 DB에 맞는 DDL 생성
- persistence.xml
- create : 기존테이블 삭제 후 다시생성 (운영장비에 사용 X)
- create-drop : create와 같으나 종료시점에 테이블 DROP (운영장비에 사용 X)
- update : 변경문만 반영 (운영장비에 사용 X)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지않음
- <property name="hibernate.hbm2ddl.auto" value="create" />
- 개발초기 : create, update
- 테스트서버 : update, validate
- 스테이징, 운영서버 : validate, none
3. 필드와 컬럼 매핑 @Column
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
- @Column : 컬럼매핑
- name : 테이블 컬럼 이름
- insertable, updateable : 등록, 변경 가능여부
- nullable(DDL) : null값 허용 여부. 기본 true, nullable = false → not null
- unique(DDL) : 유니크 제약조건. 제약조건이름때문에, @Table(uniqueConstraints)로 설정함
- columnDefinition : 컬럼 정보를 직접줄 수 있다. columnDefinition = varchar(100) default ‘EMPTY’
- length(DDL) : String 제약조건
- @Enumerated : enum 타입매핑
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 : 나중에 enum값이 추가되면 큰 오류로 남겨질 수 있음
- EnumType.STRING: enum 이름을 데이터베이스에 저장
- @Temporal : 날짜타입 매핑
- 최근 버전은 그냥 어노테이션 없이 LocalData, LocalDateTime을 사용하면 된다.
- TemporalType.DATA : 날짜
- TemporalType.TIME : 시간
- TemporalType.TIMESTAMP : 날짜시간
- @Lob : 큰 값
- @Transient : 매핑하지 않음(메모리에서만 사용)
4. 기본 키 매핑 @Id @GeneratedValue
@GeneratedValue
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- 기본 키 생성을 DB에 위임
- null로 들어가면 자동으로 생성해 줌
- @GeneratedValue(strategy = GenerationType.SEQUENCE)
- : 기본 키 생성을 등록된 시퀀스로 생성
권장
Long형 + 대체키 + 키 생성전략
실전예제1 - 요구사항 분석과 기본 매핑
1. 도메인 모델 분석
2. 테이블설계
3. 엔티티 설계 및 매핑
데이터 중심 설계의 문제점
- 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
- Order order = em.find(Order.class, 1L); // order.getMember() 를 사용하지 못한다. // 관계형 DB에 맞춘 설계임 Long memberId = order.getMemberId(); Member member = em.find(Member.class, memberId);
- 테이블의 외래키를 객체에 그대로 가져옴
- 객체 그래프 탐색이 불가능
- 참조가 없으므로 UML도 잘못됨
'공부 > Spring' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (0) | 2022.07.02 |
---|---|
[JPA] 연관관계 매핑 기초 (0) | 2022.07.02 |
[JPA] 영속성 관리 - 내부 동작 방식 (0) | 2022.07.02 |
JPA 시작하기 (0) | 2022.06.20 |
JPA 소개 (0) | 2022.06.20 |
댓글