객체(Object)와 테이블(Table) 매핑
JPA에서 제일 중요한 2가지는 JPA의 동작 원리 또는 과정과 영속성 콘텍스트 즉, JPA 매커니즘적 측면과 객체(Object)와 테이블(Table)간에 어떻게 매핑을 하여 사용할것 인지 즉, JPA의 설계적 측면이 가장 중요하다고 합니다.
이번 포스팅에서는 JPA의 설계적인 측면(객체와 테이블 매핑)에 대하여 정리해보도록 하겠습니다.
JPA의 매커니즘과 관련해서는 이전 포스팅을 참고해주세요.
[Spring] JPA(Java Persistence API)란?
JPA(Java Persistence API)란?JPA(Java persistence API)는 자바 진영에서 ORM(Object-Relational-Mapping) 기술 표준으로 사용되는 인터페이스의 모음입니다. 그 말은 즉, 실제적으로 구현된것이 아니라 구현된 클래스
h-1-y.tistory.com
@Entity
@Entity 클래스(객체)와 테이블을 매핑해주는 JPA의 어노테이션 입니다. 해당 어노테이션이 붙은 클래스는 JPA가 관리하는 Entity이며, JPA를 사용하여 테이블과 매핑할 클래스는 @Entity 어노테이션이 필요합니다.
💡 주의사항
- 기본 생성자 필수(매개변수가 없는 public OR protected 생성자)
- final 클래스 / enum / interface / inner 클래스는 사용 불가
- 저장할 필드에 final 사용 불가
@Entity의 속성
속성 | 설명 |
name | JPA에서 사용할 Entity의 이름을 지정합니다. (같은 클래스의 객체가 있을 경우 객체를 구분하기 위함) |
@Entity(name = "Member")
public class Member {
/** 생략 **/
}
@Table
@Table 어노테이션은 객체와 매핑할 테이블을 지정합니다. 사용하지 않을 경우 클래스의 이름과 동일한 테이블과 매핑합니다.
@Table의 속성
속성 | 설명 |
name | 매핑할 테이블 이름을 지정합니다. |
catalog | catalog 기능이 있는 DB에서 catalog를 매핑합니다. |
schema | schema 기능이 있는 DB에서 schema를 매핑합니다. |
uniqueConstaraints | DDL 생성시 유니크 제약조건을 만듭니다. (스키마 자동 생성 기능을 사용해서 DDL을 만들때만 사용) |
indexes | 컬럼의 index를 지정할때 사용합니다. |
@Entity
@Table(name = "USER")
public class Member {
/** 생략 **/
}
데이터베이스 스키마 자동 생성
JPA의 구현체 중 하나인 hibernate는 다양한 기능을 제공하는데 그 중 엔티티만 등록해놓으면 DDL(Data Definition Language)을 자동으로 작성하여 테이블을 생성하거나 수정해주는 ddl-auto라는 설정이 있습니다.
💡 환경설정
properties : spring.jpa.hibernate.ddl-auto=create
xml : <property name="hibernate.hbm2ddl.auto" value="create" />
yml : spring :
jpa :
hibernate :
ddl-auto : create
ddl-auto의 속성
속성 | 설명 |
create | 기존 테이블을 삭제하고 새로 생성합니다. (DROP - CREATE) |
create-drop | create와 동일하나 어플리케이션 종료시 테이블을 삭제합니다. (DROP - CREATE - DROP) |
update | 엔티티 매핑정보를 비교해서 변경사항만 수정합니다. |
validate | 엔티티 매핑정보를 비교해서 테이블과 객체간 변경점이 있다면 어플리케이션을 실행하지 않습니다. |
none | 자동 생성 기능을 사용하지 않습니다. (default) |
애플리케이션의 로딩 시점에 DDL을 자동으로 생성해주는 모습을 콘솔로그를 통해 확인할 수 있습니다. (ddl-auto : create)
ddl-auto의 주의사항
ddl-auto의 기능은 얼핏 보기엔 굉장히 편리해보이지만 validate와 none 속성 정도를 제외하면 운영 환경에서는 절대 사용하면 안됩니다. 해당 기능의 옵션을 create 또는 create-drop 등으로 설정 후 애플리케이션을 실행하면 운영 DB의 데이터가 모조리 삭제되는 대참사가 일어나게 될수도 있기 때문입니다.
따라서, 김영한 강사님의 JPA 강의에서는 아래와 같이 이 속성을 주의해서 사용할 것을 강조하고 있습니다. 또한 DDL을 JPA에서 자동으로 작성해 주더라도 결국엔 사람의 손을 거쳐야 한다고 합니다.
- 개발 초기 단계 또는 로컬 환경 : create 또는 create-drop
- 테스트 서버 : update 또는 validate
- 스테이징 및 운영 서버 : validate 또는 none
필드와 컬럼 매핑
엔티티의 필드와 컬럼을 매핑하기 위해 JPA에서 제공하는 다양한 어노테이션에 대해 알아보겠습니다.
어노테이션 종류
- @Column : 컬럼 매핑
- @Enumerated : Enum 타입 매핑
- @Temporal : 날짜 타입 매핑
- @Lob : BLOB, CLOB 등 길이 제한이 없는 문자열 타입 매핑
- @Transient : 해당 필드를 컬럼과 매핑하지 않음
- @Access : JPA가 엔티티에 접근하는 방식 설정
- @Id : 기본키(Primay Key) 매핑
위의 종류 외에도 다양한 종류의 어노테이션이 있으며, 이번 포스팅에서는 위의 어노테이션들에 대해서만 다루겠습니다.
@Column
엔티티의 필드를 테이블의 컬럼과 매핑합니다.
@Column의 속성
속성 | 설명 | 기본값 |
name | 필드와 매핑할 컬럼명 | 필드명 |
insertable | 엔티티 저장 시 해당 필드를 저장여부 | true |
updatable | 엔티티 수정 시 해당 필드를 수정여부 | true |
table | 하나의 엔티티에 2개 이상의 테이블을 매핑할 경우 사용하며, 해당 어노테이션으로 지정한 필드는 다른 테이블에 매핑 가능 | 현재 엔티티의 매핑된 테이블 |
nullable(DDL) | null 값 허용 여부 | true |
unique(DDL) | 유니크 제약조건 설정 | - |
length(DDL) | 길이 제한 설정 (String 타입에서만 사용 가능) | 255 |
precision, scale(DDL) | BigDecimal 또는 BigInteger 타입에서 사용하며 precision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수 | precision = 19, scale = 2 |
columnDefinition | 컬럼 생성 시 세부적인 조건(자료형, 길이, 기본값 등)을 설정 | - |
@Entity
public class Member {
/** 생략 **/
@Column(name = "USER_NAME", nullable = false, length = 20)
private String username;
/** 생략 **/
}
@Enumerated
자바의 Enum 타입을 매핑합니다.
@Enumerated의 속성
속성 | 설명 | 기본값 |
EnumType.ORDINAL | enum의 순서대로 데이터베이에 저장 (ex. 1, 2, 3 ...) | 기본값 |
EnumType.STRING | enum의 작성된 문자열 그대로 데이터베이스에 저장 | - |
@Entity
public class Member {
/** 생략 **/
@Enumerated(EnumType.STRING) // Enum 타입을 쓰는 경우
private RoleType roleType;
/** 생략 **/
}
ORDINAL의 경우 enum의 순서가 바뀐다거나 새롭게 추가될 경우 기존에 저장된 데이터가 꼬일수 있기 때문에 STRING 옵션을 사용하는 것이 안전합니다.
@Temporal
날짜 타입을 매핑합니다.
@Temporal의 속성
속성 | 설명 | 기본값 |
TemporalType.DATE | 날짜를 매핑합니다. ( ex : 0000-00-00 ) | - |
TemporalType.TIME | 시간을 매핑합니다. ( ex : 00:00:00 ) | - |
TemporalType.TIMESTAMP | 날짜 + 시간을 매핑합니다. ( ex : 0000-00-00 00:00:00 ) | 기본값 |
@Entity
public class Member {
/** 생략 **/
@Temporal(TemporalType.TEIMSTAMP) // 날짜 타입을 쓰는 경우
private Date createDate;
/** 생략 **/
}
@Lob
BLOB, CLOB 타입과 매핑합니다.
해당 어노테이션은 따로 지정할 수 있는 속성이 없습니다. 매핑하는 필드가 문자열(String)이라면 CLOB으로 매핑하고, 그렇지 않다면 BLOB으로 매핑합니다.
- CLOB(Character Large Object) : 문자 기반의 큰 객체를 나타내며, 주로 텍스트 데이터를 저장하는데 사용
- BLOB(Binary Large Object) : 이진 데이터를 저장하는데 사용되며, 주로 이미지/오디오/비디오 등 바이너리 데이터를 저장하는데 사용
@Entity
public class Member {
@Lob // Clob
private String description;
@Lob // Blob
private byte[] description2;
}
@Transient
해당 어노테이션은 필드를 컬럼과 매핑하지 않고 별도의 용도로 사용하고 싶은 경우 사용합니다.
@Entity
public class Member {
/** 생략 **/
@Transient // table과 매핑하지 않고 별도의 용도로 사용하겠다.
private String etc;
/** 생략 **/
}
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정할때 사용합니다. 해당 어노테이션은 두가지의 방법이 있습니다.
- @Access(AccessType.FIELD) - 필드 접근
- @Access(AccessType.PROPERTY) - 프로퍼티 접근
해당 어노테이션은 아래의 내용을 참고하겠습니다.
[JPA] 엔티티 데이터 접근 방식 @Access(AccessType.FIELD), @Access(AccessType.PROPERTY)
@Access(AccessType.FIELD), @Access(AccessType.PROPERTY) 란? JPA가 엔티티 데이터에 접근하는 방식을 지정할 수 있는 어노테이션 @Access(AccessType.FIELD) - 필드 접근 @Access(AccessType.PROPERTY) - 프로퍼티 접근 먼저 필
dami97.tistory.com
@Id
해당 어노테이션이 붙은 필드를 테이블의 기본키(Primary Key)로 지정합니다. 해당 어노테이션은 기본키 생성 전략이라는 포스팅을 통해 자세히 정리하도록 하겠습니다.
[Spring] JPA 기본키(Primary Key) 매핑
기본키(Primary Key) 매핑 방법기본키를 매핑하기 위해서는 @Id, @GeneratedValue 두가지의 어노테이션을 사용하게 되는데, JPA에서 기본키를 매핑하는 방법은 2가지로 직접 할당과 자동 생성이 있습니다.
h-1-y.tistory.com
reference
'Back-End > Spring' 카테고리의 다른 글
[Spring] JPA 연관관계 매핑 (0) | 2024.09.05 |
---|---|
[Spring] JPA 기본키(Primary Key) 매핑 (1) | 2024.09.04 |
[Spring] JPA 프로젝트 생성 및 예제 실습 -1- (0) | 2024.07.11 |
[Spring] JPA(Java Persistence API)란? (0) | 2024.07.09 |
[Spring] DispatcherServlet이란? (0) | 2024.06.24 |