@g1cloud/entity-modeler-next 5.2.20 → 5.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,6 +24,11 @@ export interface PDbAttr {
24
24
  updatable?: boolean;
25
25
  /** JPA @Column(insertable=…). undefined=기본 따름. v1 레거시엔 없는 신규 옵션. */
26
26
  insertable?: boolean;
27
+ /**
28
+ * JPA @Column(nullable=false) — **이 컬럼 하나의** NOT NULL. undefined=속성 축(`notNull`)을 따름.
29
+ * 논리 모델 `DbColumn.notNull` 직렬화(그 주석이 축의 정본). v1 레거시엔 없는 신규 옵션.
30
+ */
31
+ notNull?: boolean;
27
32
  /**
28
33
  * 공유 통화 컬럼(SHARED_REF) — 같은 엔터티 내 다른 컬럼 modelId 참조(read-only 투영, 물리 컬럼 0).
29
34
  * 논리 모델 DbColumn.sharedColumnRef 직렬화. FK 전파용 targetModelId와는 별개 개념. v1 레거시 없음.
@@ -154,6 +154,13 @@ export interface EmbeddableColumnOverride {
154
154
  insertable?: boolean;
155
155
  /** JPA @Column(updatable=). OWN 컬럼에만 저장(SHARED_REF는 타깃 파생). */
156
156
  updatable?: boolean;
157
+ /**
158
+ * JPA @Column(nullable=false) — **이 서브컬럼 하나의** NOT NULL. 미설정이면 속성 축(`notNull`)을 따른다.
159
+ * ★임베더블은 컬럼마다 제약이 갈릴 수 있고(실측: `ChangedBy` 의 type 컬럼만 `NOT NULL`) 속성 축 하나로는
160
+ * 그 비대칭을 담을 수 없다 — 그래서 서브컬럼 축이 있다(SoT=`core/types.ts` `DbColumn.notNull`).
161
+ * OWN 컬럼에만 저장(SHARED_REF는 타깃 파생).
162
+ */
163
+ notNull?: boolean;
157
164
  /**
158
165
  * SHARED_REF — 이 서브컬럼이 자체 물리 컬럼을 갖지 않고 같은 엔터티의 다른 컬럼(**물리명**)을 공유해
159
166
  * read-only 투영됨(대표: Money의 currency가 별도 스칼라 통화 컬럼 공유). 설정 시 resolver가 그 물리명을
@@ -89,6 +89,26 @@ export declare function resolveEffectiveColumn(attr: Attribute, col: DbColumn, i
89
89
  *
90
90
  * ⚠️판정은 **내용 유무**다(`??` 아님) — 빈 객체 `{}` 가 폴백을 조용히 막는 것을 피한다.
91
91
  */
92
+ /**
93
+ * **실효 NOT NULL** — 컬럼 축(`DbColumn.notNull`)이 설정돼 있으면 그것, 아니면 속성 축(`Attribute.notNull`).
94
+ *
95
+ * ★`effectiveLogicalName` 과 **같은 형상**이다 — 두 저장 자리를 한 값으로 접는 단일 출처이고 **컬럼이
96
+ * 이긴다**(더 구체적인 자리). 다른 점은 폴백 방향의 «원천»뿐이다: 논리명·타입·길이는 *선언원*(카탈로그·
97
+ * 임베더블·부모 PK)에서 상속하지만(`resolveEffectiveColumn`), NOT NULL 은 **자기 속성**에서 내려온다
98
+ * — 카탈로그 필드에 그 축이 없고(실물 `@Embeddable` 이 `nullable` 을 대개 지정하지 않는다) 제약의
99
+ * 소유자는 «사용처»이기 때문이다(같은 임베더블이 어떤 테이블에선 NOT NULL, 다른 곳에선 nullable).
100
+ *
101
+ * ⚠️판정은 `?? `(nullish)다 — 저장 라운드트립이 미설정을 `null` 로 바꾸므로 `!== undefined` 로 읽으면
102
+ * `null` 을 «false 설정»으로 오독한다(이 리포의 wire clear 규약: *「저장값 null 을 엄격 비교로 읽지 말 것」*).
103
+ *
104
+ * ★`identifier` 는 여기서 보지 않는다 — PK 는 소비처마다 다르게 다룬다(DDL 은 `NOT NULL` 을 생략하고
105
+ * PK 제약으로 표현, 코드젠은 `@Id` 를 낸다) ⇒ 그 판단을 이 함수로 끌어오면 두 소비처가 어긋난다.
106
+ */
107
+ export declare function effectiveNotNull(attr: {
108
+ notNull?: boolean;
109
+ }, col: {
110
+ notNull?: boolean;
111
+ } | undefined): boolean;
92
112
  export declare function effectiveEntityLogicalName(entity: {
93
113
  classLogicalName?: MultiLangText;
94
114
  table?: {
@@ -88,8 +88,30 @@ export declare function isJoinColumnOnlyFk(attr: Attribute, entity: Entity, anch
88
88
  * 둔 본래 이유)는 그대로다. id가 유일한 문서에서는 두 경로가 같은 속성을 찾아 **결과가 동일하다**.
89
89
  */
90
90
  export declare function resolveFkOriginColumn(attr: Attribute, childEntity: Entity | null | undefined, entities: readonly Entity[], associations: readonly Association[], i?: number): DbColumn | undefined;
91
+ /**
92
+ * **PK 멤버 술어 — 단일 출처**. 「이 속성이 엔티티의 식별자 멤버인가」를 한 곳에서 정한다.
93
+ *
94
+ * ★★**왜 여기 있나(2026-09-03)**: 같은 술어가 **세 곳에 복제**돼 있었고 `@EmbeddedId` 축(5.2.21)이
95
+ * 그중 하나(`scaffoldJava.pkMembers`)만 고쳐서 «축을 열었다» 고 보고됐다. 나머지 둘
96
+ * (`parentIdColumns` · `propagation.computeForeignAttributes`)이 여전히 임베더블 식별자를 못 봐,
97
+ * 값 타입 PK 로 전환하면 **부모가 「PK 0」으로 보이고 FK spec 이 통째로 사라졌다**(게이트 실측:
98
+ * `MemberPointWallet` 1→0 · `MemberCouponWallet` 2→0 · `UserAccount` **7→0**).
99
+ * ⇒ 술어를 여기(의존 leaf · 두 소비처가 이미 import)로 올려 **한 곳만 고치는 것이 구조적으로 불가능**하게 한다.
100
+ *
101
+ * ★멤버십: 스칼라(`NORMAL`) · 식별 FK(`RELATION_OWN`) · **임베더블 식별자**(`@EmbeddedId` — 값 타입을
102
+ * PK 로 쓰는 JPA 정식 관용구 · 실물 10자리). `dbAttrs` 가 없는 임베드(inverse nav 등)는 컬럼 기여가
103
+ * 없으므로 제외한다.
104
+ * ⚠️`DIVIDER`·`RELATION_REF` 는 `identifier` 가 참일 수 없거나 컬럼이 없어 자연히 빠진다.
105
+ */
106
+ export declare function isPkMemberAttr(attr: Attribute): boolean;
107
+ /**
108
+ * PK 멤버 중 **임베더블**(`@EmbeddedId` 방출 대상) — 코드젠이 `@Embedded` 대신 낼 표기를 가르는 판정.
109
+ * `isPkMemberAttr` 의 부분집합이고, 멤버십을 재기술하지 않도록 그쪽이 이 함수를 호출한다.
110
+ */
111
+ export declare function isEmbeddedPkAttr(attr: Attribute): boolean;
91
112
  /**
92
113
  * 부모 식별자 컬럼 평탄화(선언 순서) — 복합 PK 를 한 속성이 담는 **형상 A** 의 슬롯 원본.
93
114
  * `scaffoldJava.parentIdColumns` 와 같은 규칙이며 그쪽이 이 함수로 위임한다(산식 이중화 금지).
115
+ * 멤버십 판정은 **`isPkMemberAttr` 단일 출처**다(위 주석의 「세 곳 복제」 사고 이후).
94
116
  */
95
117
  export declare function parentIdColumns(parent: Entity | undefined): DbColumn[];
@@ -175,6 +175,26 @@ export interface DbColumn {
175
175
  updatable?: boolean;
176
176
  /** JPA @Column(insertable=…). undefined=기본 따름. v1 레거시엔 없는 신규 옵션. */
177
177
  insertable?: boolean;
178
+ /**
179
+ * JPA `@Column(nullable=false)` — **이 컬럼 하나의** NOT NULL. `undefined`(=미설정)면 속성 축
180
+ * (`Attribute.notNull`)을 따른다(`updatable`·`insertable` 과 같은 **inherit 3-상태**).
181
+ *
182
+ * ★**왜 컬럼 축이 필요한가**: `Attribute.notNull` 은 속성당 하나뿐인데 **한 속성이 N컬럼**인 자리
183
+ * (`EMBED_PREDEF`·`EMBED_OWN`)에서는 컬럼마다 제약이 갈릴 수 있다. 실측 계기 = `ChangedBy` 값 타입
184
+ * 병합 6엔티티(`ItemInventoryHistory`·`OfflineOrderHistory`·`Claim`·`ClaimHistory`·`OrderHistory`·
185
+ * `RefundChangeHist`) — **DDL 이 `changed_by_type_code` 를 `NOT NULL`, `changed_by_id` 를 nullable 로
186
+ * 확증**하는데 두 스칼라 속성을 하나로 병합하면 그 비대칭을 담을 데가 없어 **DB 로 확증된 제약이 사라졌다**.
187
+ *
188
+ * ★해소는 **`columnResolve.effectiveNotNull` 단일 출처**로만 읽는다 — 소비처가 넷이다(DDL `NOT NULL` ·
189
+ * 코드젠 `@Column(nullable=false)` · `CHK-TYPE-8`[nullable × 원시 타입] · 표시 배지). 이 모듈이 생긴
190
+ * 이유가 정확히 *「상속 해소가 소비처마다 제각각이어서 DDL 만 raw 를 읽었다」* 이므로 재기술 금지.
191
+ *
192
+ * ⚠️**op patch 에서 «평탄» 키로 오면 안 된다** — `notNull` 은 `DBATTR_FLAT_KEYS` 에 **넣지 않는다**.
193
+ * 그 집합은 평탄 키를 컬럼으로 내려보내는데(`resolver.ts`), `notNull` 은 이미 **속성 레벨 평탄 키**라
194
+ * 넣으면 기존 `attribute.update {notNull}` 이 조용히 컬럼으로 납치된다(두 축이 같은 이름을 쓰는 유일한
195
+ * 자리다). 컬럼 축은 **dotted `dbAttrs.<i>.notNull`** 또는 `embeddableOverrides[].notNull` 로만 쓴다.
196
+ */
197
+ notNull?: boolean;
178
198
  /**
179
199
  * 공유 통화 컬럼(SHARED_REF) — 이 컬럼이 자체 물리 컬럼을 갖지 않고 같은 엔터티의 다른 컬럼을
180
200
  * **modelId로 참조**해 그 물리 컬럼에 read-only 투영됨을 뜻한다(예: Money embeddable의 currency