본문 바로가기
백앤드/Jpa

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

by 지니어스쭌 2023. 12. 9.
반응형

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

반응형

댓글