본문 바로가기
JPA

[JPA] 객체와 테이블 매핑

by byeongoo 2020. 4. 10.

1. 엔티티 매핑 소개

  • 객체와 테이블 매핑 : @Entity, @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본키 매핑 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

2. @Entity

  • @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라고합니다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수적으로 붙여줍니다.
  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스 사용 X
  • 저장할 필드에 final 사용 X

@Entity 속성 정리

  •  name : jpa에서 사용할 엔티티 이름을 지정합니다. 
  • 기본값: 클래스 이름을 그대로 사용합니다. (ex) Member
  • 같은 클래스 이름이 없으면 가급적 기본값을 사용합니다.

@Table 

엔티티와 매핑할 테이블을 지정합니다.

2. 데이터 베이스 스키마 자동 생성

  • DDL을 애플리케잇녀 실행 시점에 자동 생성
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
  • 이렇게 생성된 DDL은 개발 장비에서만 사용
  • 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용

 

데이터베이스 스키마 자동생성 속성

update는 변경분만 반영해줍니다. 지우는건 안되고 추가하는거만 됩니다. 지우는건 잘못하면 테이블 컬럼이 삭제되면 엄청난 문제가 생길 수 있기 때문입니다. validate 는 엔티티와 테이블 정상 매핑만 확인합니다.

 

데이터베이스 스키마 자동생성 주의

  • 운영 장비에서는 절대 create, create-drop, update 사용하면 안됩니다.
  • 개발 초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none

DDL 생성 기능

제약 조건 추가 : 회원 이름은 필수, 10자 초과 x

@Column(nullable = false, length = 10)

유니크 제약 조건 추가

@Table(uniqueConstraints={@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"})})

DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않습니다.

3. 필드와 컬럼 매핑

package hellojpa; 

import javax.persistence.*; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.util.Date; 
@Entity public class Member {     
	@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;     
    
    //Getter, Setter… 
}

@Column(name="name") 이런식으로하면 db에는 name이고 필드는 다른이름으로 할 수 있습니다. Integer 같은 타입 쓰면 가장 가까운 타입으로 생성해줍니다. 객체에서 Enum 타입을 쓰고 싶음. DB에는 기본적으로 Enum 타입이 없기때문에 @Enumerated를 쓰면 됩니다. 날짜타입을 쓰게되면 @Temporal을 사용하면됨. 타입이 3가지가있습니다. DATE, TIME, TIMESTAMP. 자바의 DATE 타입은 날짜와 시간이 다있습니다. 그런데 데이터베이스에는 3가지를 구분해서 사용합니다. DATE, TIME, TIMESTAMP. 그래서 매핑정보를 줘야합니다. VARCHAR를 넘어서는 큰걸 넣고 싶으면 @Lob을 쓰면됩니다. @Transient 쓰면 DB랑 상관없이 쓸 수 있습니다. 메모리에서만 쓰겠다!

  • insertable, updatable : 이 컬럼을 수정했을때 데이터베이스에 insert,update를 할껀지 말껀지를 선택합니다. 예를 들어 등록과 변경을 절대하면 안되면 updateable을 false로 합니다.
  • nullable : 중요함. 기본이 true인데 false로 하면 not null 제약조건이 걸립니다.
  • unique : unique 제약 조건을 걸고 싶으면 true. 그런데 애는 잘 사용하지 않습니다. unique 제약조건을 만들어주긴하는데 이름이 랜덤처럼 나옴니다. 그리고 복합은 안되고 한 컬럼만 됩니다. @Table에서 걸면 unique 제약조건을 이름이랑 같이 줄 수 있습니다.
  • columnDefinition : 컬럼 정보를 직접 줄 수 있습니다.
  • BicDecimal 같은 경우에는 소수점에 대해서 옵션을 줄 수 있습니다. precision scale. 아주 큰 숫자나 소수점 쓸때 사용하면 됩니다.

@Enumerated

@Temporal

@Lob

  • 데이터베이스 BLOB, CLOB 타입과 매핑
  • @Lob에는 지정할 수 있는 속성이 없습니다.
  • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
    • CLOB : String, char[], java.sql.CLOB
    • BLOB : Byte[], java.sql.BLOB

@Transient

  • 필드 매핑 x
  • 데이터베이스에 저장 x, 조회 x
  • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
@Transient
private Integer temp;

REFERENCE

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 서버 데이터베이스 프레임워크 및 라이브러리 프로그래밍 언어 서비스 개발 Java JPA Spring Data JPA 온라인 강의 ORM, JPA, 자바, java, 우아한형제들

www.inflearn.com

 

'JPA' 카테고리의 다른 글

[JPA] 연관 관계 매핑의 종류  (0) 2020.04.19
[JPA] 연관관계 매핑 기초  (0) 2020.04.14
[JPA] 기본 키 매핑  (0) 2020.04.10
[JPA] 영속성 콘텍스트  (0) 2020.04.10
[JPA] 관계형 데이터베이스의 문제  (1) 2020.04.08