Hibernate Annotations

GEONNY·2024년 8월 20일
0
post-thumbnail

이전에 정리했던 JPA Annotations 에 이어, 유용한 Hibernate Annotations 에 대해서 알아보겠습니다.

📌Hibernate Annotations

📍@GenericGenerator

Entity ID 생성 전략을 Hibernate의 커스텀 방식으로 지정할 때 사용됩니다.

	@Id
    @GenericGenerator(name = "menuIdGenerator", type = KeyGeneratorUtil.class
            , parameters = @org.hibernate.annotations.Parameter(name =
            	GENERATOR_PARAM_KEY, value = "menu"))
    @GeneratedValue(generator = "menuIdGenerator")
    @Column(name = "MENU_ID")
    private String menuId;

📍@Formula

Hibernate Annotation으로 Entity 필드 값을 Database 내에서 계산된 값으로 매핑할 때 사용됩니다. 결국 @Formula 의 value 값이 Query 로 치환되어 요청하고 해당 값을 필드에 매핑합니다.

	@Formula("case when login_attempts > 4 then 'Y' else 'N' end")
    private String lockYn;

📍@SQLRestriction

SQL 조건을 설정하여 해당 조건에 해당하는 데이터만 쿼리하는데 사용됩니다. Entity Level 에서 사용할 수 있습니다. @Where 도 같은 기능을 하지만 6.3 version 에서 Deprecated 되었습니다.

@SQLRestriction("use_yn = 'N'")
public class Member extends BaseEntity implements Persistable<String> {
//이하 생략..

위와 같이 설정 시 Member 를 조회할 때 항상 where use_yn = 'N' 조건이 붙어서 전달됩니다.

📍@BatchSize

Hibernate에서 N + 1 문제를 해결하거나 Database Access 성능을 최적화 하기 위해 사용하는 Annotation 입니다. Entity 나 Collection 을 한번에 몇개씩 로드할 지에 대한 배치 크기를 설정할 수 있습니다. N + 1 문제에 대해서는 추후에 자세히 다루겠습니다.

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table
@Entity(name = "authority")
public class Authority extends BaseEntity {

    @Id
    @Column(name = "authority_cd")
    private String authorityCode;

    @Column(name = "authority_nm")
    private String authorityName;

    @OneToMany(mappedBy = "authority", fetch = FetchType.LAZY)
    @OrderBy("memberName asc")
    @BatchSize(size = 2)
    private Set<Member> members = new HashSet<>();
}

4개의 권한이 존재할 때 BatchSize 설정을 하지 않으면 권한 조회 쿼리 1번, 각 권한을 갖는 Member 조회 4번 이렇게 총 5번의 쿼리가 전송됩니다. @BatchSize(size = 2) 로 설정 시 2개의 쿼리로 묶어서 Member 조회는 2번만 이루어지게 됩니다. @BatchSize(size = 4) 로 설정 시 각 1개의 쿼리만 전송되게 되죠. 이렇게 N + 1 문제를 해결할 수 있습니다.

profile
Back-end developer

0개의 댓글