본문 바로가기
공부/Spring

[JPA] 엔티티 매핑

by JERO__ 2022. 7. 2.

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

  1. @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 기본 키 생성을 DB에 위임
    • null로 들어가면 자동으로 생성해 줌
  2. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  3. : 기본 키 생성을 등록된 시퀀스로 생성

권장

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

  1. @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 기본 키 생성을 DB에 위임
    • null로 들어가면 자동으로 생성해 줌
  2. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  3. : 기본 키 생성을 등록된 시퀀스로 생성

권장

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

  1. @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 기본 키 생성을 DB에 위임
    • null로 들어가면 자동으로 생성해 줌
  2. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  3. : 기본 키 생성을 등록된 시퀀스로 생성

권장

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

댓글