Skip to content

Commit af289f0

Browse files
refactor: zod에서 effect로 스키마 라이브러리 변경 및 불필요한 의존성 제거
- zod 라이브러리를 effect로 변경하여 스키마 정의 및 검증 방식 수정 - package.json에서 zod 의존성 제거 - kakao 및 rcs 관련 모델의 스키마 정의 업데이트 - ReadonlyArray로 변경하여 불변성을 보장하는 코드 수정
1 parent 225407c commit af289f0

16 files changed

Lines changed: 287 additions & 447 deletions

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@
4141
},
4242
"dependencies": {
4343
"date-fns": "^4.1.0",
44-
"effect": "^3.16.5",
45-
"zod": "^3.25.57"
44+
"effect": "^3.16.5"
4645
},
4746
"devDependencies": {
4847
"@eslint/eslintrc": "^3",

src/models/base/kakao/kakaoAlimtalkTemplate.ts

Lines changed: 58 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import {z} from 'zod/v4';
21
import stringDateTransfer from '@lib/stringDateTrasnfer';
2+
import {Schema} from 'effect';
33
import {GetKakaoTemplateResponse} from '../../responses/kakao/getKakaoTemplateResponse';
44
import {
55
KakaoAlimtalkTemplateQuickReply,
@@ -21,12 +21,12 @@ export type KakaoAlimtalkTemplateCategory = KakaoChannelCategory;
2121
*/
2222
export type KakaoAlimtalkTemplateMessageType = 'BA' | 'EX' | 'AD' | 'MI';
2323

24-
export const kakaoAlimtalkTemplateMessageTypeSchema = z.enum([
24+
export const kakaoAlimtalkTemplateMessageTypeSchema = Schema.Literal(
2525
'BA',
2626
'EX',
2727
'AD',
2828
'MI',
29-
]);
29+
);
3030

3131
/**
3232
* @description 카카오 알림톡 템플릿 강조 유형<br>
@@ -38,22 +38,22 @@ export type KakaoAlimtalkTemplateEmphasizeType =
3838
| 'IMAGE'
3939
| 'ITEM_LIST';
4040

41-
export const kakaoAlimtalkTemplateEmphasizeTypeSchema = z.enum([
41+
export const kakaoAlimtalkTemplateEmphasizeTypeSchema = Schema.Literal(
4242
'NONE',
4343
'TEXT',
4444
'IMAGE',
4545
'ITEM_LIST',
46-
]);
46+
);
4747

4848
/**
4949
* @description 카카오 알림톡 템플릿 그룹 유형(기본값은 Channel)
5050
*/
5151
export type KakaoAlimtalkTemplateAssignType = 'CHANNEL' | 'GROUP';
5252

53-
export const kakaoAlimtalkTemplateAssignTypeSchema = z.enum([
53+
export const kakaoAlimtalkTemplateAssignTypeSchema = Schema.Literal(
5454
'CHANNEL',
5555
'GROUP',
56-
]);
56+
);
5757

5858
/**
5959
* @description 카카오 알림톡 템플릿 상태<br><br>
@@ -68,12 +68,12 @@ export type KakaoAlimtalkTemplateStatus =
6868
| 'APPROVED'
6969
| 'REJECTED';
7070

71-
export const kakaoAlimtalkTemplateStatusSchema = z.enum([
71+
export const kakaoAlimtalkTemplateStatusSchema = Schema.Literal(
7272
'PENDING',
7373
'INSPECTING',
7474
'APPROVED',
7575
'REJECTED',
76-
]);
76+
);
7777

7878
/**
7979
* @description 알림톡 템플릿 댓글 타입
@@ -85,11 +85,11 @@ export type KakaoAlimtalkTemplateCommentType = {
8585
dateCreated: string;
8686
};
8787

88-
export const kakaoAlimtalkTemplateCommentTypeSchema = z.object({
89-
isAdmin: z.boolean(),
90-
memberId: z.string(),
91-
content: z.string(),
92-
dateCreated: z.string(),
88+
export const kakaoAlimtalkTemplateCommentTypeSchema = Schema.Struct({
89+
isAdmin: Schema.Boolean,
90+
memberId: Schema.String,
91+
content: Schema.String,
92+
dateCreated: Schema.String,
9393
});
9494

9595
export type KakaoAlimtalkTemplateHighlightType = {
@@ -98,10 +98,10 @@ export type KakaoAlimtalkTemplateHighlightType = {
9898
imageId?: string | null;
9999
};
100100

101-
export const kakaoAlimtalkTemplateHighlightTypeSchema = z.object({
102-
title: z.string().nullable().optional(),
103-
description: z.string().nullable().optional(),
104-
imageId: z.string().nullable().optional(),
101+
export const kakaoAlimtalkTemplateHighlightTypeSchema = Schema.Struct({
102+
title: Schema.optional(Schema.NullOr(Schema.String)),
103+
description: Schema.optional(Schema.NullOr(Schema.String)),
104+
imageId: Schema.optional(Schema.NullOr(Schema.String)),
105105
});
106106

107107
export type KakaoAlimtalkTemplateItemType = {
@@ -115,94 +115,53 @@ export type KakaoAlimtalkTemplateItemType = {
115115
};
116116
};
117117

118-
export const kakaoAlimtalkTemplateItemTypeSchema = z.object({
119-
list: z.array(
120-
z.object({
121-
title: z.string(),
122-
description: z.string(),
118+
export const kakaoAlimtalkTemplateItemTypeSchema = Schema.Struct({
119+
list: Schema.Array(
120+
Schema.Struct({
121+
title: Schema.String,
122+
description: Schema.String,
123123
}),
124124
),
125-
summary: z.object({
126-
title: z.string().nullable().optional(),
127-
description: z.string().nullable().optional(),
125+
summary: Schema.Struct({
126+
title: Schema.optional(Schema.NullOr(Schema.String)),
127+
description: Schema.optional(Schema.NullOr(Schema.String)),
128128
}),
129129
});
130130

131-
export const kakaoAlimtalkTemplateSchema = z.object({
132-
name: z.string().describe('템플릿 제목'),
133-
channelId: z
134-
.string()
135-
.nullable()
136-
.optional()
137-
.describe('카카오 비즈니스 채널 ID'),
138-
channelGroupId: z
139-
.string()
140-
.nullable()
141-
.optional()
142-
.describe('카카오 비즈니스 채널 그룹 ID'),
143-
content: z.string().optional().describe('알림톡 템플릿 내용'),
144-
isHidden: z.boolean().optional().describe('알림톡 템플릿 숨김 여부'),
145-
messageType:
146-
kakaoAlimtalkTemplateMessageTypeSchema.describe(
147-
'알림톡 템플릿 메시지 유형',
148-
),
149-
emphasizeType: kakaoAlimtalkTemplateEmphasizeTypeSchema.describe('강조 유형'),
150-
extra: z.string().nullable().optional().describe('부가정보'),
151-
ad: z.string().nullable().optional().describe('간단 광고 문구'),
152-
emphasizeTitle: z
153-
.string()
154-
.nullable()
155-
.optional()
156-
.describe('강조표기 핵심문구'),
157-
emphasizeSubtitle: z
158-
.string()
159-
.nullable()
160-
.optional()
161-
.describe('강조표기 보조문구'),
162-
securityFlag: z.boolean().describe('PC 노출 여부'),
163-
imageId: z
164-
.string()
165-
.nullable()
166-
.optional()
167-
.describe('템플릿에 사용되는 이미지 ID'),
168-
assignType: kakaoAlimtalkTemplateAssignTypeSchema
169-
.optional()
170-
.describe('카카오 알림톡 템플릿 그룹 유형'),
171-
buttons: z
172-
.array(kakaoButtonSchema)
173-
.optional()
174-
.describe('카카오 알림톡 템플릿 버튼 목록'),
175-
comments: z
176-
.array(kakaoAlimtalkTemplateCommentTypeSchema)
177-
.optional()
178-
.describe('카카오 알림톡 템플릿 상태 현황목록'),
179-
commentable: z
180-
.boolean()
181-
.optional()
182-
.describe('의견을 남길 수 있는 템플릿 여부'),
183-
quickReplies: z
184-
.array(kakaoAlimtalkTemplateQuickReplySchema)
185-
.optional()
186-
.describe('바로가기 연결(링크) 목록'),
187-
header: z.string().nullable().optional().describe('아이템 리스트 용 헤더'),
188-
highlight: kakaoAlimtalkTemplateHighlightTypeSchema
189-
.optional()
190-
.describe('아이템 리스트용 하이라이트 정보 유형'),
191-
item: kakaoAlimtalkTemplateItemTypeSchema
192-
.optional()
193-
.describe('아이템 리스트 유형'),
194-
templateId: z.string().describe('카카오 알림톡 템플릿 ID'),
195-
code: z
196-
.string()
197-
.optional()
198-
.describe('긴급 검수를 위한 알림토 딜러사 측 템플릿 코드'),
199-
status:
200-
kakaoAlimtalkTemplateStatusSchema.describe('카카오 알림톡 템플릿 상태'),
201-
dateCreated: z.date().optional().describe('알림톡 템플릿 생성일자'),
202-
dateUpdated: z.date().optional().describe('알림톡 템플릿 수정일자'),
131+
export const kakaoAlimtalkTemplateSchema = Schema.Struct({
132+
name: Schema.String,
133+
channelId: Schema.optional(Schema.NullOr(Schema.String)),
134+
channelGroupId: Schema.optional(Schema.NullOr(Schema.String)),
135+
content: Schema.optional(Schema.String),
136+
isHidden: Schema.optional(Schema.Boolean),
137+
messageType: kakaoAlimtalkTemplateMessageTypeSchema,
138+
emphasizeType: kakaoAlimtalkTemplateEmphasizeTypeSchema,
139+
extra: Schema.optional(Schema.NullOr(Schema.String)),
140+
ad: Schema.optional(Schema.NullOr(Schema.String)),
141+
emphasizeTitle: Schema.optional(Schema.NullOr(Schema.String)),
142+
emphasizeSubtitle: Schema.optional(Schema.NullOr(Schema.String)),
143+
securityFlag: Schema.Boolean,
144+
imageId: Schema.optional(Schema.NullOr(Schema.String)),
145+
assignType: Schema.optional(kakaoAlimtalkTemplateAssignTypeSchema),
146+
buttons: Schema.optional(Schema.Array(kakaoButtonSchema)),
147+
comments: Schema.optional(
148+
Schema.Array(kakaoAlimtalkTemplateCommentTypeSchema),
149+
),
150+
commentable: Schema.optional(Schema.Boolean),
151+
quickReplies: Schema.optional(
152+
Schema.Array(kakaoAlimtalkTemplateQuickReplySchema),
153+
),
154+
header: Schema.optional(Schema.NullOr(Schema.String)),
155+
highlight: Schema.optional(kakaoAlimtalkTemplateHighlightTypeSchema),
156+
item: Schema.optional(kakaoAlimtalkTemplateItemTypeSchema),
157+
templateId: Schema.String,
158+
code: Schema.optional(Schema.String),
159+
status: kakaoAlimtalkTemplateStatusSchema,
160+
dateCreated: Schema.optional(Schema.Date),
161+
dateUpdated: Schema.optional(Schema.Date),
203162
});
204163

205-
export type KakaoAlimtalkTemplateSchema = z.infer<
164+
export type KakaoAlimtalkTemplateSchema = Schema.Schema.Type<
206165
typeof kakaoAlimtalkTemplateSchema
207166
>;
208167

src/models/base/kakao/kakaoAlimtalkTemplateQuickReply.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {z} from 'zod/v4';
1+
import {Schema} from 'effect';
22
import {KakaoButtonType} from './kakaoButton';
33

44
export type KakaoAlimtalkTemplateQuickReplyWebLink = {
@@ -33,31 +33,31 @@ export type KakaoAlimtalkTemplateQuickReply =
3333
| KakaoAlimtalkTemplateQuickReplyAppLink
3434
| KakaoAlimtalkTemplateQuickReplyDefault;
3535

36-
export const kakaoAlimtalkTemplateQuickReplyWebLinkSchema = z.object({
37-
name: z.string(),
38-
linkType: z.literal('WL'),
39-
linkMo: z.string(),
40-
linkPc: z.string().optional(),
36+
export const kakaoAlimtalkTemplateQuickReplyWebLinkSchema = Schema.Struct({
37+
name: Schema.String,
38+
linkType: Schema.Literal('WL'),
39+
linkMo: Schema.String,
40+
linkPc: Schema.optional(Schema.String),
4141
});
4242

43-
export const kakaoAlimtalkTemplateQuickReplyAppLinkSchema = z.object({
44-
name: z.string(),
45-
linkType: z.literal('AL'),
46-
linkAnd: z.string(),
47-
linkIos: z.string(),
43+
export const kakaoAlimtalkTemplateQuickReplyAppLinkSchema = Schema.Struct({
44+
name: Schema.String,
45+
linkType: Schema.Literal('AL'),
46+
linkAnd: Schema.String,
47+
linkIos: Schema.String,
4848
});
4949

50-
export const kakaoAlimtalkTemplateQuickReplyDefaultSchema = z.object({
51-
name: z.string(),
52-
linkType: z.enum(['BK', 'BT', 'BC']),
50+
export const kakaoAlimtalkTemplateQuickReplyDefaultSchema = Schema.Struct({
51+
name: Schema.String,
52+
linkType: Schema.Literal('BK', 'BT', 'BC'),
5353
});
5454

55-
export const kakaoAlimtalkTemplateQuickReplySchema = z.union([
55+
export const kakaoAlimtalkTemplateQuickReplySchema = Schema.Union(
5656
kakaoAlimtalkTemplateQuickReplyWebLinkSchema,
5757
kakaoAlimtalkTemplateQuickReplyAppLinkSchema,
5858
kakaoAlimtalkTemplateQuickReplyDefaultSchema,
59-
]);
59+
);
6060

61-
export type KakaoAlimtalkTemplateQuickReplySchema = z.infer<
61+
export type KakaoAlimtalkTemplateQuickReplySchema = Schema.Schema.Type<
6262
typeof kakaoAlimtalkTemplateQuickReplySchema
6363
>;

src/models/base/kakao/kakaoButton.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {z} from 'zod/v4';
1+
import {Schema} from 'effect';
22

33
/**
44
* @name "카카오 버튼타입"
@@ -42,29 +42,29 @@ export type KakaoDefaultButton = {
4242

4343
export type KakaoButton = KakaoWebButton | KakaoAppButton | KakaoDefaultButton;
4444

45-
export const kakaoWebButtonSchema = z.object({
46-
buttonName: z.string(),
47-
buttonType: z.literal('WL'),
48-
linkMo: z.string(),
49-
linkPc: z.string().optional(),
45+
export const kakaoWebButtonSchema = Schema.Struct({
46+
buttonName: Schema.String,
47+
buttonType: Schema.Literal('WL'),
48+
linkMo: Schema.String,
49+
linkPc: Schema.optional(Schema.String),
5050
});
5151

52-
export const kakaoAppButtonSchema = z.object({
53-
buttonName: z.string(),
54-
buttonType: z.literal('AL'),
55-
linkAnd: z.string(),
56-
linkIos: z.string(),
52+
export const kakaoAppButtonSchema = Schema.Struct({
53+
buttonName: Schema.String,
54+
buttonType: Schema.Literal('AL'),
55+
linkAnd: Schema.String,
56+
linkIos: Schema.String,
5757
});
5858

59-
export const kakaoDefaultButtonSchema = z.object({
60-
buttonName: z.string(),
61-
buttonType: z.enum(['BK', 'MD', 'DS', 'BC', 'BT', 'AC']),
59+
export const kakaoDefaultButtonSchema = Schema.Struct({
60+
buttonName: Schema.String,
61+
buttonType: Schema.Literal('BK', 'MD', 'DS', 'BC', 'BT', 'AC'),
6262
});
6363

64-
export const kakaoButtonSchema = z.union([
64+
export const kakaoButtonSchema = Schema.Union(
6565
kakaoWebButtonSchema,
6666
kakaoAppButtonSchema,
6767
kakaoDefaultButtonSchema,
68-
]);
68+
);
6969

70-
export type KakaoButtonSchema = z.infer<typeof kakaoButtonSchema>;
70+
export type KakaoButtonSchema = Schema.Schema.Type<typeof kakaoButtonSchema>;

0 commit comments

Comments
 (0)