개발/JPA

객체와 테이블 매핑, DB 스키마 자동 생성, 필드와 컬럼 매핑

Debin 2022. 2. 24.
반응형

2023. 02.07 11:15 복습 시작

객체와 테이블 매핑

JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것. 이에 대해 학습해보자.

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.

@Entity 적용 시 주의해야 할 점이 몇 가지 있다.

 

  1. 기본 생성자는 필수다. 즉, 파라미터가 없는 public or protected 생성자가 필수다.
  2. final 클래스, enum, interface, inner 클래스에서는 사용 불가하다.
  3. 저장할 필드에 final을 사용할 수 없다.

@Entity에는 name이라는 속성도 있다.

이는 엔티티 이름을 지정하는데 name을 설정하지 않는다면 클래스 이름을 그대로 사용한다.

@Table

@Table는 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

Table의 속성은 아래와 같다.

 

  • name : 매핑할 테이블 이름. 기본 값은 엔티티 이름을 사용한다.
  • catelog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성

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

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.

클래스의 매핑 정보를 보면 어떤 테이블에 어떤 칼럼을 사용하는지 알 수 있다.

JPA는 이 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 생성한다.

 

스키마 자동 생성 기능을 사용하면 애플리케이션 실행 시점에 데이터베이스 테이블이 자동으로 생성되므로 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.

 

이렇게 생성된 DDL은 개발 장비에서만 사용해야 한다.

생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용해야 한다.

 

아래에는 hibernate.hbm2 ddl.auto 속성을 정리한 것이다.

옵션 설명
create 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
create-drop create와 같으나 종료시점에 테이블 DROP
update 변경분만 반영(운영DB에는 사용하면 안됨)
validate 엔티티와 테이블이 정상 매핑되었는지만 확인
none 사용하지 않음. 그냥 기본 값

아래와 같이 적용하면 좋다.

 

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

DDL 생성 기능

만약 회원 이름은 필수로 입력되어야 하고, 10자를 초과하면 안 된다는 제약조건이 추가된다면 코드를 어떻게 짜야할까?

@Entity
@Table(name="MEMBER")
public class Member{

	@Id
    @Column(name="ID")
    private Long id;
    
    @Column(name="NAME" , nullable = false, length = 10)
    private String username;
    
    ...

}

@Column 매핑 정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약 조건을 추가할 수 있다.

그리고 length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수 있다.

 

유니크 제약 조건 추가 코드는 아래와 같다. 이것만 추가해 주면 된다.

@Entity
@Table(name="MEMBER", @Table(uniqueConstraints = {@UniqueConstraint(
   name = "NAME_AGE_UNIQUE",
   columnNames = {"NAME", "AGE"} )}))
public class Member{

    @Id
    @Column(name="ID")
    private Long id;
    
    @Column(name="NAME" , nullable = false, length = 10)
    private String username;
    
    ...

}

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

필드와 칼럼 매핑 

이제 JPA가 제공하는 필드와 컬럼 매핑용 어노테이션들을 정리해보자.

 

  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑
  • @Enumerated : enum 타입 매핑
  • @Lob : Blob, CLOB 매핑
  • @Transient : 특정 필드를 칼럼에 매핑하지 않음(매핑 무시)

@Column 속성 정리

속성 설명 기본 값
name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름
insertable (거의 사용 X)
updatable (거의 사용 X)
등록, 변경 가능 여부 true
table (거의 사용 X) 하나의 엔티티를 두개 이상의 테이블에 매핑할 때 사용
지정한 필드를 다른 테이블에 매핑할 수 있다.
현재 클래스가 매핑된 테이블
nullable(DDL) null 값의 허용 여부를 설장. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. true
unique(DDK) @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 두 컬럼 이상을 사용해서 유니크 제약 조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용  
columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있다.
ex varchar(100), default 'EMPTY'
필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성
length(DDL) 문자 길이 제약조건, String 타입에만 사용 255
precision, scale(DDL) BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수 다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다. precision=19,
scale=2

@Enumerated 속성 정리

자바 enum 타입을 매핑할 때 사용한다. 무조건 EnumType.STRING를 사용하자.

속성  설명 기본 값
value EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
EnumType.STRING : enum 이름을 데이터베이스에 저장
EnumType.ORDINAL

@Temporal 속성 정리

날짜 타입 (java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.

참고로 LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다.

속성 설명 기본 값
value TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑
(예: 2013–10–11)
TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
(예: 11:11:11)
TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이 스 timestamp 타입과 매핑
(예: 2013–10–11 11:11:11)
 

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑 

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

@Transient

이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장도 하지 않아 조회가 불가능하다.

객체에 임시로 어떤 값을 보관하고 싶을 때만 사용한다.

 

 

참고자료

자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 강의 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

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

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

2023. 02.07 11:35 복습 및 정리 마무리

반응형

댓글