JPA 에서 제공하는 어노테이션

XingXi·2023년 12월 27일
0

JPA

목록 보기
6/23
post-thumbnail

🍕 Reference

자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런

JPA 를 사용하면 다양한 Annotation 을 접할 수 있다.
이에 대해 알아보자

@Entity

JPA가 관리하는 Entity 를 명시.

JPA 에서 영속화 대상이 되는 Entity 로 사용 하려면

1. 기본 생성자가 반드시 존재해야한다.
` - JPA 에서 reflection 을 사용하기 때문에

2. final, enum, interface, inner 클래스는 Entity 로 사용되지 않는다.


@Table(name = "사용자 지정")

JPA 에서 Query 생성시 테이블 이름을 설정

예시

@Entity
@Table(name = "User")
// Reflection 등을 JPA 에서 사용하기 때문에 기본 생성자가 존재해야한다.
public class Member
{


@Column

필드 설정을 위한 다양한 속성을 제공하는 Annotation

property namedescription
name필드 이름 지정
updatable필드 수정 가능 여부
insertable필드 데이터 삽입 가능 여부
notNull필수 값인지 설정 여부
unique필드가 unique 값인지 설정
(파악하기 어려워서 잘 사용하지 않음 )
length필드 길이
columnDefinition직접 DDL 정의
percision, scaleBigDecimalType 에서 소수점 표시

@Enumerated

DB 는 EnumType 이 존재하지 않기 때문에 해당 Annotation 을 사용

EnumType.STRING 으로 사용하는 것을 권장

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

기본값인 EnumType.ORDINAL 를 사용하면 EnumType 에 선언된 순서를 반환한다.

예시 - EnumType.STRING

package org.example.javamain.Entity;

public enum RoleType
{
    USER, ADMIN;
}
/////////////////////////////////

@Entity
@Table(name = "USR")
@Data
public class UserEntity
{
    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

  • roleType 필드가 문자열로 정의되었다.

    예시 - EnumType.ORDINAL 으로 설정한다면?

    ROLETYPE 의 DDL 이 integer 로 정의

    EnumType.ORDINAL 의 경우 ROLETYPE 의 DDL 이 integer 로 정의되었고 DataBase 에서
    정수로 저장된 것을 확인할 수 있다.

이때 EnumType 내용이 앞에 추가되면 어떻게 될까?

            try
            {
                UserEntity user = new UserEntity();
                user.setId(12L);
                user.setUsername("name");
                user.setAge(12);
                user.setRoleType(RoleType.USER);
                user.setCreateDate(new Date());
                user.setLastModifiedDate(new Date());
                user.setDescriptioin("SFA");

다음과 같이 같은 RoleType.USER 임에도 다른 값이 할당됐다.
정리하면 EnumType.ORDINAL 으로 사용하면
DDL 에서 필드 타입을 INTEGER 로 설정하고 순서가 변경시 같은 값임에도
다른 값이 할당 되기 때문에 EnumType.STRING 을 사용하는 것이 좋다


@Temporal

시간 정보를 저장

DB에는 DATE, TIME, TIMESTAMP 가 존재
현재는 LocalDate, LocalDateTime 이 존재하여 많이 사용하지 않는다.


@LOB

크기가 큰 필드를 정의하는데 사용
Mapping Type 이 문자열 : CLOB
그 외 : BLOB


@Transient

테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용



-> DDL 에서 정의되지 않은 것을 볼 수 있다.

정리

Annotationdescription
@EntityJPA가 관리하는 Entity 를 명시
@Column필드 설정을 위한 다양한 속성을 제공하는 Annotation
@EnumeratedDB 는 EnumType 이 존재하지 않기 때문에 해당 Annotation 을 사용
@Temporal테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용
@LOB크기가 큰 필드를 정의하는데 사용
@Transient테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용

0개의 댓글