DTO
@expose / @service 엔티티는 dto: 섹션 없이도 DTO(XxxDTO), 검색 DTO(XxxSrchDTO), 키 DTO 를 받습니다. 다른
모양이 필요할 때 DTO 를 선언합니다 - 참조 너머의 필드, 빼는 필드, 멤버 목록용 DTO(@dtype(List<OrderLineDTO>)).
model/dto.yml
dto:
OrderLineDTO:
meta: dto @template(OrderLine)
fields:
itemName: string @ref(item.name) # 응답에 품목 이름
ArticleDTO:
meta: dto @template(Article)
fields:
boardName: string @ref(board.name)
createDate: -- # 템플릿에서 뺌
ArticleSrchDTO:
meta: dto @searchable(entity=Article, pageSize=50)
fields:
title: string @search(like)
boardType: List<BoardType> @search(in) @ref(board.boardType)
createDateFrom: date @search(between)
createDateTo: date @search(between)
CustomDTO:
meta: dto
fields:
field1: string
field2: int
meta 어노테이션
| 어노테이션 | 뜻 |
|---|---|
@template(Entity) | 엔티티의 필드. 여러 개: @template(A, B). string(n) 은 @Size(max=n) 이 됨 |
@searchable(entity=E, pageSize=n) | Specification 으로 바뀌는 검색 DTO. pageNumber, pageSize, sortCode 가 더해짐 |
@sort(field+) | 이 검색 DTO 의 기본 정렬 (엔티티의 것보다 우선) |
@jsonview / @jsonview(auto) | Jackson @JsonView 로 생성·조회·수정별 필드 가시성 |
필드 어노테이션
| 어노테이션 | 뜻 |
|---|---|
@ref(field.path) | 참조 너머의 값 |
-- | 템플릿의 필드를 뺌 |
@view(cru) | @jsonview 가시성 (c = 생성, r = 조회, u = 수정) |
@readonly | 이 DTO 의 매핑은 이 필드를 엔티티에 쓰지 않음 |
! | 필수 - 직접 선언한 DTO 는 자기 필드에 적음 (postId: long! @ref(post.postId)) |
루트의 멤버
멤버를 요청·응답에 싣는 루트는 @dtype 으로 멤버 DTO 를 적고, 그 DTO 를 선언합니다:
PurchaseOrder:
fields:
lines: List<OrderLine> @OneToMany(mappedBy="order") @dtype(List<OrderLineDTO>) @minsize(1, 'the cart is empty')
dto:
OrderLineDTO:
meta: dto @template(OrderLine)
@dtype(...) 에 적었지만 어느 dto: 섹션도 선언하지 않은 DTO 는 생성할 때 unresolved type 'OrderLineDTO' 경고가 나고
compileJava 가 실패합니다 - 생성이 성공해도 컴파일까지 하세요.