본문 바로가기

백앤드/Jpa

[Jpa] 실전을 위한 JPA - #3 엔티티(Entity) 기본 어노테이션

반응형

이번 포스팅에서는 추가한 데이터베이스에 엔티티(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 로 접속하면 기본 샘플 예제를 다운받아서 확인해볼 수 있습니다.

반응형