이전에 정리했던 JPA Annotations 에 이어, 유용한 Hibernate Annotations 에 대해서 알아보겠습니다.
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;
Hibernate Annotation
으로 Entity 필드 값을 Database 내에서 계산된 값으로 매핑할 때 사용됩니다. 결국 @Formula 의 value 값이 Query 로 치환되어 요청하고 해당 값을 필드에 매핑합니다.
@Formula("case when login_attempts > 4 then 'Y' else 'N' end")
private String lockYn;
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'
조건이 붙어서 전달됩니다.
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 문제를 해결할 수 있습니다.