본문 바로가기
JAVA/JPA

[Spring + JPA] JPA 애노테이션 정리

by 개미가되고싶은사람 2024. 11. 3.

목차

    테이블 관련

    @Entity 

    JPA를 사용해서 테이블과 매핑할 클래스를 의미하며, 기본 생성자가 무조건 있어야 됩니다.

     

    @Table

    속성 기능 기본값
    name  매핑할 테이블 이름 지정 및 매핑 객체 이름을 사용
    catalog  데이터베이스 catalog 매핑  
    schema  데이터베이스 schema 매핑  
    uniqueConstraints DDL 생성 시에 유니크 제약 조건 생성  
    @Table(
        name = "table_name",         // 매핑할 테이블 이름 변경
        catalog = "my_catalog",      // 데이터베이스 catalog 매핑
        schema = "my_schema",        // 데이터베이스 schema 매핑
        uniqueConstraints = {
            @UniqueConstraint(
            name = "unique_constraint_name", // 유니크 제약 조건 이름 지정
            columnNames = {"column1", "column2"}) // 유니크 제약 적용될 컬럼 지정
        }
    )
    public class MyEntity {
    
        @Id
        private Long id;
    
        @Column(name = "column1")
        private String column1;
    
        @Column(name = "column2")
        private String column2;
    }

     

     

    컬럼 관련

    @Column

    속성 설명 기본값
    name 필드와 매핑할 테이블의 컬럼 이름 지정 필드 이름
    insertable,updatable 등록(insert), 변경(update) 가능 여부 TRUE
    nullable null 값의 허용 여부  
    unique 유니크 제약조건  
    columnDefinition 데이터베이스 컬럼 정보를 직접 지정  
    length 문자 길이 제약조건 255
    precision,scale precision은 전체 자릿수를 의미하고 scale은 소수점 이하의 자릿수를 나타냅니다. 예를 들어, 숫자 123.456의 경우 precision은 6이고 scale은 3입니다. double, float 타입에는 적용되지 않습니다. ※ BigDecimal, BigInteger와 같은 정밀 숫자 타입에 사용가능

     

     

    @Enumerated

    자바 enum 타입을 매핑할 때 사용

    • EnumType.ORDINAL: enum 순서(0부터 시작하는 인덱스)를 데이터베이스에 저장
    • EnumType.STRING: enum 이름(문자열)을 데이터베이스에 저장
    public enum RoleType {
        USER, ADMIN
    }
    // ORDINAL인 경우 USER=0, ADMIN=1 으로 저장
    // STRING인 경우 USER=USER, ADMIN=ADMIN 으로 저장

     

    @Lob

    데이터베이스 BLOB, CLOB 타입과 매핑 하고 싶은 경우 사용합니다. 필드 타입이 문자일 경우 CLOB(예: String, char[])로 매핑되고, 나머지 타입은 BLOB(예: byte[])으로 매핑됩니다.

     

    @Transient

    해당 애노테이션은 해당 필드를 데이터베이스에 매핑하지 않도록 지정합니다. 이 애노테이션이 적용된 필드는 데이터베이스에 저장되거나 조회되지 않으며, 주로 자바 메모리에서 임시로 값을 보관할 때 사용됩니다.

     

     

    기본 키 관련

    @Id

    기본 키 값을 직접 할당할 경우 사용

     

    @GeneratedValue

    JPA에서 엔티티의 기본 키를 자동으로 생성할 때 사용됩니다. 이 애노테이션을 사용하면 데이터베이스에서 기본 키 값을 자동으로 생성할 수 있으며, SEQUENCE, IDENTITY, UUID, AUTO, TABLE와 같은 다양한 전략을 사용할 수 있습니다.

     

     

    IDENTITY 전략

    기본 키 생성을 데이터베이스에 위임하는 전략입니다. MySQL인 경우 AUTO_INCREMENT가 사용되며, 데이터베이스에 INSERT SQL을 실행한 후에 식별자 값을 알 수 있습니다.
    그리고 IDENTITY 전략을 사용할 때 em.persist()를 호출하면 flush가 발생하여 식별자가 생성되고, 해당 트랜잭션에서는  이 식별자를 사용할 수 있지만 다른 트랜잭션에서는 아직 커밋되지 않아서 사용할 수 없습니다.

     

     

    SEQUENCE 전략

    시퀀스를 이용해서 기본 키 값을 설정하는 전략입니다. 해당 전략은 시퀀스를 이용하는 전략이기 때문에 시퀀스 기능이 존재하는 오라클, PostgreSQL와 같은 데이터베이스에서 사용 가능합니다.

    @SequenceGenerator(
        // 애플리케이션 내에서 시퀀스를 구별하는 값으로
        // @GeneratedValue generator 옵션에 사용됩니다.
        name = "MEMBER_SEQ_GENERATOR", 
        sequenceName = "MEMBER_SEQ", // 데이터베이스에 저장될 시퀀스 네이밍
        initialValue = 1, // 시퀀스의 시작 값 설정
        allocationSize = 1 // 시퀀스 한 번 호출에 증가할 양을 설정(대용량 데이터를 삽입할 때 값 증가)
    )
    public class Member {
        @Id 
        @GeneratedValue(strategy = GenerationType.SEQUENCE, // 시퀀스 전략 사용한다고 설정
                        generator = "MEMBER_SEQ_GENERATOR") // 사용할 시퀀스 이름 지정
        private Long id; 
    }

     

    IDENTITY, SEQUENCE 차이점

    IDENTITY는 특정 테이블의 자동으로 증가하는 고유 값을 생성하는 반면, SEQUENCE는 독립적으로 존재하며 여러 테이블에서 공유할 수 있는 시퀀스를 생성합니다. IDENTITY는 데이터베이스가 자동으로 관리하지만, SEQUENCE는 사용자가 수동으로 호출하여 값을 증가시킬 수 있으며, SEQUENCE는 시작 값, 증가 값 등 다양한 설정이 가능하여 더 많은 기능을 제공합니다.

     

     

     

    TABLE

    별도의 테이블을 사용하여 기본 키 값을 생성합니다. 모든 데이터베이스에 적용한 전략이지만 성능 최적화 하는게 힘듭니다.


    AUTO 

    JPA가 데이터베이스에 따라 자동으로 적절한 기본 키 생성 전략을 선택합니다.

     

    UUID

    UUID를 사용하여 기본 키를 생성하는 방법으로 @GenericGenerator와 함께 사용하여 UUID를 생성할 수 있습니다.