이번 포스팅에서는 추가한 데이터베이스에 엔티티(Entity)를 설정하기 위한 기본 어노테이션들을 공부해보려합니다.
JPA에서 가장 기본이 되는 어노테이션을 먼저 다루고 이후 포스팅을 통해서 고급 어노테이션을 공부할 예정입니다.
# 1. 엔티티(Entity) 추가
package devbox.jpa.step02.db.entity;
import java.util.Date;
import jakarta.persistence.Access;
import jakarta.persistence.AccessType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Transient;
@Entity
@Table
@Access(AccessType.PROPERTY)
public class UserSimple {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
private String email;
@Column(name = "password", nullable = true, unique = false, length = 30)
private String pw;
@Temporal(TemporalType.DATE)
private Date joinDate;
@Transient
private String temp;
public UserSimple(String name, String email, String pw, Date joinDate, String temp) {
this.name = name;
this.email = email;
this.pw = pw;
this.joinDate = joinDate;
this.temp = temp;
}
public Long getId() {
return id;
}
public String getName() {
return name.toLowerCase();
}
public String getEmail() {
return email;
}
public String getPw() {
return pw;
}
public Date getJoinDate() {
return joinDate;
}
public String getTemp() {
return temp;
}
}
우선 입력이 위 코드는 입력이 모두 완료된 엔티티(Entity)입니다.
여기서 잠깐! 사람마다의 개인 차이가 있는 부분이 있습니다. 이 블로그의 포스팅에서는 lombok을 사용하지 않으며 필요한 메소드만 직접 정의해주는 방식으로 코드를 공유하고 있습니다. 기본적으로 이해가 있는 경우에는 코드를 약간 변형하여 사용해봐도 좋습니다.
그러면 위 코드에서 사용하고 있는 기본 어노테이션에 대해서 설명을 풀어봅니다.
# 2. 기본 어노테이션(Annotation)
@Entity
실제 데이터베이스 테이블과 매핑 시킵니다. JPA에서 직접 사용하고 관리하며 테이블의 엔티티인 경우 반드시 사용해야하는 어노테이션입니다.
- 속성
name : JPA에서 사용할 엔티티 이름을 지정하며, 입력하지 않은 경우에는 기본 값으로 클래스명과 동일하게 지정됩니다.
@Table
생략이 가능한 어노테이션입니다. 생략하는 경우 @Entity 설정에 따라가도록 기본값으로 설정됩니다.
- 속성
name : @Entity 을 무시하고 실제 데이터베이스의 테이블명을 재정의합니다.
schema : schema 기능이 있는 데이터베이스에서 특정 schema와 매핑하도록 합니다.
@Access
JPA가 엔티티에 접근하는 방식을 지정합니다. 지정하지 않는 경우 기본값인 AccessType.FIELD로 지정됩니다.
@Id
실제 데이터베이스 테이블에서 PK로 지정된 컬럼을 JPA가 인지할 수 있도록 매핑시켜줍니다.
@GeneratedValue
PK 생성 전략으로 어떤 방식으로 생성할 것인지 지정합니다. 이 어노테이션을 설정하지 않는 경우에는 데이터베이스에 데이터를 삽입할 때마다 PK를 직접 입력해야합니다.
- 속성
GenerationType.IDENTITY : 자동 생성 전략을 데이터베이스에 설정된 방법으로 사용하도록 합니다.
GenerationType.SEQUENCE : 데이터베이스 시퀀스를 사용해서 PK를 할당하며 대부분 1,2,3,4... 로 자동으로 증가됩니다. (일부 지원하지 않는 데이터베이스가 있습니다.)
GenerationType.TABLE : 키 생성 전용 테이블을 만들어서 사용하는 것으로 데이터베이스 시퀀스를 흉내내는 방법입니다.
GenerationType.AUTO : 데이터베이스 종류에 따라 해당하는 데이터베이스의 자동 생성 전략의 기본값을 사용하도록 합니다.
@Column
생략이 가능한 어노테이션입니다. 모든 변수들은 테이블의 컬럼들과 매핑합니다. 다만 일부 설정 변경이 필요한 경우 어노테이션을 사용합니다.
- 속성
name : 실제 테이블의 컬럼명과 매칭할 이름을 지정합니다. 코드에서 사용할 변수와 실제 컬럼명이 다른 경우에 사용되는 속성값입니다.
length : 컬럼의 길이를 제한하는 것으로 문자 길이 제약 조건입니다. 기본 값으로는 255이며 String 타입에서만 사용이 가능합니다.
nullable : 컬럼에 삽입될 데이터의 null 에 대한 허용 여부를 설정합니다.
unique : 컬럼에 유니크 제약조건을 사용할 것인지를 설정합니다.
@Temporal
데이터베이스에 날짜가 삽입될 때, 어떤 포맷으로 삽입되도록 할 것인지 설정합니다. 이 어노테이션을 사용하지 않는 경우 기본값으로 TemporalType.TIMESTAMP가 사용됩니다.
- 옵션
TemporalType.DATE : 데이터베이스에 삽입될 때 yyyy-MM-dd 의 형태로 삽입됩니다. 즉 2023-12-09의 형태로 삽입됩니다.
TemporalType.TIME : 데이터베이스에 삽입될 때 HH:mm:ss 의 형태로 삽입됩니다. 즉 07:30:10의 형태로 삽입됩니다.
TemporalType.TIMESTAMP : 데이터베이스에 삽입될 때 yyyy-MM-dd HH:mm:ss 의 형태로 삽입됩니다. 즉 2023-12-09 07:30:10의 형태로 삽입됩니다.
@Transient
데이터베이스와 매핑하지 않겠다고 정의합니다. 이 어노테이션은 변수가 실제 데이터베이스의 컬럼에 존재하지 않아도 되며 임시로 어떤 값을 보관하고 싶을 때 정의합니다.
위 링크를 통해 Github 로 접속하면 기본 샘플 예제를 다운받아서 확인해볼 수 있습니다.
'백앤드 > Jpa' 카테고리의 다른 글
[Jpa] 실전을 위한 JPA - #4 @GeneratedValue 컬럼 시퀀스 전략 및 성능 개선(튜닝) (0) | 2023.12.25 |
---|---|
[Jpa] 실전을 위한 JPA - #2 데이터베이스 설치 및 추가하기 (1) | 2023.12.06 |
[Jpa] 실전을 위한 JPA - #1 프로젝트 생성 (1) | 2023.11.20 |