ElastiCORE Annotation Complete Guide
Overview
Complete reference for all annotations used in ElastiCORE DSL with detailed usage and examples.
1. Entity Meta Annotation
1.1 기본 엔티티 선언
meta: entity
- Description: 기본 JPA 엔티티로 선언
- Generated Code:
@Entity,@Table포함
1.2 추상 엔티티
meta: entity @abstract
- Description: 상속 전용 추상 엔티티
- Generated Code:
abstract class로 생성 - Usage: BaseEntity, AuditEntity 등 공통 필드 정의
1.3 엔티티 상속
meta: entity @extend(ParentEntity)
- Description: 부모 엔티티로부터 상속
- Generated Code:
extends ParentEntity - Example:
entity:
AuditEntity:
meta: entity @abstract @extend(BaseEntity)
1.4 REST API 노출
meta: entity @expose
meta: entity @expose(pageSize)
- Description: REST API로 노출하며 검색 DTO 자동 생성
- Parameters:
pageSize- 기본 페이지 크기 - Default: 자동으로 검색 가능한 필드 생성 (string: like, datetime: between)
- Generated Code: Entity, DTO, Repository, Service, Controller, SearchDTO 클래스 생성
- Example:
Article:
meta: entity @expose(50) # 페이지당 50개 항목, 검색 DTO 생성
fields:
title: string(200)! # 자동으로 like 검색 생성
1.5 서비스 레이어만 노출
meta: entity @service
meta: entity @service(pageSize)
- Description: Controller 없이 Service 레이어만 생성하며 검색 DTO 자동 생성
- Parameters:
pageSize- 기본 페이지 크기 - Default: 자동으로 검색 가능한 필드 생성 (string: like, datetime: between)
- Generated Code: Entity, DTO, Repository, Service, SearchDTO 클래스 생성 (Controller 제외)
- Usage: 내부 서비스 로직에서만 사용하고 외부 REST API로 노출하지 않는 경우
- Example:
InternalData:
meta: entity @service(30) # 페이지당 30개 항목, Controller 생성 안함
fields:
name: string(100)!
value: string(500)
1.6 감사(Audit) 대상
meta: entity @audited
- Description: JPA Envers(dependency 설정필요) 를 통한 데이터 변경 이력 추적
- Generated Code:
@Audited어노테이션 추가 - Usage: 중요한 데이터의 변경 이력 관리
1.7 DTO 생성 표시
meta: entity @dto
- Description: 해당 엔티티에 대한 DTO 생성 가능 표시
- Generated Code: 별도 DTO 클래스 생성
1.8 페이징 지원
meta: entity @pageable
meta: entity @pageable(50)
- Description: 페이징 처리 지원
- Parameters:
pageSize- 페이지당 항목 수 - Default:
20 - Generated Code: Pageable 매개변수를 받는 메서드 생성
1.9 임베디드 엔티티
meta: entity @embeddable
- Description: JPA Embeddable 엔티티로 선언
- Generated Code:
@Embeddable어노테이션 추가 - Usage: 주소, 좌표 등 값 객체
1.10 테이블명 지정
meta: entity @table(tableName)
meta: entity @tbl(tableName)
- Description: 데이터베이스 테이블명 명시적 지정
- Parameters:
name- 테이블명 - Default: 엔티티명을 snake_case로 변환 (예: UserInfo → user_info)
- Generated Code:
@Table(name = "tableName") - Example:
Address:
meta: entity @embeddable @table(customer_address)
# 기본값 사용 예시 (UserProfile → user_profile 테이블)
UserProfile:
meta: entity
1.11 인덱스 정의
meta: entity @Index(name="idx_name", columnList="col1,col2")
meta: entity @Index(name="idx_name", columnList="col1,col2", unique=true)
meta: entity @idx(name="idx_name", columnList="col1,col2")
- Description: 데이터베이스 인덱스 정의
- Parameters:
name: 인덱스명 (선택사항)columnList: 컬럼 목록 (필수)unique: 유니크 제약조건 (선택사항)
- Default:
unique=false - Generated Code:
@Table내indexes속성 추가 - Example:
Message:
meta: entity @Index(name="idx_msg_create_date", columnList="create_date")
User:
meta: entity @Index(name="idx_user_email", columnList="email", unique=true)
2. Field Annotations
2.1 기본키 어노테이션
@id
fieldName: type @id
- Description: JPA 기본키 지정
- Generated Code:
@Id
@sequence
fieldName: long @id @sequence
- Description: 자동 증가 시퀀 스
- Generated Code:
@GeneratedValue(strategy = GenerationType.IDENTITY)
@genid
fieldName: string @id @genid
- Description: 사용자 정의 ID 생성기 사용
- Generated Code: env.yml의 genid 설정 참조
- 환경 설정:
annotations:
genid: "genid(io.elasticore.springboot3.util.IdUtils.newId)"
2.2 데이터 제약 어노테이션
@length(n) / @len(n) / @size(n) - 문자열 길이 제한 및 JPA Column 생성
- (중요) 타입(길이)와 같은 방식을 우선 최우선으로 사용. ex) string(10)
# 단순 길이 지정 (기존 방식)
fieldName: string(255)
fieldName: string @len(255)
fieldName: string @size(100)
# 복합 길이 매개변수 (최소/최대 동시 지정) - 최신 기능
title: string @size(min=5, max=200) # 제목 (별칭 사용)
Description: 문자열 필드의 길이 제한을 설정하며 JPA Column과 Bean Validation을 자동 생성
Parameter Format:
- 단순 매개변수:
@length(50)- 최대 길이만 지정 - 복합 매개변수:
@length(min=3, max=50)- 최소/최대 길이 동시 지정 - 별칭 지원:
@len,@size동일 기능
Compound Parameter Processing (최신 개선):
- JPA Column: 항상
max값을length속성으로 사용 - Bean Validation:
min,max모두@Size어노테이션에 적용 - 별칭 처리:
length,len,size모든 별칭에서 동일하게 작동 - 타입 인식: Annotation.TYPE_KEY_VALUE와 TYPE_SINGLE_VALUE 자동 구분
@default(value) - 필드 기본값 설정 및 스마트 인용부호 처리
# 불린 및 숫자 기본값
fieldName: boolean @default(true)
salary: double @default(0)
point: int @default(100)
# 문자열 기본값 - 스마트 인용부호 처리 (최신 개선 기능)
status: string @default("ACTIVE") # 큰따옴표 - 그대로 유지
category: string @default('GENERAL') # 작은따옴표 - 큰따옴표로 자동 변환
archiveStatus: string @default(COMPLETED) # 인용부호 없음 - 자동 추가
# Enumeration 및 특수 기본값
processType: ProcessType @default(ProcessType.HANG)
indicator: Indicator @default(Indicator.YES)
@updatable(false)
fieldName: datetime @updatable(false)
- Description: 수정 불가능 필드
- Generated Code:
@Column(updatable = false)
@notnull
fieldName: string @notnull
- Description: NOT NULL 제약 조건
- Generated Code:
@Column(nullable = false)
2.3 검색 어노테이션
@search(condition) / @searchable / @s / @srch / @filter
ElastiCORE는 다양한 검색 조건을 지원하며, 각 조건별로 최적화된 쿼리와 SearchDTO 필드를 자동 생성합니다.
1. LIKE 검색 (@search(like))
title: string @search(like)
productName: string @s(like)
- Usage: 문자열 부분 일치 검색
- 생성 쿼리:
WHERE LOWER(title) LIKE LOWER('%검색어%') - SearchDTO 필드:
title: string(단일 입력 필드)
2. 정확 일치 검색 (@search(eq))
empNo: string @search(eq)
status: string @search(eq)
categoryId: long @search(eq)
- Usage: 정확한 값 일치 검색
- 생성 쿼리:
WHERE empNo = :empNo
3. 범위 검색 (@search(between))
createDate: datetime @search(between)
salary: double @search(between)
age: int @search(between)
- Usage: 날짜나 숫자의 범위 검색
- 생성 쿼리:
WHERE createDate BETWEEN :createDateFrom AND :createDateTo - SearchDTO 필드:
createDateFrom: datetime(시작값)createDateTo: datetime(종료값)
4. IN 검색 (@search(in))
boardType: List<BoardType> @search(in)
categories: List<string> @search(in)
- Usage: 여러 값 중 하나라도 일치하는 검색
- 생성 쿼리:
WHERE boardType IN (:boardTypeList)
5. 대소비교 검색 (@search(gt), @search(lt), @search(gte), @search(lte))
price: double @search(gte) # 이상
maxPrice: double @search(lte) # 이하
minAge: int @search(gt) # 초과
score: double @search(lt) # 미만
- Usage: 숫자/날짜 대소 비교
- 생성 쿼리:
gte:WHERE price >= :pricelte:WHERE price <= :pricegt:WHERE price > :pricelt:WHERE price < :price
6. NULL 검색 (@search(null), @search(notnull))
description: string @search(null)
lastLogin: datetime @search(notnull)
- Usage: NULL 값 존재 여부 검색
7. 별칭 사용 및 조합
name: string @s(like) # @search와 동일
status: string @srch(eq) # @search와 동일
category: string @filter(in) # @search와 동일
8. 기본값 동작 (자동 선택)
title: string # 자동으로 @search(like) 적용
createDate: datetime # 자동으로 @search(between) 적용
status: StatusEnum # 자동으로 @search(eq) 적용
tags: List<string> # 자동으로 @search(in) 적용
9. 생성되는 SearchDTO 예시
# 원본 엔티티
entity:
Product:
meta: entity @expose(20)
fields:
productId: long @id @sequence
name: string(200)! @search(like)
price: double @search(between)
category: CategoryEnum @search(in)
createDate: datetime @search(between)
isActive: boolean @search(eq)
# 자동 생성되는 SearchDTO
dto:
ProductSearchDTO:
fields:
name: string # 부분 일치 검색
priceFrom: double # 가격 최소값
priceTo: double # 가격 최대값
createDateFrom: datetime # 생성일 시작
createDateTo: datetime # 생성일 종료
category: List<CategoryEnum> # 카테고리 다중 선택
isActive: boolean # 활성 상태
pageNumber: int # 기본값: 0
pageSize: int # 기본값: 20
sortCode: string # 정렬 필드
10. 검색 조건 조합 활용
entity:
Order:
meta: entity @expose(30)
fields:
orderNo: string(20) @search(eq) # 주문번호 정확 검색
customerName: string @search(like) # 고객명 부분 검색
orderDate: datetime @search(between) # 주문일 범위 검색
status: OrderStatus @search(in) # 상태 다중 선택
amount: double @search(gte) # 금액 이상 검색
isPaid: boolean @search(eq) # 결제여부 정확 검색
2.4 참조 어노테이션
@ref(fieldPath)
boardName: string @ref(board.name) # 단순 참조
boardTypeName: string @ref(board.boardType.name) # 중첩 참조
- Description: 다른 엔티티의 필드 참조
- Usage: DTO에서 관련 엔티티의 필드값 가져오기
@dtype(type)
articles: List<Article> @dtype(List<ArticleDTO>)
- Description: DTO 전환시 DTO에서 사용할 타입 명시
- Usage: 순환 참조 방지 및 타입 안전성
2.5 JPA 관계 어노테이션
@OneToMany
articles: List<Article> @dtype(List<ArticleDTO>) @OneToMany(mappedBy="board")
- Generated Code:
@OneToMany(mappedBy = "board")
@ManyToOne
board: Board @ManyToOne
- Generated Code:
@ManyToOne
@ManyToMany
roles: List<Role> @ManyToMany
users: List<User> @ManyToMany(mappedBy="roles")
- Generated Code:
@ManyToMany
@OneToOne
profile: UserProfile @OneToOne
- Generated Code:
@OneToOne
@Embedded
address: Address @Embedded
coordinates: Location @Embedded
- Description: JPA Embeddable 객체 임베딩
- Generated Code:
@Embedded - Example:
User:
fields:
personalInfo: PersonalInfo @Embedded
homeAddress: Address @Embedded
workAddress: Address @Embedded
@cascade(type)
parameters: List<ParamInfo> @ManyToMany @cascade(ALL)
parts: List<CarPart> @cascade(PERSIST)
- Types: ALL, PERSIST, MERGE, REMOVE
- Generated Code:
cascade = CascadeType.ALL
@relation(mappedBy="fieldName")
address: Address @relation(mappedBy="market_post_id")
- Description: 양방향 관계에서 주인이 아닌 쪽 지정
2.6 JPA 컬럼 매핑
@Column / @col / @db
postNo: string(5) @Column(name="post_no", length=5)
carYear: Integer @Column(name="car_year")
username: string @col(unique=true)
email: string @db(name="email_addr", length=100)
- Parameters:
name: 컬럼명length: 컬럼 길이unique: 유니크 제약조건nullable: NULL 허용 여부
- Default:
name: 필드명을 snake_case로 변환 (예: userName → user_name)length: 필드 타입에서 지정한 길이 또는 기본값unique:falsenullable:true
2.7 필드 검증 어노테이션
@pattern
email: string @pattern(regexp="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", message="유효한 이메일 주소를 입력하세요")
phoneNumber: string @pattern(regexp="^\\d{3}-\\d{4}-\\d{4}$", message="전화번호 형식은 000-0000-0000 입니다")
- Description: Bean Validation의
@Pattern어노테이션 자동 생성 - Parameters:
regexp: 정규식 패턴 (필수)message: 검증 실패 시 오류 메시지 (필수)
- 프레임워크 호환성: Jakarta/Javax 패키지 자동 선택 (env.yml의 j2ee 설정에 따름)
- 생성되는 Java 코드:
@javax.validation.constraints.Pattern(
regexp="^[a-zA-Z0-9_]{3,50}$",
msg="사용자명은 3-50자의 영문, 숫자, 언더스코어만 가능합니다"
)
private String username;
@min / @max - 숫자 범위 검증 및 Bean Validation 생성
age: int @min(18) @max(65)
salary: double @min(0) @max(1000000)
price: double @min(0.01) @max(999999.99)
quantity: int @min(0) @max(999999)
Description: 숫자 타입 필드의 값 범위를 제한하고 Bean Validation 어노테이션을 자동 생성
Parameters and Applicable Types:
- @min(값): 허용되는 최솟값 (포함)
- @max(값): 허용되는 최댓값 (포함)
- 적용 타입:
int,long,double,float,BigDecimal,BigInteger
Auto-generated Code:
@Min(18)
@Max(65)
private Integer age;
@DecimalMin("0")
@DecimalMax("1000000")
private BigDecimal salary;
@Size와의 구분:
- @min/@max: 숫자 값의 범위 제한 (예: 나이 18~65세)
- @minsize/@length: 문자열이나 컬렉션의 크기 제한 (예: 문자열 길이 3~50자)
2.9 커스텀 기능 어노테이션
@function.get
fullName: string @function.get("getFullName")
displayName: string @function.get("generateDisplayName")
- Description: 필드의 커스텀 Getter 메서드 지정
@function.set
password: string @function.set("setEncryptedPassword")
email: string @function.set("setNormalizedEmail")
- Description: 필드의 커스텀 Setter 메서드 지정
2.10 Spring Data JPA 감사 어노테이션
@jpa:CreatedDate
createDate: datetime @jpa:org.springframework.data.annotation.CreatedDate
- Generated Code:
@CreatedDate
@jpa:CreatedBy
createdBy: string(20) @jpa:org.springframework.data.annotation.CreatedBy
- Generated Code:
@CreatedBy
@jpa:LastModifiedDate
lastModifiedDate: datetime @jpa:org.springframework.data.annotation.LastModifiedDate
- Generated Code:
@LastModifiedDate
@jpa:LastModifiedBy
lastModifiedBy: string(20) @jpa:org.springframework.data.annotation.LastModifiedBy
- Generated Code:
@LastModifiedBy
2.11 감사 제외
@notaudited
temporaryData: string @notaudited
- Generated Code:
@NotAudited